2025年3月26日 星期三 甲辰(龙)年 月廿五 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 单片机

基于STC89C52RC单片机的PWM呼吸灯

时间:08-17来源:大鱼号:小新实验室作者:点击数:82

1.设计思路

(1)使用两个定时器,T0用于PWM波翻转,T1用于调整占空比,均采用16位计时模式,因为51单片机在此模式下不能自动重装初值,因此需要在每一次触发中断后手动重装初值,为了不造成太大误差,重装初值程序需要写在中断最前面,PWM波占空比在5s内先由0%增加到100%,再逐渐减少到0%,为了保证呼吸灯呼吸均匀,决定每次以2.5%的增幅改变占空比,共改变80次;

(2)T0每25us中断一次,当累计中断80次(25×80=2000us,保证周期为2ms)时PWM波翻转;T1用于调整占空比,每12.5ms中断一次,当累计中断5次(12.5×5=62.5ms,5s/80=62.5ms)时改变占空比;

2.电路设计

(1)原理图

(2)PCB图

(3)3D模型图

 

 

3.程序源码

  • #include < reg52.h >
  • unsigned char XUNHUAN = 0;
  • unsigned char PWM_COUNT = 0;​​​​ //PWM翻转计时
  • unsigned int HUXI_COUNT = 0;​​​​​ //占空比调节计时
  • signed char PWM_VALUE = 2;​​​​​ //占空比比对值
  • unsigned char ljk = 0;​​​​​​​​ //控制占空比调整比对值direc_flag
  • bit direc_flag = 0;​​​​​​​​​​ //占空比调节比对值,0为增加,1为减少
  • sbit LED = P1 ^ 3;​​​​​​​​​​​ //定义呼吸灯接口
  • void timer0_init() {
  • TMOD = 0x11;
  • TH0 = (65536 - 46) / 256;
  • TL0 = (65536 - 46) % 256;
  • TH1 = (65536 - 11520) / 256;
  • TL1 = (65536 - 11520) % 256;
  • EA = 1;
  • ET0 = 1;
  • ET1 = 1;
  • TR1 = 1;
  • TR0 = 1;
  • PWM_COUNT = 0; //初始化定时器
  • }
  • void time0()​​​​​​​​​​interrupt 1 {
  • TH0 = (65536 - 46) / 256;
  • TL0 = (65536 - 46) % 256;
  • PWM_COUNT++;
  • if (PWM_COUNT == PWM_VALUE) {
  • LED = 1;
  • }
  • if (PWM_COUNT == 40) {
  • LED = 0;
  • PWM_COUNT = 0;
  • }
  • }
  • void time1()​​​​​​interrupt 3 {
  • TH1 = (65536 - 11520) / 256;
  • TL1 = (65536 - 11520) % 256;
  • HUXI_COUNT++;
  • }
  • void main() {
  • LED = 1;
  • while (1) {
  • XUNHUAN = 1;
  • if (HUXI_COUNT == 5 && direc_flag == 0) {
  • HUXI_COUNT = 0;
  • PWM_VALUE = PWM_VALUE + 2;
  • ljk++;
  • }
  • if (ljk == 40) direc_flag = 1;
  • if (HUXI_COUNT == 5 && direc_flag == 1) {
  • HUXI_COUNT = 0;
  • PWM_VALUE = PWM_VALUE - 2;
  • ljk++;
  • }
  • if (ljk == 80) {
  • direc_flag = 0;
  • ljk = 0;
  • PWM_VALUE = 2;
  • }
  • }
  • }

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门