如何利用51单片机输出PWM波[汇编]

上传人:粗**** 文档编号:138073899 上传时间:2020-07-13 格式:PDF 页数:15 大小:17.23KB
返回 下载 相关 举报
如何利用51单片机输出PWM波[汇编]_第1页
第1页 / 共15页
如何利用51单片机输出PWM波[汇编]_第2页
第2页 / 共15页
如何利用51单片机输出PWM波[汇编]_第3页
第3页 / 共15页
如何利用51单片机输出PWM波[汇编]_第4页
第4页 / 共15页
如何利用51单片机输出PWM波[汇编]_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《如何利用51单片机输出PWM波[汇编]》由会员分享,可在线阅读,更多相关《如何利用51单片机输出PWM波[汇编](15页珍藏版)》请在金锄头文库上搜索。

1、如何利用 51 单片机输出 PWM 波 1、理论知识 2、程序及分析 1、理论知识 PWM 这个功能在飞思卡尔、 STM32等高档的单片机内部有专用的模块,用 此类芯片实现 PWM 功能时只需要通过设置相应的寄存器就可实现周期和占空比 的控制。但是如果要用51 单片机的话,也是可以的,但是比较的麻烦。此时需 要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。 用两个定时器的方法是用定时器T0 来控制频率,定时器 T1 来控制占空比。 大致的的编程思路是这样的:T0定时器中断让一个I0 口输出高电平,在这个定 时器 T0 的中断当中起动定时器T1,而这个 T1 是让 IO口输出

