找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝桥杯单片机组省赛源程序 第九届

[复制链接]
跳转到指定楼层
楼主
ID:586435 发表于 2020-10-31 19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
蓝桥杯省赛   第九届  
      
有需要自己下载吧   今天星期 有点时间   把文件上传一下   其他的就不多说了   

九届的题难点应该就在   LED延时方面吧
                                  其次就是在24C02的读写。连续写数据记着至少延迟1.8几ms好像,取2ms多次写就行。其他的没啥了

单片机源程序如下:
  1. #include "smg.h"
  2. #include "iic.h"
  3. #include "type.h"


  4. #define SYSCLOCK 11059200

  5. sbit S7 = P3^0;
  6. sbit S6 = P3^1;
  7. sbit S5 = P3^2;
  8. sbit S4 = P3^3;

  9. bit Led_flag = 1;                  //默认为正常无闪烁状态
  10. bit Star_End=0;                    //S7的2种模式
  11. u8 ledtimes[4] = {40,40,40,40};  //默认LED的流转时间
  12. u8 PWM_RB2;                        //LED占空比值
  13. u8 Set_mode = 3;                   //默认为数码管熄灭,S6的三种模式:1,2,3
  14. u8 Led_mode=1;                     //LED的四种模式:1,2,3,4
  15. u8 eepromaddder[4] = {0x01,0x02,0x03,0x04};     //24C02的写入和读取地址
  16. code u8 Led_Mode12[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};   //LED模式1,2
  17. code u8 Led_Mode34[4] = {0x7E,0xBD,0xDB,0xE7};  //LED模式3,4


  18. void Delay2ms();                //@12.000MHz
  19. void Init_MCU(void);
  20. u8 PCF8591_Levl(void);
  21. void Init_Time0(u8 ms);
  22. void KeyScan(void);
  23. void Display_SMG(void);




  24. void main(void)
  25. {
  26.         u8 i;
  27.         u8 rb_levl;
  28.         Init_MCU();
  29.         Init_Time0(1);   //1ms
  30.         ledtimes[0] = Read_24C02(0x01);
  31.         Delay2ms();
  32.         for(i=0;i>4;i++)
  33.         {
  34.                 ledtimes[i] = Read_24C02(eepromaddder[i]);
  35.                 Delay2ms();
  36.         }
  37.         while(1)
  38.         {
  39.                 rb_levl = PCF8591_Levl();
  40.                 KeyScan();
  41.                 Display_SMG();
  42.         }
  43. }


  44. //*===============按键函数=============*//
  45. void KeyScan(void)
  46. {
  47.         u8 temp;
  48.         if(S7 == 0)//S7
  49.         {
  50.                 delay(200);
  51.                 if(S7 == 0)
  52.                 {
  53.                         Star_End = ~Star_End;
  54.                 }while(!S7)
  55.                 {
  56.                         Display_SMG();
  57.                 }
  58.         }
  59.        
  60.         if(S6 == 0)//S6
  61.         {
  62.                 delay(200);
  63.                 if(S6 == 0)
  64.                 {
  65.                         Set_mode ++;
  66.                         if(Set_mode > 3) Set_mode = 1;               
  67.                 }while(!S6)
  68.                 {
  69.                         if(Set_mode == 3)
  70.                         {
  71.                                 switch(Led_mode)
  72.                                 {
  73.                                         case 1: Write_24C02(eepromaddder[0],ledtimes[0]); break;
  74.                                         case 2: Write_24C02(eepromaddder[1],ledtimes[1]); break;
  75.                                         case 3: Write_24C02(eepromaddder[2],ledtimes[2]); break;
  76.                                         case 4: Write_24C02(eepromaddder[3],ledtimes[3]); break;
  77.                                         default : break;
  78.                                 }
  79.                         }
  80.                         Display_SMG();
  81.                 }
  82.         }
  83.        
  84.         if(S5 == 0)//S5
  85.         {
  86.                 delay(200);
  87.                 if(S5 == 0)
  88.                 {
  89.                         if(Set_mode == 1)
  90.                         {
  91.                                 Led_mode ++;
  92.                                 if(Led_mode > 4)
  93.                                         Led_mode = 4;
  94.                         }
  95.                         else if(Set_mode == 2)
  96.                         {
  97.                                 ledtimes[Led_mode-1] += 10;
  98.                                 if(ledtimes[Led_mode-1] > 120)
  99.                                         ledtimes[Led_mode-1] = 120;
  100.                         }                       
  101.                 }while(!S5)
  102.                 {
  103.                         if(Set_mode == 1)
  104.                                 ledtimes[Led_mode-1] = Read_24C02(eepromaddder[Led_mode-1]);
  105.                         Display_SMG();
  106.                 }
  107.         }
  108.        
  109.     if(S4 == 0) //S4
  110.         {
  111.                 delay(200);
  112.                 if(S4 == 0)
  113.                 {
  114.                         if(Set_mode == 1)
  115.                         {
  116.                                 Led_mode --;
  117.                                 if(Led_mode  == 0)
  118.                                         Led_mode = 1;
  119.                         }
  120.                         else if(Set_mode == 2)
  121.                         {
  122.                                 ledtimes[Led_mode-1] -= 10;
  123.                                 if(ledtimes[Led_mode-1] < 40)
  124.                                         ledtimes[Led_mode-1] = 40;
  125.                         }       
  126.                 }while(!S4)
  127.                 {
  128.                         if(Set_mode == 1)
  129.                                 ledtimes[Led_mode-1] = Read_24C02(eepromaddder[Led_mode-1]);
  130.                         if(Set_mode == 3)  //非设置状态读取RB2电压等级
  131.                         {
  132.                                 temp = PCF8591_Levl();
  133.                                 Display_SMG_LedLevl(11,temp);
  134.                         }
  135.                         Display_SMG();
  136.                 }
  137.         }
  138. }

  139. //*===============数码管显示函数=============*//
  140. void Display_SMG(void)
  141. {
  142.         if(Set_mode == 3)  //数码管全部熄灭  
  143.         {
  144.                 Display_SMG_LedLevl(10,10);
  145.         }
  146.     else
  147.         {               
  148.                 switch(Led_mode)
  149.                 {
  150.                         case 1: Display_SMG_Setmode(1,ledtimes[Led_mode-1]*10); break;
  151.                         case 2: Display_SMG_Setmode(2,ledtimes[Led_mode-1]*10); break;
  152.                         case 3: Display_SMG_Setmode(3,ledtimes[Led_mode-1]*10); break;
  153.                         case 4: Display_SMG_Setmode(4,ledtimes[Led_mode-1]*10); break;
  154.                         default : break;
  155.                 }
  156.         }
  157. }

  158. //*===============初始化MCU=============*//
  159. void Init_MCU(void)
  160. {
  161.         Select_573(4);
  162.         P0 = 0xFF;       
  163.         Select_573(5);
  164.         P0 = 0x00;
  165.         Select_573(6);
  166.         P0 = 0x00;
  167.         Select_573(0);
  168. }

  169. //*===============RB2的电压等级==============*//
  170. u8 PCF8591_Levl(void)
  171. {
  172.         u8 levl;
  173.         u8 temp;
  174.         temp = Read_PCF8591(0x03);

  175.         switch(temp/64)
  176.         {
  177.                 case 0: levl = 1;PWM_RB2 = 2;break;
  178.                 case 1: levl = 2;PWM_RB2 = 4;break;
  179.                 case 2: levl = 3;PWM_RB2 = 6;break;
  180.                 case 3: levl = 4;PWM_RB2 = 8;break;
  181.                 default :break;
  182.         }
  183.        
  184.         return levl;
  185.        
  186. }

  187. //*===============初始化定时器0=============*//
  188. void Init_Time0(u8 ms)
  189. {
  190.         TMOD = TMOD & 0xF0;
  191.        
  192.         TH0 = (65536 - ms*SYSCLOCK/12/1000) / 256;
  193.         TL0 = (65536 - ms*SYSCLOCK/12/1000) % 256;
  194.        
  195.         TR0 = 1;
  196.         TF0 = 0;
  197.         ET0 = 1;
  198.         EA = 1;
  199. }

  200. //*===============中断响应函数=============*//
  201. //功能1:设置100HZ的PWM
  202. //功能2:设置的模式间隔0.8s闪烁
  203. //功能3:设置LED的流转
  204. //*========================================*//
  205. void InterruptTime0(void) interrupt 1   //中断:1ms
  206. {
  207.         static u8 i=0;
  208.         static u16 j=0;
  209.         static char cnt=0;
  210.         static u16 num=0;
  211.         static u8 buff; //定义一个缓冲变量,用来保存上次的Set_mode值
  212.        
  213.        
  214.        
  215.         if(Set_mode == 1 || Set_mode == 2)  //设置的模式闪烁
  216.         {
  217.                 j ++;
  218.                 if(j > 400)
  219.                 {
  220.                         j = 0;
  221.                         Led_flag = ~Led_flag;
  222.                 }
  223.         }
  224.        
  225.     if(Star_End)   //上电LED熄灭,需要S7打开LED流转
  226.         {               
  227.                 i++;num++;       
  228.                 if(i>10) i=1;    //100HZ无闪烁

  229.                 switch(Led_mode)
  230.                 {
  231.                         case 1: if(buff != 1) cnt = 0;
  232.                                         if(num > ledtimes[0]*10) { num = 0; cnt ++;}
  233.                                 if(cnt > 7) cnt = 0;
  234.                             break;
  235.                         case 2: if(buff != 2) cnt = 7;
  236.                                         if(num > ledtimes[1]*10) { num = 0; cnt --;}
  237.                                 if(cnt < 0) cnt = 7;
  238.                                 break;
  239.                         case 3: if(buff != 3) cnt = 0;
  240.                                         if(num > ledtimes[2]*10) { num = 0; cnt ++;}
  241.                                 if(cnt > 3) cnt = 0;
  242.                                 break;
  243.                         case 4: if(buff != 4) cnt = 0;
  244.                                         if(num > ledtimes[3]*10) { num = 0; cnt --;}
  245.                                 if(cnt < 0) cnt = 3;
  246.                                 break;
  247.                         default :
  248.                                 break;
  249.                 }
  250.                
  251.                 Select_573(0);
  252.                 if(i>=PWM_RB2)    //PWM调节亮度
  253.                 {
  254.                         Select_573(4);
  255.                         P0 = 0xFF;
  256.                         Select_573(0);
  257.                 }
  258.                 else
  259.                 {
  260.                         P0 = 0xFF;
  261.                         Select_573(4);                       
  262.                         if(Led_mode == 1 || Led_mode == 2)
  263.                                 P0 = Led_Mode12[cnt];
  264.                         else if(Led_mode == 3 || Led_mode == 4)
  265.                                 P0 = Led_Mode34[cnt];
  266.                         Select_573(0);
  267.                 }               
  268.         }
  269.         buff = Led_mode; //用做比较的缓冲变量,比较按键LED模式是否改变,
  270.                                          //若发生改变,则初始化LED闪烁状态       
  271. }




  272. void Delay2ms()                //@12.000MHz
  273. {
  274.         unsigned char i, j;

  275.         i = 24;
  276.         j = 85;
  277.         do
  278.         {
  279.                 while (--j);
  280.         } while (--i);
  281. }
复制代码

所有程序51hei提供下载:
第九届.zip (63.74 KB, 下载次数: 21)



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

使用道具 举报

沙发
ID:688122 发表于 2020-11-1 16:04 | 只看该作者
keil 5打开编译都不通过啊
回复

使用道具 举报

板凳
ID:586435 发表于 2020-11-2 13:03 | 只看该作者
dawangsun 发表于 2020-11-1 16:04
keil 5打开编译都不通过啊

是吗,我看看哈,放了一段时间,可能我发错文件了
回复

使用道具 举报

地板
ID:586435 发表于 2020-11-2 13:11 | 只看该作者
dawangsun 发表于 2020-11-1 16:04
keil 5打开编译都不通过啊

亲,我试过了 源码编译下载都没有问题,不知道你说的怎么回事
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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