您的位置 首页 观点

全能PWM子程序

#includeiom16v.h>#defineucharunsignedchar#defineuintunsignedint#defineOUTPORTAuinthigh;uinttatal;

#include

#define uchar unsigned char
#define uint unsigned int
#define OUT PORTA
uint high;
uint tatal;//界说位数所对应的满克度计数值
uchar data[5];//显现占空比
uchar data0[4];//显现频率
uchar keyadd,keysub;//界说按键
void output1(uint t);//处理占空比
void output2(void);//处理显现的频率
void add_sub(void);//加减函数
void DelayMs(uint i);//0.25ms
void display(uchar *p);//数码管扫描函数
/**************************************************************************/
void DelayMs(uint i)//0.25ms
{uchar j;
for(;i!=0;i–)
{for(j=250;j!=0;j–) {;}}
}
/*************************************************************************/
void display(uchar *p)//数码管扫描函数
{
OUT=0x70+p[0]; DelayMs(15);
OUT=0xb0+p[1]; DelayMs(15);
OUT=0xd0+p[2]; DelayMs(15);
OUT=0xe0+p[3]; DelayMs(15);
}
/*************往比较寄存器赋值*********************************************/
/*8位时计数值为255;9位时为512;10位时1024;*******************************/
void set(uint a)//完成双路,双路赋相同的值
{OCR1AH=a>>8;OCR1BH=a>>8;
OCR1AL=a&0x00ff;OCR1BL=a&0x00ff;
}
/*************************************************************************/
/*************************************************************************/
void output1(uint t)//处理占空比的显现//此处的t为数据寄存器所寄存的值
{uint counter;
unsigned long j;
j=(float)t*10000;
counter=j/tatal;
data[0]=counter/1000;
counter=counter%1000;
data[1]=counter/100;
counter=counter%100;
data[2]=counter/10;
data[3]=counter%10;
PORTB=0;
}
/*************************************************************************/
/*************************************************************************/
void output2(void)//处理显现的频率
{uint i=1,jk,k;//界说i为位数所对应要处理的值,,,界说jk为分频所对应的值
uint counter;
if((TCCR1A&0X03)==1)
{i=510;tatal=255;}
else if((TCCR1A&0X03)==2)
{i=1022;tatal=511;}
else if((TCCR1A&0X03)==3)
{i=2046;tatal=1023;}

if((TCCR1B&0x07)==5)
jk=1024;
else if((TCCR1B&0x07)==4)
jk=256;
else if((TCCR1B&0x07)==3)
jk=64;
else if((TCCR1B&0x07)==2)
jk=8;
else if((TCCR1B&0x07)==1)
jk=1;
counter=8000000/i;//挑选几位所对应的值//8000000对应该M晶振
counter=counter/jk;//挑选几分频
data0[0]=counter/1000;
counter=counter%1000;
data0[1]=counter/100;
counter=counter%100;
data0[2]=counter/10;
data0[3]=counter%10;
PORTB=0XFF;
}
/*************************************************************************/
/*********************按键电路********************************************/
void add_sub(void)
{//调理下面的例50的值可以改动每非必须加的值,也就增减速度;
while((PINC&0X01)==0) {keyadd=1;display(data);}
if(keyadd==1){high+=50;keyadd=0;}
while((PINC&0X02)==0) {keysub=1; display(data);}
if(keysub==1){high-=50;keysub=0;}
if(high>tatal)
high=tatal-1;
else if(high<51)
high=51;
}
/***********************************************************************/
/***********************************************************************/
void main(void)
{uchar i;
DDRD=0XFF;//当用运用PWM输出时,必顺要对其端口进行初使化
PORTD=0XFF;
DDRB=0XFF;//
PORTB=0XFF;
DDRC=0X00;//口作为键盘输入,
PORTC=0XFF;//初使化
DDRA=0XFF;
OUT=0X00;//IO口初使化;
DelayMs(150);
//TCCR1A=0XE3;//双路PWM
TCCR1A=0X82;//在OC1A脚输出 向上配匹时置位,向下匹配时清零 后二位为脉宽调制方法
//01:8位 10:9位 11:10位
TCCR1B=0X03;//001:1分频 010:8分频 011:64分频 100:256分频;101:1024分频
high=500;//高电平所占用时刻
output1(high);//处理占空比
output2();//处理频率
high=tatal/2;
/******************************************************/
while(1)
{
set(high);
output1(high);//处理占空比
for(i=100;i!=0;i–)
{display(data);add_sub();}//后为加减函数
output2();//处理频率
for( i=100;i!=0;i–)
{ display(data0);add_sub();}//后加减函数
}

/*1.因为C言语的问题(1)while((PINC&0X01)==0) {keyadd=1;display(data);}
if(keyadd==1){high+=50;keyadd=0;}
while((PINC&0X02)==0) {keysub=1; display(data);}
if(keysub==1){high-=50;keysub=0;}
上程序中有错吗?没有了,这是我调试的好的程序,但之前我是这样写的:while(PINC&0X01==0) {keyadd=1;display(data);}
if(keyadd==1){high+=50;keyadd=0;}
while(PINC&0X02==0) {keysub=1; display(data);}
if(keysub==1){high-=50;keysub=0;}
由此我误了半响时刻;——总归便是一个优先级的问题,许多理论能过的问题,但实践便是过不了;
2关于if else 的问题;————例如以下程序有问题吗;
if((TCCR1A&0X03)==1)
{i=510;tatal=255;}
else if((TCCR1A&0X03)==2)
{i=1022;tatal=511;}
else if((TCCR1A&0X03)==3)
{i=2046;tatal=1023;}

if((TCCR1B&0x07)==5)
jk=1024;
else if((TCCR1B&0x07)==4)
jk=256;
else if((TCCR1B&0x07)==3)
jk=64;
else if((TCCR1B&0x07)==2)
jk=8;
else if((TCCR1B&0x07)==1)
jk=1;
这程序我调试的程序;便是开端的时分中心多加了一else;怎样也出不来,便是这是两程序,也便是说当遇到一个履行条件时,下面的程序就不在履行了,不要像傻子相同在那死调程序,重要的可以找到问题的关健地点;
3.经调试验证,定时器的两PWM能一起运转;
4.便是在程序初使化时初使IO口;这一点也误了很长一段时刻;今后要谨记pwm作为输出时要初使IO口.*/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/266733.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部