2、低电平,这样改变 定时器 T0的初值就可以改变频率,改变定时器T1 的初值就可以改变占空比。 下面重点介绍用一个定时器的实现PWM 的方法。因为市面上的智能小车 所采用的电机大多数为TT减速电机,通过复杂的实验此电机最佳的工作频率为 1000HZ (太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms (1000HZ ) 进行举例,要产生其它频率的PWM 波,程序中只需作简单修改即可。 用一个定时器时(如定时器T0),首先你要确定 PWM 的周期 T和占空比 D, 确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n 次的 时间是 PWM 的高电平的时间,则D*T=n

3、*t,类似的可以求出PWM 低电平时间 需要多少个时间基准n。 因为这里我们是产生周期为1ms(1000HZ) 的 PWM,所以可设置中断的时间基 准为,,然后中断 100 次即为 1ms。在中断子程序内,可设置一个变量如time,在 中断子程序内, 有三条重要的语句 :1、当 time=100 时,time 清零(此语句保证频 率为 1000HZ),2、当 timen 时(n 应该在 0100 之间变化开 ),让单片相应的 I/O 口输出高电平,当timen 时,让单片相应的I/O 口输出低电平,此时占空比就 为%n。 2、程序 1,使单片机的 I/O 口输出固定频率的PWM 波 下面按上面

4、的思路给出一个具体程序: /*/ /* 程序名:单片机输出固定频率的PWM 波*/ /* 晶振: MHz CPU型号: STC89C52 */ /* 功能: P20口输出周期为 1ms(1000HZ), 占空比为 %80的 PWM 波*/ /*/ #include #define uint unsigned int #define uchar unsigned char sbit PWM1=P20;/接 IN1 控制正转 sbit PWM2=P21;/接 IN2 控制反转 uchar time; void main() TMOD=0 x01;/定时器 0 工作方式 1 TH0=0 xff;/(

5、65536-10)/256;/ 赋初值定时 TL0=0 xf7;/(65536-10)%256;/ EA=1;/开总中断 ET0=1;/开定时器 0中断 TR0=1;/启动定时器 0 while(1) void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=500;y0;y-); void tim0() interrupt 1 TR0=0;/赋初值时,关闭定时器 TH0=0 xff;/(65536-10)/256;/ 赋初值定时 TL0=0 xf7;/(65536-10)%256;/ TR0=1;/打开定时器 time+; if(time=100)

6、time=0;/1khz if(time=20) PWM1=0;/点空比 %80 else PWM1=1; PWM2=0; 程序说明: 1、关于频率的确定:对于晶振,PWM 输出频率为 1KHZ, 此时设定时器中 断一次,时中断次数100 次即为 1KHZ( *100=1ms ,即为 1000HZ)此时, 定时器 计数器赋初值为 TH0=FF,TL0=F7。 2、关于占空比的确定:此时我们将来time 的值从 0100 之间进行改变, 就可以将占空比从 %0%100之间进行变化,上面程序中time=20 时 PWM1=0; else PWM1=1;意思就是 %20的时间输出低电平, %80的时

7、间输出高电平, 即占空 比为%80。如需得到其它占空比,如%60,只需将 time 的值改为 40 即可。(程 序为 if(time=40) PWM1=0;else PWM1=1; ) 当然编写程序时也可以定义一个标志位如flag,根据 flag 的状态决定输出 高平还是低电平, 假设定义 flag=1的时候输出高电平, 用一个变量去记录定时器 中断的次数, 每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变 量的值是否到了n ,如果到了说明高电平的时间够了,那么就改变flag 为 0, 输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据 flag=0 的情况跳去判断

8、记录变量的值是否到了n 如果到了,说明 PWM 的低电平时间 够了,那么就改 flag=1,输出改高电平,同时记录次数变量清零,重新开始,如 此循环便可得到你想要的PWM 波形,这种方法我们这里不在举例,请自己去试 着书写。 3、程序 2,使用单片机 I/O 口输出 PWM 波,并能通过按键控制正反转 在程序中我们通常需要控制电机的正反转,如通过一个按键控制正反转, 此时我们也可以设置一个标志位如flag。在主程序中当按键每次被按下时,flag 相应取反。 然后在子程序中当flag 为 1 时,进行正转程序, 当 flag 为 0 时执行反 转程序。 下面的程序功能为单片机I/O 口 P20、

9、P21输出 1000HZ ,占空比为 %50, 并能过 P37按键控制正电机的正反转。 /*/ /* 程序名: PWM 直流电机调速*/ /* 晶振: MHz CPU型号: STC89C52 */ /* 功能:直流电机的PWM 波控制,可以通过按键控制正反转*/ /*/ #include #define uint unsigned int #define uchar unsigned char uchar time,count=50,flag=1;/ 低电平的占空比 sbit PWM1=P20;/PWM 通道 1,反转脉冲 sbit PWM2=P21;/PWM 通道 2,正转脉冲 sbit k

10、ey_turn=P37; /电机换向 /*函数声明 */ void delayxms(uint z); void Motor_turn(void); void timer0_init(void); /*主函数 */ void main(void) timer0_init(); while(1) Motor_turn(); /*延时处理 */ void delayxms(uint z)/延时 xms程序 uint x,y; for(y=z;x0;x-) for(y=110;y0;y-); /*电机正反向控制 */ void Motor_turn(void) if(key_turn=0) dela

11、yxms(2);/此处时间不能太长,否者会的中断产生冲突 if(key_turn=0) flag=flag; while(!key_turn); /*定时器 0 初始化 */ void timer0_init(void) TMOD=0 x01; /定时器 0 工作于方式 1 TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1; ET0=1; EA=1; /*定时 0 中断处理 */ void timer0_int(void) interrupt 1 TR0=0;/设置定时器初值期间,关闭定时器 TH0=(65536-10)/256; TL0=(65536

12、-10)%256; TR0=1; if(flag=1)/ 电机正转 PWM1=0; time+; if(time=100) time=0; else /电机反转 PWM2=0; time+; if(time=100) time=0; 4、程序 4、使单片机输出 PWM,并能控制正反转和实现调速 为了使大家彻底掌握此方面, 下面再给出一个复杂一点的程序,实现的功能 为通过一个按键控制正反转并通过另外两个按键使之可以在0 到 20 级之间调速 的程序。 /*/ /* 程序名: PWM 直流电机调速*/ /* 晶振: MHz CPU型号: STC89C52 */ /* 直流电机的 PWM 波控制,可

13、以通过按键控制正反转并在0 到 20 级之间调速 */ /*/ #include #define uint unsigned int #define uchar unsigned char uchar time,count=50,flag=1;/ 低电平的占空比 sbit PWM1=P20;/PWM 通道 1,反转脉冲 sbit PWM2=P21;/PWM 通道 2,正转脉冲 sbit key_add=P35;/电机加速 sbit key_dec=P36;/电机减速 sbit key_turn=P37;/ 电机换向 /*函数声明 */ void delayxms(uint z); void M

14、otor_turn(); void Motor_add(); void Motor_dec(); void timer0_init(); /*主函数 */ void main() timer0_init(); while(1) Motor_turn(); Motor_add(); Motor_dec(); /*延时处理 */ void delayxms(uint z)/延时 xms程序 uint x,y; for(y=z;x0;x-) for(y=110;y0;y-); /*电机正反向控制 */ void Motor_turn() if(key_turn=0) delayxms(2);/此处时间不能太长,否者会的中断产生冲突 if(k

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号