Pwm程序流程图_第1页
Pwm程序流程图_第2页
Pwm程序流程图_第3页
Pwm程序流程图_第4页
Pwm程序流程图_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Pwm程序流程图 首先我们要确定频率和占空比,我们选用12MHZ晶振,让PWM 输出频率为1KHZ, 让定时中断次数为C=100,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样可以设定占空比可从1-100 变化,即0.01ms*100=1ms。 TH0 和TL0 是计数器0 的高8 位和低8 位计数器,计算方法:TL0=(65536-C)%256;TH0=(65536-C)/256,其中C 为所要计数的次数;TMOD 是计数工作模式选择,TMOD=0X01表示选用模式1,它有16 位计数器,最大计数脉冲为65536,最长时间为65.536ms。系统初

2、始化占空比设定计数计数>=100PWM输出 开始 是否#include<REGX51.H>#define uchar unsigned?char#define V_TH0 0XFF#define V_TL0 0XF6#define V_TMOD 0X01 void init_sys(void);/*系统初始化函数*/void Delay5Ms(void); unsigned char click,ZKB1,ZKB2;void main(void)init_sys(); ZKB1=40;/*占空比初始值设定*/ZKB2=70;/*占空比初始值设定*/while(1) if(!P

3、10)/*如果按了+键,增加占空比*/ Delay5Ms();if(!P10)ZKB1+;ZKB2=100-ZKB1; if(!P11)/*如果按了-键,减少占空比*/Delay5Ms();if(!P11)ZKB1-; ZKB2=100-ZKB1; /*对占空比值限定范围*/ if (ZKB1>99) ZKB1=1; if (ZKB1<1) ZKB1=99; /*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/ void init_sys(void) /*系统初始化函数*/ /*定时器初始化*/ TMOD=V_TMOD; TH0=V_TH0; TL0=V_TL0; TR

4、0=1; ET0=1; EA=1; /*延时*/ void Delay5Ms(void) unsigned int TempCyc = 1000; while(TempCyc-); /*中断函数*/ void timer0(void) interrupt 1 using 2 TH0=V_TH0; /*恢复定时器初始值*/ TL0=V_TL0; +click; if (click>=100) click=0; if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/ P2=0xff; else P2=0x00;正反转void zhen

5、gzhuan()/*正转函数*/ p0.0=HA; p0.1=HB; p0.2=HC; switch(hall) case 0X05:p1=21H ;break pwm(); while(p0.2) case 0X04:p1= 22H ;break dop0.4=1;p0.5=1; case 0X06:p1= 0AH ;breakwhile(p1.1) case 0X02:p1= 0BH ;breakdop0.2=1;p0.3=1; case 0X03:p1= 14H ;break while(p1.1;p1.2) case 0X01:p1= 11H ;breakdop0.3=1;p0.4=1

6、; while(p1.0) dop0.0=1;p0.1=1; while(p1.0;p1.2) dop0.0=1;p0.5=1; while(p1.0;p1.1) dop0.1=1;p0.2=1; PWM=PHASE&&pwm(); void fanzhuan()/*反转函数*/ p1.0=HA; p1.1=HB; p1.2=HC; pwm(); while(p1.2) dop0.1=1;p0.2=1; while(p1.1) dop0.0=1;p0.5=1; while(p1.1;p1.2) dop0.0=1;p0.1=1; while(p1.0) dop0.3=1;p0.4

7、=1; while(p1.0;p1.2) dop0.2=1;p0.3=1; while(p1.0;p1.1) dop0.4=1;p0.5=1; PWM=PHASE&&pwm(); 主程序void main(void) TMOD=0x59; /*T1软件启动,T0软件+脉冲启动,T1计数器,T0定时器 T1工作在方式1,T0工作在方式1*/ TCON=0x20; TH1=0x00; TL1=0x00; TH0=0xD8; TL0=0xF0; IE=0x82; /*中断允许总控制,禁止T1中断*/ keyget();if(tag=1) start(); else stop(); 按

8、键查询KEYIN: MOV P2, 0FFH MOV A,P2 CJNE A,#0FFH,QUDOU LJMP RETURNQUDOU: MOV R3,A LCALL DELAY10 MOV A,P2 CJNE A,R3,RETURNKEY0: MOV C,P2.0 JC KEY1 LJMP PKEY0(启动)KEY1: MOV C,P2.1 JC KEY2 LJMP PKEY1(停止)KEY2: MOV C,P2.2 JC KEY3 LJMP PKEY2(正转)KEY3: MOV C,P2.3反转.KEY5: MOV C,P2.5 JC RETURN LJMP PKEY5(减速)RETURN

9、: RET过压过流K1 :MOV C,P1.2 JC K2 LJMP RETURNPkey1 K2:CLR P1.0 CLR P1.1 CLR P1.2SETB P1.3SETB P1.4SETB P1.5JMP GONGZUORETvoid stop() /*停止函数*/   P0=0;  P1=0;  P2=0;  TR0=0;  TR1=0; void keyget() /*键盘扫描函数*/ uchar x; /*定义变量*/ P2=0XC0 ; /*键盘扫描

10、,看是否有键按下*/ if(P2&0XC0)=0) /*有键按下*/ P2=0X80; /*P2.7置1,扫描第一行*/ if(P2&0X80)=0) /*第一行有键按下*/ d_ms(1500); /*延时去抖*/ x=P2; /*读P2口*/ else P2=0X40; /*P2.6 置1,扫描第二行*/ if(P2&0X40)=0) /*第二行有键按下*/ d_ms(1500); /*延时去抖*/ x=P2; /*读P2口*/ switch(x) case 0xA0: start();break; /*启动*/ case 0x90: up();break; /*向

11、上箭头*/ case 0x88: fanzhuan();break; /*反转*/ case 0x60: left();break; /*左移*/ case 0x50: down();break; /*向下箭头*/ case 0x48: right();break /*右移*/ 用MCS-51单片机成功产生PWM波的方法PWM 是“脉冲宽度调制”的意思。PWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。高电平与周期占用的时间之比,称为占空比,其值为01之间。PWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流

