找回密码
 立即注册

QQ登录

只需一步,快速开始

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

第八届蓝桥杯程序,实现数码管1S的闪烁思路,以及全部单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:764920 发表于 2022-4-9 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "sysinit.h"
  2. #include "onewire.h"  //单总线函数库

  3. sbit key7=P3^0;
  4. sbit key6=P3^1;
  5. sbit key5=P3^2;
  6. sbit key4=P3^3;
  7. sbit led=P0^0;
  8. extern void HC138_chose(u8 channel);
  9. extern void display_a(struct time vaul,u8 one,u8 two,u8 three);
  10. extern void display_b();
  11. void naozhong_task();
  12. void key5_task();
  13. void key4_task();
  14. u8 shanshuo_flag[3]={1,1,1};
  15. u8 naozhong_start=0;//闹钟开始响
  16. void sys_init()//关闭蜂鸣器继电器,LED
  17. {      
  18.         HC138_chose(5);
  19.         P0=0XA0;
  20.         HC138_chose(4);
  21.         P0=0XFF;  
  22.         HC138_chose(0);       
  23. }

  24. void led_on()
  25. {
  26.         HC138_chose(4);
  27.         P0=0XFE;
  28.         HC138_chose(0);       
  29. }
  30. void led_off()
  31. {
  32.         HC138_chose(4);
  33.         P0=0XFF;
  34.         HC138_chose(0);       
  35. }
  36. void led_shan()
  37. {
  38.         HC138_chose(4);
  39.         P0|=0xFE;
  40.         led=~led;
  41.         //HC138_chose(0);       
  42. }
  43. void led_offf()
  44. {
  45.         HC138_chose(4);
  46.         P0|=0xFE;
  47.         led=1;
  48.         HC138_chose(0);       
  49. }
  50. void led_onn()
  51. {
  52.         HC138_chose(4);
  53.         P0|=0xFE;
  54.         led=0;
  55.         HC138_chose(0);       
  56. }
  57. void Timer0Init(void)                //50毫秒@11.0592MHz
  58. {
  59.         AUXR &= 0x7F;                //定时器时钟12T模式
  60.         TMOD &= 0xF0;                //设置定时器模式
  61.         TL0 = 0x00;                //设置定时初值
  62.         TH0 = 0x4C;                //设置定时初值
  63.         TF0 = 0;                //清除TF0标志
  64.         TR0 = 1;                //定时器0开始计时
  65.         EA=1;
  66.         ET0=1;
  67. }

  68. u8 key_scan(u8 mode)//哪个独立按键按下就显示哪个值
  69. {
  70.         static u8 key=1;
  71.         if(mode)key=1;
  72.         if((key4==0||key5==0||key6==0||key7==0)&&key==1)
  73.         {  
  74.                 Delay10ms();
  75.                 if(naozhong_start==1)
  76.                 {
  77.                         naozhong_start=0;//任意按键关闭闹钟
  78.                         led_offf();
  79.                         return 0;//按键退出闹钟闪烁模式
  80.                 }
  81.                 key=0;
  82.                 if(key4==0)return 4;
  83.                 else if(key5==0)return 5;
  84.                 else if(key6==0)return 6;
  85.                 else if(key7==0)return 7;
  86.         }
  87.         else if(key4==1&&key5==1&&key6==1&&key7==1)
  88.         {
  89.                 key=1;
  90.         }
  91.         return 0;
  92. }
  93. struct time vaul={23,59,50};
  94. struct time naozhong={0,0,0};

  95. bit one=1,two=1,three=1;//到哪一位
  96. u8 set_flag=0;//
  97. bit naozhong_set=0;//闹钟和正常显示切换
  98. bit wendu_flag;
  99. bit deng;
  100. unsigned char wendu_value=0;
  101. u8 wendu_ms=0;
  102. void main()
  103. {
  104.         u8 key_vaul=0;
  105.         sys_init();
  106.         Timer0Init();
  107.         wendu_value=rd_temperature();//不加这个会产生一个85;
  108.        
  109.         while(1)
  110.         {
  111.         //        display_b();
  112.                 if(naozhong_set)
  113.                 {
  114.                         display_a(naozhong,one,two,three);
  115.                 }else display_a(vaul,one,two,three);
  116.                 if(deng&&naozhong_start)
  117.                 {
  118.                         led_onn();
  119.                 }else if(deng==0&&naozhong_start)
  120.                 {
  121.                         led_offf();
  122.                 }
  123.           naozhong_task();
  124.                 key_vaul=key_scan(0);
  125.                 if(key_vaul==7)//时间模式
  126.                 {
  127.                         set_flag++;//移动表示哪一位在闪烁
  128.                         set_flag&=0x03;//限制在3以内
  129.                 }else if(key_vaul==6)
  130.                 {
  131.                         set_flag=0;
  132.                         naozhong_set=!naozhong_set;//选择当前模式
  133.                 }else if(key_vaul==5)//时间加
  134.                 {
  135.                   key5_task();
  136.                 }else if(key_vaul==4)
  137.                 {
  138.                   key4_task();
  139.                         if(set_flag==0)//温度显示的开关
  140.                         {
  141.                           while(!key4)
  142.                                 {
  143.                                         //EA=0;
  144.                                 //        Delay1ms();
  145.                                         display_b();
  146.                                         if(wendu_ms>=20)
  147.                                         {
  148.                                                 wendu_value=read_data();
  149.                                                 wendu_ms=0;
  150.                                         }
  151.                                 }
  152.                         //        EA=1;
  153.                         }
  154.                 }
  155.                
  156.         }
  157.        
  158. }

  159. void time_0() interrupt 1
  160. {
  161.         static u8 count=0,i=0;
  162.         count++;
  163.         wendu_ms++;
  164.         if(naozhong_start)
  165.         {
  166.                 i++;
  167.                 if(i%4==0)
  168.                 {
  169.                         deng=!deng;
  170.                         //led_shan();
  171.                 }
  172.                 if(i>100)
  173.                 {
  174.                         i=0;
  175.                         naozhong_start=0;
  176.                         led_offf();
  177.                 }
  178.         }
  179.         if(count>=20)
  180.         {
  181.                 count=0;
  182.                 switch(set_flag)
  183.                 {
  184.                         case 1:one=!one;two=1;three=1;break;
  185.                         case 2:two=!two;one=1;three=1;break;
  186.                         case 3:three=!three;one=1;two=1;break;
  187.                         default:one=1;two=1;three=1;break;
  188.                 }
  189.                 vaul.sec++;
  190.                 if(vaul.sec>=60)
  191.                 {
  192.                         vaul.sec=0;
  193.                         vaul.minute++;
  194.                         if(vaul.minute>=60)
  195.                         {
  196.                                 vaul.minute=0;
  197.                                 vaul.hour++;
  198.                                 if(vaul.hour>=24)vaul.hour=0;
  199.                         }
  200.                 }
  201.         }
  202. }

  203. void key5_task()
  204. {
  205.         if(naozhong_set)//时钟位
  206.         {
  207.                 if(set_flag==1)
  208.                 {
  209.                         naozhong.hour++;
  210.                         if(naozhong.hour>=24)naozhong.hour=0;
  211.                 }else if(set_flag==2)
  212.                 {
  213.                         naozhong.minute++;
  214.                         if(naozhong.minute>=60)naozhong.minute=0;
  215.                 }else if(set_flag==3)
  216.                 {
  217.                         naozhong.sec++;
  218.                         if(naozhong.sec>=60)naozhong.sec=0;
  219.                 }
  220.         }else //闹钟位
  221.         {
  222.                 if(set_flag==1)
  223.                 {
  224.                         vaul.hour++;
  225.                         if(vaul.hour>=24)vaul.hour=0;
  226.                 }else if(set_flag==2)
  227.                 {
  228.                         vaul.minute++;
  229.                         if(vaul.minute>=60)vaul.minute=0;
  230.                 }else if(set_flag==3)
  231.                 {
  232.                         vaul.sec++;
  233.                         if(vaul.sec>=60)vaul.sec=0;
  234.                 }
  235.         }
  236. }
  237. void key4_task()
  238. {
  239.         if(naozhong_set)//时钟位
  240.         {
  241.                 if(set_flag==1)
  242.                 {
  243.                         naozhong.hour--;
  244.                         if(naozhong.hour<0)naozhong.hour=23;
  245.                 }else if(set_flag==2)
  246.                 {
  247.                         naozhong.minute--;
  248.                         if(naozhong.minute<0)naozhong.minute=59;
  249.                 }else if(set_flag==3)
  250.                 {
  251.                         naozhong.sec--;
  252.                         if(naozhong.sec<0)naozhong.sec=59;
  253.                 }
  254.         }else //闹钟位
  255.         {
  256.                 if(set_flag==1)
  257.                 {
  258.                         vaul.hour--;
  259.                         if(vaul.hour<0)vaul.hour=23;
  260.                 }else if(set_flag==2)
  261.                 {
  262.                         vaul.minute--;
  263.                         if(vaul.minute<0)vaul.minute=59;
  264.                 }else if(set_flag==3)
  265.                 {
  266.                         vaul.sec--;
  267.                         if(vaul.sec<0)vaul.sec=59;
  268.                 }
  269.         }
  270. }

  271. void naozhong_task()
  272. {
  273.         if(naozhong.sec==vaul.sec&&naozhong.minute==vaul.minute&&naozhong.hour==vaul.hour)
  274.         {
  275.                 naozhong_start=1;
  276.         }
  277. }

复制代码

Keil代码下载: 新建文件夹.zip (70.87 KB, 下载次数: 10)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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