標題: 第九屆藍橋杯單片機-彩燈控制器代碼 [打印本頁]

作者: 真得浪    時間: 2020-2-28 21:01
標題: 第九屆藍橋杯單片機-彩燈控制器代碼


單片機源程序如下:
  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 關(guān)閉PWM
  19. bit twinkle=0;//0.8秒閃爍
  20. bit start=0;//啟動LED標志位
  21. bit Bright_flat=0;//亮度調(diào)節(jié)標志位
  22. static u8 mode1_time=0,mode2_time=0,mode3_time=0,mode4_time=0;
  23. //EEPROM  AT24C02有256個字節(jié),所以最大值為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();//設(shè)置狀態(tài)
  30. void Bright_Display();//亮度調(diào)節(jié)
  31. void Tiem_interval();//時間間隔,優(yōu)化所加

  32. void Init()//初始化
  33. {        
  34.         P2 = (P2 & 0X1f) | 0x80;//打開LED鎖存
  35.         P0 = 0xff;                                                        //初始化
  36.         P2 = P2 & 0X1f;                                        //恢復(fù)鎖存,避免影響其他位
  37.         
  38.         P2 = (P2 & 0X1f) | 0xa0;//打開蜂鳴器、繼電器鎖存
  39.         P0 = 0x00;
  40.         P2 = P2 & 0X1f;////恢復(fù)鎖存,避免影響其他位
  41.         
  42.         P2 = (P2 & 0X1f) | 0xc0;//打開位選鎖存
  43.         P0 = 0x00;
  44.         P2 = P2 & 0X1f;//恢復(fù)鎖存,避免影響其他位
  45.         
  46.         P2 = (P2 & 0X1f) | 0xe0;//打開段選鎖存
  47.         P0 = 0xff;
  48.         P2 = P2 & 0X1f;//恢復(fù)鎖存,避免影響其他位
  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(); //設(shè)置狀態(tài)
  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)//設(shè)置狀態(tài)
  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)//減/亮度調(diào)節(jié)
  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)//非“設(shè)置”狀態(tài)下
  164.                                 {
  165.                                         Bright_Display();//亮度調(diào)節(jié)
  166.                                 }
  167. //////////////////////////////////////////////////               
  168.      }
  169.                 if(change==1|change==2)
  170.                    while(!S4);        
  171.         }
  172. }
  173. void Set_Disply()//設(shè)置狀態(tài)
  174. {
  175.         if(change==0)//數(shù)碼管熄滅
  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()//亮度調(diào)節(jié)
  234. {
  235.                 Vaout=ADC_Read();
  236.                 lamp=0.02*Vaout;//將0-255轉(zhuǎn)換成顯示0-5      5/255=0.02                        
  237. //        if(lamp==5)flat=0;//關(guān)閉定時
  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里來運行并調(diào)節(jié)亮度,否則會與數(shù)碼管沖突
  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調(diào)節(jié)亮度//////////////////////////////////        
  297.         if(flat==1)//關(guān)閉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. /////////////流轉(zhuǎn)間隔////////////////////////////        
  314.                 if(mode==1)
  315.                 {               
  316.                         if(count==mode1_time*10)        Tiem_interval();////EEPROM  AT24C02有256個字節(jié),所以最大值為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. }


復(fù)制代碼

全部資料51hei下載地址:
第九屆藍橋杯單片機-彩燈控制器代碼.zip (807.35 KB, 下載次數(shù): 28)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1