找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2267|回复: 0
打印 上一主题 下一主题
收起左侧

第九届蓝桥杯单片机-彩灯控制器代码

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<STC15F2K60S2.H>
  2. #include<iic.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. sbit S7=P3^0;
  6. sbit S6=P3^1;
  7. sbit S5=P3^2;
  8. sbit S4=P3^3;

  9. u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6,0xff};//-  C  ff

  10. u8 mode=1;//mode运行模式切换
  11. u8 change=0;//change切换选择对象
  12. u16 count=0,time_g=700;//count用于定时,time_g时间间隔
  13. u8 Vaout=0;//电压
  14. u16 time=0,time2=0;//0.8秒闪烁计时
  15. u16 shan_time=0,shan_time2=0;
  16. u16 bright_count=0;//bright_count用于PWM计时
  17. u8 bright=10,lamp=0;//bright亮度  ,lamp亮度选择
  18. bit flat=0;//1 开启PWM , 0 关闭PWM
  19. bit twinkle=0;//0.8秒闪烁
  20. bit start=0;//启动LED标志位
  21. bit Bright_flat=0;//亮度调节标志位
  22. static u8 mode1_time=0,mode2_time=0,mode3_time=0,mode4_time=0;
  23. //EEPROM  AT24C02有256个字节,所以最大值为255,故缩小10倍

  24. void Smg(u8 wei,u8 duan);
  25. void Delayms(u16 ms);
  26. void Timer0Init();
  27. void Key_Scan();//独立按键
  28. void LED_Disply();//运行模式
  29. void Set_Disply();//设置状态
  30. void Bright_Display();//亮度调节
  31. void Tiem_interval();//时间间隔,优化所加

  32. void Init()//初始化
  33. {        
  34.         P2 = (P2 & 0X1f) | 0x80;//打开LED锁存
  35.         P0 = 0xff;                                                        //初始化
  36.         P2 = P2 & 0X1f;                                        //恢复锁存,避免影响其他位
  37.         
  38.         P2 = (P2 & 0X1f) | 0xa0;//打开蜂鸣器、继电器锁存
  39.         P0 = 0x00;
  40.         P2 = P2 & 0X1f;////恢复锁存,避免影响其他位
  41.         
  42.         P2 = (P2 & 0X1f) | 0xc0;//打开位选锁存
  43.         P0 = 0x00;
  44.         P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
  45.         
  46.         P2 = (P2 & 0X1f) | 0xe0;//打开段选锁存
  47.         P0 = 0xff;
  48.         P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
  49. }
  50. ////////////////////////////////////////////////////////
  51. void main()
  52. {               
  53. //        IIC_Write(0x00,00);
  54. //        IIC_Write(0x01,00);
  55. //        IIC_Write(0x02,00);
  56. //        IIC_Write(0x03,00);
  57.         
  58.           Init();
  59.                 Timer0Init();        
  60.                 mode1_time=IIC_Read(0x00);
  61.                 mode2_time=IIC_Read(0x01);
  62.                 mode3_time=IIC_Read(0x02);
  63.                 mode4_time=IIC_Read(0x03);
  64.          ADC_Init(0x03);//滑动变阻器        
  65.         while(1)
  66.         {
  67.     Key_Scan();   //独立按键               
  68.                 Set_Disply(); //设置状态
  69.     if(start==1)LED_Disply();//打开LED        
  70.         }
  71. }
  72. void Key_Scan()//独立按键
  73. {
  74.         if(S7==0)//LED启动/停止
  75.         {
  76.                 Delayms(5);               
  77.                 if(S7==0)
  78.                 {                        
  79.                         start=~start;                                
  80.                 }while(!S7);
  81.         }
  82.         //////////////////////////
  83.         if(S6==0)//设置状态
  84.         {
  85.                 Delayms(5);               
  86.                 if(S6==0)
  87.                 {
  88.                         change++;
  89.                         if(change==3) change=0;                                
  90.                 }while(!S6);
  91.         }
  92.         ////////////////////////////
  93.         if(S5==0)//加
  94.         {
  95.                 Delayms(5);               
  96.                 if(S5==0)
  97.                 {
  98.                 if(change==1)//LED运行模式
  99.                         {                                
  100.                                          mode++;        
  101.                                 if(mode>=4)mode=4;                        
  102.                         }
  103.                  if(change==2)//时间间隔
  104.                         {                                 
  105.                                                         time_g=time_g+10;
  106.                                                  if(time_g>=120)time_g=120;               
  107.                                 
  108.                                         if(mode==1)
  109.                                         {                        
  110.                                                  mode1_time=time_g;
  111.                                                 IIC_Write(0x00,mode1_time);//写入EEPROM
  112.                                         }else if(mode==2)
  113.                                         {
  114.                                                  mode2_time=time_g;
  115.                                                 IIC_Write(0x01,mode2_time);//写入EEPROM
  116.                                         }else if(mode==3)
  117.                                         {
  118.                                                  mode3_time=time_g;
  119.                                                 IIC_Write(0x02,mode3_time);        //写入EEPROM               
  120.                                         }else if(mode==4)
  121.                                         {
  122.                                                  mode4_time=time_g;
  123.                                          IIC_Write(0x03,mode4_time);//写入EEPROM
  124.                                         }         
  125.                         }                                
  126.                 }while(!S5);
  127.         }
  128. /////////////////////////////////////////////
  129.         if(S4==0)//减/亮度调节
  130.         {
  131.                 Delayms(5);               
  132.                 if(S4==0)
  133.                 {
  134.                         if(change==1)//运行模式
  135.                         {
  136.                                                 mode--;        
  137.                                                 if(mode==1)mode=1;
  138.                         }
  139.                         if(change==2)//时间间隔
  140.                         {                        
  141.                                                         time_g=time_g-10;
  142.                                                         if(time_g<=40)time_g=40;
  143.                                 
  144.                                         if(mode==1)
  145.                                         {                        
  146.                                                  mode1_time=time_g;
  147.                                                 IIC_Write(0x00,mode1_time);
  148.                                         }else if(mode==2)
  149.                                         {
  150.                                                  mode2_time=time_g;
  151.                                                 IIC_Write(0x01,mode2_time);
  152.                                         }else if(mode==3)
  153.                                         {
  154.                                                  mode3_time=time_g;
  155.                                                 IIC_Write(0x02,mode3_time);                        
  156.                                         }else if(mode==4)
  157.                                         {
  158.                                                  mode4_time=time_g;
  159.                                          IIC_Write(0x03,mode4_time);
  160.                                         }
  161.                         }
  162. //**************************************************
  163.                          if(change==0)//非“设置”状态下
  164.                                 {
  165.                                         Bright_Display();//亮度调节
  166.                                 }
  167. //////////////////////////////////////////////////               
  168.      }
  169.                 if(change==1|change==2)
  170.                    while(!S4);        
  171.         }
  172. }
  173. void Set_Disply()//设置状态
  174. {
  175.         if(change==0)//数码管熄灭
  176.         {           
  177.         }else if(change==1)
  178.         {
  179.                 if(mode==1)
  180.                 {                        
  181.                         time_g=mode1_time;                        
  182.                 }else if(mode==2)
  183.                 {
  184.                         time_g=mode2_time;        
  185.                 }else if(mode==3)
  186.                 {
  187.                         time_g=mode3_time;                        
  188.                 }else if(mode==4)
  189.                 {
  190.                   time_g=mode4_time;
  191.                 }
  192.                         Smg(0,10);               
  193.                         Smg(2,10);            
  194.             Smg(4,time_g/100);
  195.                         Smg(5,time_g%100/10);
  196.                         Smg(6,time_g%100%10);
  197.                         Smg(7,0);
  198.                         if(twinkle==1)//0.8s闪烁
  199.                           Smg(1,mode);
  200.                         if(twinkle==0)//0.8s闪烁
  201.                                 Smg(1,12);
  202. //*************************************************************
  203.         }else if(change==2)
  204.         {        
  205.                         Smg(0,10);
  206.                         Smg(1,mode);//运行模式
  207.                         Smg(2,10);                       
  208.                         if(twinkle==1)//0.8s闪烁
  209.                         {
  210.                                 Smg(4,time_g/100);
  211.                                 Smg(5,time_g%100/10);
  212.                                 Smg(6,time_g%100%10);
  213.                                 Smg(7,0);
  214.                         }
  215.                         if(twinkle==0)//0.8s闪烁
  216.                         {
  217.                                 Smg(4,12);//
  218.                                 Smg(5,12);//
  219.                                 Smg(6,12);//
  220.                                 Smg(7,12);//
  221.                         }
  222.         }
  223. }
  224. void Timer0Init()
  225. {
  226.         TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。0000 0001
  227.         TL0=(65535-1000)%256;//给定时器赋初值,定时1ms
  228.         TH0=(65535-1000)/256;
  229.         TR0=1;///打开定时器0中断允许
  230.         ET0=1;//打开定时器中断        
  231.         EA=1;//打开总中断        
  232. }
  233. void Bright_Display()//亮度调节
  234. {
  235.                 Vaout=ADC_Read();
  236.                 lamp=0.02*Vaout;//将0-255转换成显示0-5      5/255=0.02                        
  237. //        if(lamp==5)flat=0;//关闭定时
  238.         
  239.                 if(lamp==0)lamp=1;
  240.                 if(lamp==5)lamp=4;
  241.                                 Smg(6,10);        
  242.                                 Smg(7,lamp);               
  243.                         switch(lamp)
  244.                         {
  245.                                 case 1:                                                
  246.                                                         flat=1;//打开定时
  247.                                                         bright=2;
  248.                                                         break;
  249.                                 case 2:
  250.                                             flat=1;//打开定时
  251.                                                         bright=4;                                                
  252.                                                         break;                                
  253.                                 case 3:
  254.                                                         flat=1;//打开定时
  255.                                                         bright=6;
  256.                                                         break;                        
  257.                                 case 4:                        
  258.                                                         flat=1;//打开定时                                       
  259.                                                         bright=9;
  260.                                                         break;
  261.                         }        
  262. }
  263. void LED_Disply()//运行模式
  264. {        
  265. //一定要将模式放到定时器中断中的PWM里来运行并调节亮度,否则会与数码管冲突
  266.         
  267.                         if(mode==1)//模式1
  268.                         {                                       
  269.                                 P2=(P2&0X1F)|0X80;
  270.                                 P0=0XFE<<shan_time;
  271.                                 P2=P2&0X1F;
  272.                         }else if(mode==2)//模式2
  273.                         {               
  274.                                 P2=(P2&0X1F)|0X80;
  275.                                 P0=~(0XFE<<shan_time);
  276.                                 P2=P2&0X1F;                        
  277.                         }else if(mode==3)//模式3
  278.                         {
  279.                                 P2=(P2&0X1F)|0X80;
  280.                                 P0=~((0X80>>shan_time2)|(0X01<<shan_time2));
  281.                                 P2=P2&0X1F;                        
  282.                         }else if(mode==4)//模式4
  283.                         {        
  284.                                 P2=(P2&0X1F)|0X80;
  285.                                 P0=~((0X08>>shan_time2)|(0X10<<shan_time2));
  286.                                 P2=P2&0X1F;        
  287.                         }
  288. }
  289. void Timer() interrupt 1
  290. {        
  291.         TL0=(65535-1000)%256;///1ms
  292.         TH0=(65535-1000)/256;        
  293.          count++;
  294.          time++;
  295.          time2++;
  296. ////////////PWM调节亮度//////////////////////////////////        
  297.         if(flat==1)//关闭PWM定时
  298.         {
  299.                 bright_count++;
  300.         }else{
  301.                         bright_count=0;
  302.         }        
  303.                 if(bright_count==bright)//PWM
  304.                 {
  305.                                 P2 = (P2 & 0X1f) | 0x80;
  306.                                 P0 = 0xff;
  307.                                 P2 = P2 & 0X1f;                        
  308.                 }else if(bright_count==10)//1ms*10=10
  309.                 {
  310.                         LED_Disply();        //运行模式
  311.                         bright_count=0;
  312.                 }
  313. /////////////流转间隔////////////////////////////        
  314.                 if(mode==1)
  315.                 {               
  316.                         if(count==mode1_time*10)        Tiem_interval();////EEPROM  AT24C02有256个字节,所以最大值为255,扩大10倍  10*120=1200
  317.                 }else if(mode==2)
  318.                 {
  319.                         if(count==mode2_time*10)        Tiem_interval();                        
  320.           }else if(mode==3)
  321.                 {
  322.                                 if(count==mode3_time*10)        Tiem_interval();                                       
  323.                 }else if(mode==4)
  324.                 {
  325.                         if(count==mode4_time*10)        Tiem_interval();
  326.                 }
  327. //************** 闪烁时间**********************************        
  328.                 if(time==800)twinkle=1;                                                
  329.                 if(time2==1600)
  330.                 {               
  331.                         twinkle=0;
  332.                         time=0;
  333.                         time2=0;
  334.                 }
  335. }
  336. void Tiem_interval()//时间间隔
  337. {
  338.         shan_time++;
  339.                                          shan_time2++;
  340.                                 if(shan_time==8)
  341.                                 {
  342.                                  shan_time=0;
  343.                                 }
  344.                                 if(shan_time2==4)
  345.                                 {
  346.                                  shan_time2=0;
  347.                                 }               
  348.                                  count=0;        
  349. }
  350. void Smg(u8 wei,u8 duan)
  351. {
  352.         P2 = (P2 & 0X1f) | 0xe0;//消隐
  353.         P0=0XFF;
  354.         P2 = P2 & 0X1f;        
  355.         
  356.         P2 = (P2 & 0X1f) | 0xc0;//位选
  357.         P0 = 0x01<<wei;
  358.         P2 = P2 & 0X1f;
  359.         
  360.         P2 = (P2 & 0X1f) | 0xe0;//段选
  361.         P0=smgduan[duan];
  362.         Delayms(3);//***********延时够
  363.         P0=0XFF;
  364.         P2 = P2 & 0X1f;        
  365.         
  366.         P2 = (P2 & 0X1f) | 0xe0;//消隐
  367.         P0=0XFF;
  368.         P2 = P2 & 0X1f;        
  369. }

  370. void Delayms(u16 ms)
  371. {
  372.                 int i,j;
  373.                 for(i=0;i<ms;i++)
  374.                         for(j=845;j>0;j--);
  375. }


复制代码

全部资料51hei下载地址:
第九届蓝桥杯单片机-彩灯控制器代码.zip (807.35 KB, 下载次数: 28)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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