找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2521|回复: 5
收起左侧

学习灯 5亮度PWM调光灯 一个数码管显示档位 单片机程序

  [复制链接]
ID:171111 发表于 2021-5-30 22:17 | 显示全部楼层 |阅读模式
前些天想做个PWM调光灯给大宝学习用 想着能在论坛里搜个现成的程序省点力气 因为我也是个初学者 编代码太费劲 结果没找到合适的 无奈自己研究好几天终于写出来了 大神们别笑话我啊 哈哈 特意拿出来分享给大家 里面注释很详细 想要的拿去不用谢^_^
过两天抽时间做出成品 到时再给大家分享图片

单片机源程序如下:
  1. #include "reg52.h"

  2. sbit PWMOUT=P2^0;         //PWM输出
  3. sbit Kjia=P3^0;             //按键 加
  4. sbit Kjian=P3^2;     //按键 减
  5. sbit K=P3^1;             //按键 开关机
  6. sbit ON_OFF=P2^7;    //开关机状态指示灯

  7. sbit LSA=P2^2;                 //普中开发板定义右边第一个数码管
  8. sbit LSB=P2^3;
  9. sbit LSC=P2^4;

  10. bit kaiguan = 0;         //开关机状态位
  11. unsigned int count=0,FLAG=0,stat;
  12. unsigned char cnt = 0;         // 档位变量
  13. //延时函数
  14. void DELAY(unsigned int t)
  15. {
  16.         while(t--);
  17. }
  18. //定时器 T0 初始化
  19. void init_T0(void)
  20. {
  21.     EA=1;
  22.     ET0=1;
  23.     IP=0x02;
  24.         TMOD=0x01;
  25.     TL0=(65535-100)%256;
  26.     TH0=(65535-100)/256;
  27.     TR0=1;
  28. }
  29. //按键扫描
  30. void scan_key(void)
  31. {
  32.     if(K==0)
  33.     {
  34.         DELAY(10000);
  35.         if(K==0)
  36.         {
  37.                         kaiguan=~kaiguan;
  38.                         ON_OFF=~ON_OFF;
  39.                         if(ON_OFF==1)
  40.                         {        //开机动画 HELLO
  41.                                 P0=0x76;                  //1  H
  42.                                 DELAY(50000);
  43.                                 P0=0x00;
  44.                                 DELAY(30000);
  45.                                 P0=0x79;                  //2  E
  46.                                 DELAY(50000);
  47.                                 P0=0x00;
  48.                                 DELAY(30000);          
  49.                                 P0=0x38;                  //3  L
  50.                                 DELAY(50000);
  51.                                 P0=0x00;
  52.                                 DELAY(30000);
  53.                                 P0=0x38;                  //4  L
  54.                                 DELAY(50000);
  55.                                 P0=0x00;
  56.                                 DELAY(30000);
  57.                                 P0=0x3f;                  //5  O
  58.                         }
  59.                         else
  60.                         {
  61.                                 P0=0x00;
  62.                         }
  63.                         while(!K);
  64.                 }
  65.     }
  66.         if(kaiguan==0)        // 关机
  67.         {
  68.                 cnt=0;
  69.                 TR0=0;
  70.         }
  71.         if(kaiguan==1) //开机
  72.         {
  73.                 if(Kjia==0)
  74.                 {
  75.                         DELAY(10000);
  76.                         if(Kjia==0)
  77.                         {
  78.                                 cnt=cnt+1;
  79.                                 if(cnt>=5)                //加到5后不变
  80.                                 {
  81.                                         cnt=5;
  82.                                 }
  83.                         }
  84.                 }
  85.                 if((Kjian==0)&&(cnt>1))
  86.                 {
  87.                         DELAY(10000);
  88.                         if(Kjian==0)
  89.                         {
  90.                                 cnt=cnt-1;                //减到1后不变
  91.                         }
  92.                 }                                                                                                                    
  93.         }
  94. // 档位选择
  95.         switch(cnt)
  96.         {
  97.                 case 0:
  98.                         TR0=0;PWMOUT=1;break;
  99.                 case 1:
  100.                         P0=0x06;TR0=1;FLAG=90;break;//FLAG = 90;亮度10%
  101.                 case 2:
  102.                         P0=0x5b;TR0=1;FLAG=70;break;
  103.                 case 3:
  104.                         P0=0x4f;TR0=1;FLAG=50;break;
  105.                 case 4:
  106.                         P0=0x66;TR0=1;FLAG=30;break;
  107.                 case 5:
  108.                         P0=0x6d;TR0=1;FLAG=10;break;//最亮
  109.         }                                  
  110. }
  111. //主函数
  112. void main()
  113. {
  114.         LSA=0;
  115.         LSB=0;
  116.         LSC=0;
  117.     init_T0();
  118.     PWMOUT=1;         //  开发板P2^0高电平 灯不亮 代表关机状态 实际应用改成 0
  119.         ON_OFF = 0;         //  关机
  120.         P0=0x00;
  121.         cnt=0;         
  122.     while(1)
  123.     {
  124.         scan_key();
  125.     }
  126. }
  127. // 定时器T0 中断函数
  128. void timer0() interrupt 1
  129. {
  130.     TL0=(65535-100)%256;
  131.     TH0=(65535-100)/256;      
  132.     if(count==FLAG)
  133.     {
  134.         PWMOUT=0;
  135.     }
  136.     count++;
  137.     if(count==100)
  138.     {   
  139.             count=0;
  140.         if(FLAG==0)
  141.         PWMOUT=0;
  142.         else
  143.         PWMOUT=1;
  144.     }
  145. }
复制代码

以上代码Keil工程51hei下载:
学习灯.rar (27.49 KB, 下载次数: 58)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:820198 发表于 2021-5-31 09:00 | 显示全部楼层
坐等成品学习
回复

使用道具 举报

ID:171111 发表于 2021-6-7 20:45 来自手机 | 显示全部楼层
灯还没做 用这个程序给大宝做了个3档调速小风扇 呵呵
回复

使用道具 举报

ID:229641 发表于 2021-6-7 23:29 来自手机 | 显示全部楼层
xuwei517 发表于 2021-6-7 20:45
灯还没做 用这个程序给大宝做了个3档调速小风扇 呵呵

有电路图吗?
回复

使用道具 举报

ID:939154 发表于 2021-6-25 15:00 | 显示全部楼层
有原理图吗
回复

使用道具 举报

ID:601544 发表于 2021-7-3 08:40 来自手机 | 显示全部楼层
不错,能有原理图就更好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表