找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2036|回复: 0
收起左侧

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

[复制链接]
ID:586435 发表于 2020-10-31 19:46 | 显示全部楼层 |阅读模式
第十届   

大多数人说  难点在NE555.
   其实仔细看过15的数据手册  应该就很清楚NE555用的是计数器0来开展计数的,所以难就难在他很新。
  其次就是DA的输出吧 。用到了 PCF8591寄存器的第7位,输出写入0x41  


其他就是逻辑问题了。总体不是多难。。。。。


代码自行下载  哈哈。

单片机源程序如下:
  1. #include "pcf8591.h"
  2. #include "smg.h"
  3. #include "timer.h"
  4. #include "type.h"
  5. #include "led.h"



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


  10. bit flag_S7 = 1;
  11. bit flag_S6 = 1;
  12. bit flag_S5 = 1;
  13. bit flag_S4 = 1;

  14. u32 F_count;        //频率计数值
  15. u32 F_count_buff;   //频率计数缓冲值
  16. u8 V_date;
  17. float V_date_buff;
  18. bit flag_50ms;

  19. void Init_MCU(void);
  20. void KeyScan(void);
  21. void DisplaySMG(void);

  22. void main(void)
  23. {
  24.     Init_MCU();
  25.     Init_Timer0();
  26.     Init_Timer1(5);    //定时器设置为5ms
  27.     while(1)
  28.     {
  29.                 if(flag_50ms) //电压数据刷新时间 50ms
  30.                 {
  31.                         flag_50ms = 0;

  32.                         if(flag_S5)
  33.                         {                                
  34.                                 V_date = 2*255/5;
  35.                                 Write_RB2();
  36.                         }
  37.                         else
  38.                         {
  39.                                 V_date = Read_RB2();
  40.                                 Write_RB2();
  41.                         }
  42.                         
  43.                 }
  44.         DisplaySMG();
  45.                 DisplayLED();
  46.                 KeyScan();
  47.     }
  48. }






  49. //-------------------------------------------
  50. //初始化外设
  51. //-------------------------------------------
  52. void Init_MCU(void)
  53. {
  54.     Select_573(4);
  55.     P0 = 0xFF;
  56.     Select_573(5);
  57.     P0 = 0x00;
  58.     Select_573(0);
  59.     P0 = 0xFF;
  60. }


  61. //-------------------------------------------
  62. //按键功能
  63. //-------------------------------------------
  64. void KeyScan(void)
  65. {
  66.     if(S7 == 0 || S6 == 0 || S5 == 0 || S4 == 0)
  67.     {
  68.         delay(200);
  69.         if(S7 == 0)   //数码管显示功能控制
  70.         {
  71.             flag_S7 = ~flag_S7;
  72.         }
  73.         while(!S7)
  74.         {
  75.             DisplaySMG();
  76.         }

  77.         if(S6 == 0)   //LED 指示灯功能控制
  78.         {
  79.             flag_S6 = ~flag_S6;

  80.         }
  81.         while(!S6)
  82.         {
  83.             DisplaySMG();
  84.         }

  85.         if(S5 == 0)   //输出模式切换
  86.         {
  87.                         flag_S5 = ~flag_S5;
  88.         } while(!S5)
  89.         {
  90.             DisplaySMG();
  91.         }

  92.         if(S4 == 0)          //显示界面切换
  93.         {
  94.             flag_S4 = ~flag_S4;
  95.         }
  96.         while(!S4)
  97.         {
  98.             DisplaySMG();
  99.         }
  100.     }
  101. }


  102. //-------------------------------------------
  103. //数码管显示函数
  104. //-------------------------------------------
  105. void DisplaySMG(void)
  106. {
  107.     if(!flag_S7)
  108.     {
  109.                 Select_573(6);
  110.         P0 = 0x00;
  111.                 Select_573(7);
  112.                 P0 = 0xFF;
  113.         Select_573(0);
  114.         
  115.     }
  116.     else
  117.     {
  118.         if(flag_S4)
  119.                 {
  120. //                        V_date = Read_RB2();
  121.                         V_date_buff = V_date;
  122.                         V_date_buff = (V_date_buff * 5.0) / 255 * 100;    //D/A值转换
  123.                         Dispaly_V_SMG((u16)V_date_buff);
  124.                 }
  125.             
  126.         else
  127.             Dispaly_F_SMG(F_count_buff);
  128.     }
  129. }


  130. //-------------------------------------------
  131. //中断服务函数
  132. //-------------------------------------------
  133. void InterruptTime0(void) interrupt 1
  134. {
  135.     F_count ++;
  136. }


  137. void InterruptTime1(void) interrupt 3
  138. {
  139.     static u8 t;
  140.     t++;
  141.         if(t % 10 == 0)
  142.                 flag_50ms = 1;
  143.             
  144.     if(t >= 20)          //频率数据刷新时间  100ms
  145.         {
  146.        F_count_buff = F_count * 10;
  147.            F_count = 0;
  148.            t = 0;
  149.         }
  150. }
复制代码

全部代码51hei下载地址:
第十届.zip (64.84 KB, 下载次数: 25)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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