第11届 蓝桥杯 单片机 省赛代码(第一场)

打印 上一主题 下一主题

主题 1502|帖子 1502|积分 4506

目录
一,标题
二,标题难点及分析
        1,固定的模块:
        2,改变的地方:
        3,我觉得的难点:
三,代码参考:
main.c
IIC.c
IIC.H
四,有不完美的地方,请见谅。 


一,标题




二,标题难点及分析

        1,固定的模块:

PCF8591和24C02模块,不懂的同砚可以去看看小蜜蜂的强化标题写一下:
   【备赛宝典】小蜜蜂老师关于蓝桥杯单片机大赛的独家教程及资源大汇总-小蜜蜂笔记
          2,改变的地方:

   与前面几届的标题差别的主要是按键变成了矩阵键盘,矩阵键盘我写的非常简单,比方S12,当行R4=0,别的’行列‘为1,只要C2=0时,S12就按键按下
       R4 = 0;
    R1 = R2= R3 = 1;
    C1 = C2 = C3 = C4 = 1;
    if (C2 == 0)                                                        // "S12"
    {
        Delay(100);
        if (C2 == 0)
      其他的根本上没有什么改变,不会的可以看看我的代码,或者找老师讨教。
        3,我觉得的难点:

         应该是判断Vpp < param(参数),计数器加1:

        我的想法是设置两个变量stat_volt开始电压和old_volt大于param的先前电压,只要满意(old_volt > param && param > SMG_volt),便可以加1。
三,代码参考:

main.c

  1. #include "STC15.H"
  2. #include "IIC.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.        
  6. sbit R1 = P3^0;
  7. sbit R2 = P3^1;
  8. sbit R3 = P3^2;
  9. sbit R4 = P3^3;
  10. sbit C1 = P3^4;
  11. sbit C2 = P3^5;
  12. sbit C3 = P4^2;
  13. sbit C4 = P4^4;
  14. uchar code SMG_NoDot[18]={0xc0,0xf9,
  15.     0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  16.     0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
  17. uchar code SMG_Dot[10]={0x40,0x79,
  18.     0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  19.                
  20. uint DAC_value = 0;
  21. float DAC_volt = 0;
  22. uint SMG_volt = 0;
  23.                
  24. uint param = 0;       
  25. uchar stat_led = 0xff;
  26. uchar count_v = 0;
  27. uchar mode = 3;
  28. uchar count = 0;
  29. uint stat_volt = 0;
  30. uint old_volt = 0;
  31. uchar dat_error = 0;
  32. uchar F_time = 0;
  33. uchar dat_24c02 = 0;
  34. void Delay(uint t)
  35. {
  36.         while(t--);
  37. }
  38. void Select_HC573(uchar n,uchar dat)
  39. {
  40.         P2 = (P2 & 0x1f) | 0x00;
  41.         P0 = dat;
  42.        
  43.         switch(n)
  44.         {
  45.                 case 4:
  46.                         P2 = (P2 & 0x1f) | 0x80;
  47.                 break;
  48.                 case 5:
  49.                         P2 = (P2 & 0x1f) | 0xa0;
  50.                 break;
  51.                 case 6:
  52.                         P2 = (P2 & 0x1f) | 0xc0;
  53.                 break;
  54.                 case 7:
  55.                         P2 = (P2 & 0x1f) | 0xe0;
  56.                 break;
  57.                 case 0:
  58.                         P2 = (P2 & 0x1f) | 0x00;
  59.                 break;
  60.         }
  61.         P2 = (P2 & 0x1f) | 0x00;
  62. }
  63. void Choose_SMG(uchar dat,uchar pos)
  64. {
  65.         Select_HC573(6,0x01 << pos);
  66.         Select_HC573(7,dat);
  67.        
  68.         Delay(500);
  69.        
  70.         Select_HC573(6,0x01 << pos);
  71.         Select_HC573(7,0xff);
  72. }
  73. void Display_SMG()
  74. {
  75.          switch(mode)
  76.          {
  77.                  case 1:
  78.                         Choose_SMG(0xc1,0);                                                                        //1100 0001  "U"
  79.                         Delay(100);
  80.                  
  81.                         Choose_SMG(SMG_Dot[SMG_volt / 100],5);
  82.                         Delay(100);
  83.                         Choose_SMG(SMG_NoDot[(SMG_volt / 10) % 10],6);
  84.                         Delay(100);
  85.                         Choose_SMG(SMG_NoDot[SMG_volt % 10],7);
  86.                         Delay(100);
  87.                  break;
  88.                  
  89.                  case 2:
  90.                         Choose_SMG(0x8C,0);                                                                        //1000 1100  "P"
  91.                         Delay(100);
  92.                  
  93.                         Choose_SMG(SMG_Dot[param / 100],5);
  94.                         Delay(100);
  95.                         Choose_SMG(SMG_NoDot[(param / 10) % 10],6);
  96.                         Delay(100);
  97.                         Choose_SMG(SMG_NoDot[param % 10],7);
  98.                         Delay(100);
  99.                  break;
  100.                  
  101.                  case 3:
  102.                         Choose_SMG(0xc8,0);                                                                        //1100 1000  "n"
  103.                         Delay(100);
  104.                  
  105.                         if(count_v > 9)
  106.                         {
  107.                                 Choose_SMG(SMG_NoDot[(count_v / 10) % 10],6);
  108.                         }
  109.                                 Delay(100);
  110.                        
  111.                                 Choose_SMG(SMG_NoDot[count_v % 10],7);
  112.                                 Delay(100);
  113.                  break;
  114.          }
  115. }
  116. void Init_Timer()
  117. {
  118.         TH0 = (65536 - 50000) / 256;
  119.         TL0 = (65536 - 50000) % 256;
  120.        
  121.         TMOD = 0x01;
  122.        
  123.         ET0 = 1;
  124.         TR0 = 1;
  125.         EA = 1;
  126. }
  127. void Service_Timer0() interrupt 1
  128. {
  129.         TH0 = (65536 - 50000) / 256;
  130.         TL0 = (65536 - 50000) % 256;
  131.        
  132.         if(stat_volt == 0)
  133.         {
  134.                 stat_volt = 1;
  135.                 old_volt = SMG_volt;
  136.         }
  137.         else
  138.         {
  139.     if (old_volt > param && param > SMG_volt)
  140.     {
  141.         count_v++;
  142.         if (count_v >= 100)
  143.         {
  144.             count_v = 0;
  145.         }
  146.        if(count_v % 2 == 0)
  147.                          {
  148.                                         stat_led |= 0x02;
  149.                                  Select_HC573(4,stat_led);
  150.                          }
  151.                          else
  152.                          {
  153.                                         stat_led &= ~0x02;
  154.                                  Select_HC573(4,stat_led);
  155.                          }
  156.                         }
  157.                 old_volt = SMG_volt;
  158.         }
  159.         if(F_time == 1)
  160.         {
  161.                 count++;
  162.                 if(count >= 100)
  163.                 {
  164.                         if(SMG_volt < param)
  165.                         {
  166.                                 stat_led &= ~0x01;
  167.                                 Select_HC573(4,stat_led);
  168.                                 F_time = 0;
  169.                         }
  170.                        
  171.                 }
  172.         }
  173. }
  174. void write_24c02(uchar addree,uchar dat)
  175. {
  176.         I2CStart();
  177.         I2CSendByte(0xa0);
  178.         I2CWaitAck();
  179.        
  180.         I2CSendByte(addree);
  181.         I2CWaitAck();
  182.        
  183.         I2CSendByte(dat);
  184.         I2CWaitAck();
  185.        
  186.         I2CStop();
  187. }
  188. uchar read_24c02(uchar addree)
  189. {
  190.         uchar tmp;
  191.        
  192.         I2CStart();
  193.         I2CSendByte(0xa0);
  194.         I2CWaitAck();
  195.        
  196.         I2CSendByte(addree);
  197.         I2CWaitAck();
  198.        
  199.         I2CStart();
  200.         I2CSendByte(0xa1);
  201.         I2CWaitAck();
  202.        
  203.         tmp = I2CReceiveByte();
  204.         I2CSendAck(1);
  205.         I2CStop();
  206.        
  207.         return tmp;
  208. }
  209. uchar Read_PCF8591_AIN()
  210. {
  211.         uchar tmp;
  212.         I2CStart();
  213.         I2CSendByte(0x90);
  214.         I2CWaitAck();
  215.        
  216.         I2CSendByte(0x03);
  217.         I2CWaitAck();
  218.        
  219.         Display_SMG();
  220.        
  221.         I2CStart();
  222.         I2CSendByte(0x91);
  223.         I2CWaitAck();
  224.        
  225.         tmp = I2CReceiveByte();
  226.         I2CSendAck(1);
  227.         I2CStop();
  228.        
  229.         return tmp;
  230. }
  231. void Vpp_work()
  232. {
  233.         uchar i;
  234.         for(i = 0;i < 3;i++)
  235.         {
  236.                 DAC_value += Read_PCF8591_AIN();
  237.         }
  238.         DAC_value = DAC_value / 3;
  239.        
  240.         DAC_volt = DAC_value * (5.0 / 255);
  241.         SMG_volt = DAC_volt * 100;
  242.        
  243.         if(SMG_volt < param)
  244.         {
  245.                 if(F_time == 0)
  246.                 {
  247.                         F_time = 1;
  248.                 }
  249.         }       
  250.         else
  251.         {
  252.                 F_time = 0;
  253.                 count = 0;
  254.                 stat_led |= 0x01;
  255.                 Select_HC573(4,stat_led);
  256.         }
  257.         Display_SMG();
  258.         Select_HC573(4,stat_led);
  259. }
  260. void Scan_keys()
  261. {
  262.         R4 = 0;
  263.         R1 = R2= R3 = 1;
  264.         C1 = C2 = C3 = C4 = 1;
  265.        
  266.         if(C2 == 0)                                                                                                                // "S12"
  267.         {
  268.                 Delay(100);
  269.                 if(C2 == 0)
  270.                 {
  271.                         dat_error = 0;
  272.                         if(mode == 3)
  273.                         {
  274.                                 mode = 1;
  275.                         }
  276.                         else if(mode == 1)
  277.                         {
  278.                                 mode = 2;
  279.                         }
  280.                         else if(mode == 2)
  281.                         {
  282.                                 mode = 3;
  283.                                 dat_24c02 = param / 10;
  284.                                 write_24c02(0x00,dat_24c02);
  285.                         }
  286.                         while(C2 == 0)
  287.                         {
  288.                                 Vpp_work();
  289.                         }
  290.                 }
  291.         }
  292.        
  293.         if(C1 == 0)                                                                                                                // "S16"
  294.         {
  295.                 Delay(100);
  296.                 if(C1 == 0)
  297.                 {
  298.                         if(mode == 2)
  299.                         {
  300.                                 dat_error = 0;
  301.                                 if(param < 500)
  302.                                 {
  303.                                         param = param + 50;
  304.                                 }
  305.                                 else
  306.                                 {
  307.                                         param = 0;
  308.                                 }
  309.                                
  310.                         }       
  311.                         else
  312.                         {
  313.                                 dat_error++;
  314.                         }
  315.                        
  316.                         while(C1 == 0)
  317.                         {
  318.                                 Vpp_work();
  319.                         }
  320.                 }
  321.         }
  322.         R3 = 0;
  323.         R1 = R2 = R4 = 1;
  324.         C1 = C2 = C3 = C4 = 1;
  325.        
  326.         if(C1 == 0)                                                                                                                // "S17"
  327.         {
  328.                 Delay(100);
  329.                 if(C1 == 0)
  330.                 {
  331.                         if(mode == 2)
  332.                         {
  333.                                 dat_error = 0;
  334.                                 if(param <= 500)
  335.                                 {
  336.                                         param = param - 50;
  337.                                 }
  338.                                 else
  339.                                 {
  340.                                         param = 500;
  341.                                 }
  342.                         }       
  343.                         else
  344.                         {
  345.                                 dat_error++;
  346.                         }
  347.                        
  348.                         while(C1 == 0)
  349.                         {
  350.                                 Vpp_work();
  351.                         }
  352.                 }
  353.         }
  354.         if(C2 == 0)                                                                                                        //"S13"
  355.         {
  356.                 Delay(100);
  357.                 if(C2 == 0)
  358.                 {
  359.                         if(mode == 3)
  360.                         {
  361.                                 dat_error = 0;
  362.                                 count_v = 0;
  363.                         }
  364.                         else
  365.                         {
  366.                                 dat_error++;
  367.                         }
  368.                        
  369.                         while(C2 == 0)
  370.                         {
  371.                                 Vpp_work();
  372.                         }
  373.                 }
  374.         }
  375.                
  376. }
  377. void key_err()
  378. {
  379.         if(dat_error >= 3)
  380.                         {
  381.                                 stat_led &= ~0x04;
  382.                                 Select_HC573(4,stat_led);
  383.                         }
  384.                         else
  385.                         {
  386.                                 stat_led |= 0x04;
  387.                                 Select_HC573(4,stat_led);
  388.                         }
  389. }
  390. void Init_System()
  391. {
  392.         Select_HC573(0,0x00);
  393.         Select_HC573(5,0x00);
  394.         Select_HC573(4,0xff);
  395.        
  396.         Select_HC573(6,0xff);
  397.         Select_HC573(7,0xff);
  398.        
  399.         dat_24c02 = read_24c02(0x00);
  400.         if(dat_24c02 > 500 || dat_24c02 % 5 != 0)
  401.         {
  402.                 dat_24c02 = 0;
  403.         }
  404.         param = dat_24c02 * 10;
  405. }
  406. void main()
  407. {
  408.         Init_System();
  409.         Init_Timer();
  410.         while(1)
  411.         {
  412.                 Scan_keys();
  413.                 Vpp_work();
  414.                 key_err();
  415.         }
  416. }
复制代码
IIC.c

  1. #include "STC15.H"
  2. #include "intrins.h"
  3. sbit sda = P2^1;
  4. sbit scl = P2^0;
  5. #define DELAY_TIME        5
  6. //
  7. static void I2C_Delay(unsigned char n)
  8. {
  9.     do
  10.     {
  11.         _nop_();_nop_();_nop_();_nop_();_nop_();
  12.         _nop_();_nop_();_nop_();_nop_();_nop_();
  13.         _nop_();_nop_();_nop_();_nop_();_nop_();               
  14.     }
  15.     while(n--);             
  16. }
  17. //
  18. void I2CStart(void)
  19. {
  20.     sda = 1;
  21.     scl = 1;
  22.         I2C_Delay(DELAY_TIME);
  23.     sda = 0;
  24.         I2C_Delay(DELAY_TIME);
  25.     scl = 0;   
  26. }
  27. //
  28. void I2CStop(void)
  29. {
  30.     sda = 0;
  31.     scl = 1;
  32.         I2C_Delay(DELAY_TIME);
  33.     sda = 1;
  34.         I2C_Delay(DELAY_TIME);
  35. }
  36. //
  37. void I2CSendByte(unsigned char byt)
  38. {
  39.     unsigned char i;
  40.        
  41.     for(i=0; i<8; i++){
  42.         scl = 0;
  43.                 I2C_Delay(DELAY_TIME);
  44.         if(byt & 0x80){
  45.             sda = 1;
  46.         }
  47.         else{
  48.             sda = 0;
  49.         }
  50.                 I2C_Delay(DELAY_TIME);
  51.         scl = 1;
  52.         byt <<= 1;
  53.                 I2C_Delay(DELAY_TIME);
  54.     }
  55.        
  56.     scl = 0;  
  57. }
  58. //
  59. unsigned char I2CReceiveByte(void)
  60. {
  61.         unsigned char da;
  62.         unsigned char i;
  63.         for(i=0;i<8;i++){   
  64.                 scl = 1;
  65.                 I2C_Delay(DELAY_TIME);
  66.                 da <<= 1;
  67.                 if(sda)
  68.                         da |= 0x01;
  69.                 scl = 0;
  70.                 I2C_Delay(DELAY_TIME);
  71.         }
  72.         return da;   
  73. }
  74. //
  75. unsigned char I2CWaitAck(void)
  76. {
  77.         unsigned char ackbit;
  78.        
  79.     scl = 1;
  80.         I2C_Delay(DELAY_TIME);
  81.     ackbit = sda;
  82.     scl = 0;
  83.         I2C_Delay(DELAY_TIME);
  84.        
  85.         return ackbit;
  86. }
  87. //
  88. void I2CSendAck(unsigned char ackbit)
  89. {
  90.     scl = 0;
  91.     sda = ackbit;
  92.         I2C_Delay(DELAY_TIME);
  93.     scl = 1;
  94.         I2C_Delay(DELAY_TIME);
  95.     scl = 0;
  96.         sda = 1;
  97.         I2C_Delay(DELAY_TIME);
  98. }
复制代码
IIC.H

  1. #ifndef IIC_H
  2. #define IIC_H
  3. void I2CStart(void);
  4. void I2CStop(void);
  5. void I2CSendByte(unsigned char byt);
  6. unsigned char I2CReceiveByte(void);
  7. unsigned char I2CWaitAck(void);
  8. void I2CSendAck(unsigned char ackbit);
  9. #endif
复制代码
四,有不完美的地方,请见谅。 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

小小小幸运

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表