12、电机的转速,甚至还可以输出语音信号。新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。题目:AT89C52单片机输出可调 PWM 波。要求:1。单片机的晶振是12MHz,输出周期为1s。2。用两个开关控制占空比的增加和减少,分20等级。针对这个题目,做而论道设计了一个简单的实验电路:在 P2 口的 8 条线输出 PWM 波形;在 /INT1、/INT0 外接了两个按键,用来调整占空比;在 P0 口外接了两个 BCD 数码显示器,用来显示当

13、前的占空比的等级。实验的时候,可以使用示波器来观察 P2 口输出的波形。如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。/程序如下:/=#include<reg52.h>unsigned int a, b;/-void main()         TMOD = 0x01;               /T0定时方式1      

14、   TH0 = (65536-50000) / 256;   /50ms12MHz         TL0 = (65536-50000) % 256;         TR0 = 1;         ET0 = 1;         EX0 = 1; EX1 = 1;     

15、60;   IT0 = 1; IT1 = 1;         EA = 1;         a = 0;         b = 10;         while(1);/-void time0() interrupt 1         TL0 = (65536-5000

16、0) % 256;         TH0 = (65536-50000) / 256;   /50ms12MHz         a+;         if(a = 20) a = 0;         /在这里调整周期.         if(a < b) P2 =

17、0xff;      /在这里调整占空比.         else   P2 = 0x00;         P0 = (b / 10) << 4) + b % 10; /显示占空比等级/-void X0_INT() interrupt 0         b+;         if

18、(b > 19) b = 19;         /占空比等级最大为19/-void X1_INT() interrupt 2         b-;         if(b < 1) b = 1;             /占空比等级最小为1./=电路以及仿真效果如下图:用16产生了10K,50%占空比的PWM波,但是用按

19、键无法控制PWM的占空比#include<iom16v.h> #include<macros.h> #define uchar unsigned char #define uint unsigned int int num=50; /*延时函数*/void delay(uint MS) /约为1MS的延时函数 uint i,j; for(i=0;i<MS;i+) for(j=0;j<1141;j+); /1141是在8MHz晶振下为MS毫秒 /*PWM初始化*/void KPWM(void) DDRD = 0x30; /PD5,PD6输出PORTD = 0x

20、00; /不带上拉输出TCCR1A = 0xA3; /两路PWM,匹配清零TCCR1B = 0x19; /快速PWM模式,位数可调,预分频1 OCR1A=100; /频率为10K OCR1B=num; /匹配初值,占空比为50%左右 /*按键程序*/void key() DDRB=0x00; /PB口输入状态PORTB=0XFF; /PB口带上拉输入 if(PINB=0XFE) /如果PB0按下delay(10); /延时1毫秒,按键防抖if(PINB=0XFE) num=num+5; /比较值加5,即占空比增加5% if(num=90) /判断占空比是否到90% num=90; /占空比钳位

21、在90% while(PINB=0XFE); /按键释放程序if(PINB=0XFD) /如果PB1按下delay(10); /延时10毫秒,按键防抖if(PINB=0XFD) num=num-5; /比较值减5,即占空比减少5% if(num=10) /判断占空比是否到10% num=10; /占空比钳位在10% while(PINB=0XFD); /按键释放程序 /*主函数*/void main() while(1) KPWM(); /PWM产生函数 key(); /按键函数 void init_key()DDRD=0X00;PORTD=0XFF;void delay_ms(uint z)

22、uint x,y;for(x=z;x>0;x-)for(y=1140;y>0;y-);void keyscan(void )if(PIND&0x01)=0)while(!(PIND&0x01); /松手检测delay_ms(50);num+=5;if(num=255)num=0;if(PIND&0x02)=0)while(!(PIND&0x02);delay_ms(50);num-=5;if(num=0)num=255;if(PIND&0x08)=0)while(!(PIND&0x01);delay_ms(50);num=128;vo

23、id main(void)uchar wide;pwm0_init();init_key();while(1)OCR0=num;keyscan();16、 定时器0快速PWM模式 快速PWM可以的到比较高频率的PWM输出但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式计数器的上限值决定PWM的频率而比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为 PWM频率 = 系统时钟频率/分频系数*1+计数器上限值 快速PWM模式适合要求输出PWM频率较高但频率固定占空比调节精度要求不高的应用。 /*定时器0快速PWM模式由OC0输出PWM波 */ /*PWM频率 = 系统时钟

24、频率/分频系数*1+计数器上限值*/ /*本程序中频率=8000000/(8*(1+255)=3.91KHZ频率固定 */ /*占空比为OCR0/0XFF=OCR0/256,占空比可调 */ /*TCNT0从BOTTOM计数到MAX,然后回到BOTTOM重新开始;TCNT0计数到与OCR0相等时 OC0清零在BOTTOM时置位1 */ #include <iom128v.h> #include<macros.h> #define uint unsigned int #define uchar unsigned char volatile uchar num; void pwm0_init(void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论