久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1306|回復: 0
打印 上一主題 下一主題
收起左側

單片機電子時鐘設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:499917 發表于 2019-3-28 15:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


單片機源程序如下:
  1. #include<stc15.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uint bdata key;                                        //定義變量,鍵狀態
  6. uint bdata edgk;                                //定義變量,鍵狀態變化前沿
  7. uchar data kcode;                                //定義變量,鍵編號
  8. sbit ESET=edgk^4;                                //重定義KC鍵為設置鍵(觸發型)
  9. sbit EINC=edgk^6;                                //定義K17鍵為加1鍵(觸發型)
  10. sbit EDEC=edgk^7;                                //定義K18鍵為減1鍵(觸發型)
  11. sbit SETK=key^4;                                //重定義KC鍵為設置鍵(開關型)
  12. sbit ALA=key^5;
  13. sbit ALARM=edgk^5;
  14. sbit EKF=edgk^7;
  15. sbit EKE=edgk^6;
  16. sbit K17=P3^2;
  17. sbit K18=P3^3;
  18. uchar data state;                                //定義變量,工作狀態
  19. uchar data timer;                                //定義變量,0.5秒計時器
  20. uchar data KeyOnTmr;                //定義變量,調整鍵長鍵計時
  21. uchar data Keytmr;
  22. uchar data hour=0x0c;                //定義變量,時變量,二進制
  23. uchar data min=0x00;                //定義變量,分變量,二進制
  24. uchar data sec=0x00;                //定義變量,秒變量,二進制
  25. uchar data set_num;                 //定義變量,當前調整位,0~"時"十位,3~"分"個位
  26. uchar data clock_flag;
  27. uchar beeftmr;
  28. uchar data ktmr;
  29. sbit BEEF=P2^7;
  30. sbit LED7=P1^7;                               
  31. sbit LED8=P1^6;

  32. sbit P_HC595_SER=P4^0;
  33. sbit P_HC595_RCLK=P5^4;
  34. sbit P_HC595_SRCLK=P4^3;
  35. uchar code SEG7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
  36. uchar code Scon_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  37. uchar data dis_buf[]={16,16,16,16,16,16,16,16};       
  38. uchar data alarm_clock[]={0,0,0,0,0,0,0,0};
  39. void Delay1ms(){
  40.         uchar i,j;
  41.         _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         i=11;
  45.         j=190;
  46.         do{
  47.                 while(--j);
  48.         }while(--i);
  49. }

  50. void F_Send_595(uchar x){
  51.         uchar i;
  52.         for(i=0;i<8;i++){
  53.                 x=x<<1;                          
  54.                 P_HC595_SER=CY;       
  55.                 P_HC595_SRCLK=1;
  56.                 P_HC595_SRCLK=0;
  57.         }
  58. }
  59. void display(void){
  60.         uchar i;
  61.         for(i=2;i<8;i++){
  62.                 F_Send_595(Scon_bit[i]);       
  63.                 if((state==1||state==2)&&i==set_num&&(sec&1)==1)
  64.                         F_Send_595(SEG7[16]);
  65.                 else
  66.                         F_Send_595(SEG7[dis_buf[i]]);
  67.                 P_HC595_RCLK=1;                               
  68.                 P_HC595_RCLK=0;                               
  69.                 //Delay1ms();
  70.         }
  71. }

  72. void readkey()                       
  73. {        uchar i;
  74.         P0=0x7f;                       
  75.         for(i=0;i<20;i++);       
  76.         edgk=(~P0<<4)&0xf0;       
  77.         P0=0xbf;                       
  78.         for(i=0;i<20;i++);
  79.         edgk|=(~P0)&0x0f;       
  80.         edgk<<=8;
  81.         P0=0xdf;                       
  82.         for(i=0;i<20;i++);
  83.         edgk|=(~P0<<4)&0xf0;
  84.         P0=0xef;                               
  85.         for(i=0;i<20;i++);
  86.         edgk|=(~P0)&0x0f;       
  87.         EKE=0;EKF=0;                                //放棄矩陣鍵盤的KE、KF鍵狀態
  88.         if(!K17)EKE=1;                        //K17鍵狀態存入edgk^6,或K17取代KE
  89.         if(!K18)EKF=1;                        //K18鍵狀態存入edgk^7,或K18取代KF

  90. }
  91. void keytrim()       
  92. {        uint temp;       
  93.         if(edgk==0)ktmr=0;               
  94.         else
  95.         {        if(ktmr<255)ktmr++;       
  96.                 if(ktmr<8)edgk=0;       
  97.         }
  98.         temp=edgk;       
  99.         edgk=(key^edgk)&edgk;       
  100.         key=temp;                               
  101.         if(edgk!=0)       
  102.         {        temp=edgk;                       
  103.                 for(kcode=0;(temp&0x1)==0;kcode++)temp>>=1;
  104.         }
  105.         else kcode=0x10;               
  106. }

  107. void keysound()       
  108. {        if(edgk!=0)beeftmr=40;       
  109.         if(beeftmr!=0){beeftmr--;BEEF=0;}
  110.         else BEEF=1;                                       
  111. }
  112. void Timer0Init(void)                //2500ms@11.0592MHz
  113. {
  114.         AUXR |= 0x80;       
  115.         TMOD &= 0xF0;       
  116.         TL0 = 0x00;       
  117.         TH0 = 0x94;               
  118.         TF0 = 0;       
  119.         TR0 = 1;       
  120. }

  121. void clock()                                                //時鐘走時函數
  122. {        timer++;                                                        //計時,500ms回0
  123.         if(timer>=200)                                //0.5秒到則
  124.         {        timer=0;sec++;                                                        //走秒
  125.                 if(sec>=120){sec=0;min++;}        //60秒到則秒回0、走分
  126.                 if(min>=60){min=0;hour++;}        //60分到則分回0、走時
  127.                 if(hour>=24)hour=0;                                        //24時到則時回0
  128.         }
  129. }

  130. void wrdisb()                                                                //設置顯示緩沖器函數
  131. {        dis_buf[2]=hour/10;                                //數碼左第1位顯示時"十"位
  132.         dis_buf[3]=hour%10;                                //數碼左第2位顯示時"個"位
  133.         dis_buf[4]=min/10;                                //數碼左第3位顯示分"十"位
  134.         dis_buf[5]=min%10;                                //數碼左第4位顯示分"個"位
  135.         dis_buf[6]=sec/20;
  136.         dis_buf[7]=(sec/2)%10;
  137. }

  138. void inputcheck()                                                //時分秒數值合理性檢查
  139. {
  140.         if(dis_buf[7]==255)dis_buf[7]=9;        //秒個位-1
  141.         if(dis_buf[7]==10)dis_buf[7]=0;                //秒個位+1
  142.         if(dis_buf[6]==255)dis_buf[6]=5;        //秒十位-1
  143.         if(dis_buf[6]==6)dis_buf[6]=0;                //秒十位+1
  144.         if(dis_buf[5]==255)dis_buf[5]=9;        //分個位由0減1則回9
  145.         if(dis_buf[5]==10)dis_buf[5]=0;                //分個位由9加1則回0
  146.         if(dis_buf[4]==255)dis_buf[4]=5;        //分十位由0減1則回5
  147.         if(dis_buf[4]==6)dis_buf[4]=0;                //分十位由5加1則回0
  148.         if(dis_buf[3]==255)                                                                //時個位由0減1則
  149.         {        if(dis_buf[2]==2)dis_buf[3]=3;        //如時十位為2則時個位為3
  150.                 else dis_buf[3]=9;                                                        //否則時個位為9
  151.         }
  152.         if(dis_buf[3]==10)dis_buf[3]=0;                //時個位由9加1則回0
  153.         if(dis_buf[2]==255)dis_buf[2]=2;        //時十位由0減1則回2
  154.         if(dis_buf[2]==2&&dis_buf[3]>=4)dis_buf[3]=0;        //時十位為2,個位超3則回0
  155.         if(dis_buf[2]==3)dis_buf[2]=0;                //時十位由2加1則回0
  156. }
  157. void compare(){
  158.         uchar i;
  159.         uchar flag=0;
  160.         for(i=2;i<8;i++){
  161.                 if(dis_buf[i]!=alarm_clock[i]){
  162.                         flag=1; break;
  163.                 }
  164.         }
  165.         if(!flag) clock_flag=0x01;
  166.         if(!LED7&&clock_flag==0x01){
  167.                 beeftmr=10;
  168.         }else
  169.                 beeftmr=0;
  170. }
  171. void gpio(){
  172.         P0M1=0; P0M0=0;
  173.         P1M1=0; P1M0=0;
  174.         P2M1=0; P2M0=0;
  175.         P3M1=0; P3M0=0;
  176.         P4M1=0; P4M0=0;
  177.         P5M1=0; P5M0=0;
  178. }
  179. void  main(void)
  180. {        uchar i;
  181.         BEEF=0;                                                                        //初始化,上電時P3.0(BEEF)為高電平
  182.         state=0;                                                                //默認待機態
  183.         set_num=2;
  184.         clock_flag=0x00;
  185.         Timer0Init();                                                //調用T0定時器初始化函數
  186.         gpio();
  187.         while(1)
  188.         {        while(!TF0);                                        //2.5mS定時未到則等待
  189.                 TF0=0;                                                                //清定時器溢出標志
  190.                 readkey();                                                //調用掃描鍵盤存鍵狀態函數
  191.                 display();                                                //調用顯示掃描函數
  192.                 keytrim();                                                //調用鍵狀態消抖等處理函數
  193.                 keysound();                                                //調用有鍵發出"嘀"聲響函數
  194.                 clock();                                                        //時鐘走時
  195.                 compare();
  196.                 switch(state)                                                                                                //根據狀態轉移
  197.                 {        case 0:                                                                                                                //時鐘顯示態
  198.                         {
  199.                                 LED8=1;
  200.                                 wrdisb();                                                                                                //顯示時分秒
  201.                                 if(clock_flag==0x01&&(ESET||EINC||EDEC||ALARM)) clock_flag=0x00;
  202.                                 if(!SETK)KeyOnTmr=0;                                                //無SETK則鍵計時器清0
  203.                                 else if(timer==0)KeyOnTmr++;                //有SETK則鍵計時(時基0.5秒)
  204.                                 if(KeyOnTmr==10)                                                                //判斷長鍵達5秒?
  205.                                 {        KeyOnTmr=0;state=1;set_num=2;        //長鍵計時復位,轉時間調整態
  206.                                 }
  207.                                 if(!ALA) Keytmr=0;
  208.                                 else if(timer==0)Keytmr++;
  209.                                 if(Keytmr==10){
  210.                                         Keytmr=0; state=2; set_num=2;
  211.                                 }
  212.                                 if(ALARM)LED7=!LED7;
  213.                                 break;
  214.                         }
  215.                         case 1:                                                                                                                //時間調整態
  216.                         {        LED8=0;                                                                                                //LED8指示常亮
  217.                                 if(ESET)                                                                                                //點按SET鍵則
  218.                                 {        set_num++;                                                                                //調整位后移
  219.                                         if(set_num==8)                                                                //4位都調整完則結束
  220.                                         {       
  221.                                                 min=dis_buf[4]*10+dis_buf[5];
  222.                                                 hour=dis_buf[2]*10+dis_buf[3];
  223.                                                 sec=dis_buf[6]*10+dis_buf[7];
  224.                                                 set_num=2;timer=0;state=0;        //轉時鐘顯示態
  225.                                         }
  226.                                 }
  227.                                 if(EINC)                                                                                                //點按加1鍵則調整位+1,檢查合理性
  228.                                 {        dis_buf[set_num]++;inputcheck();
  229.                                 }
  230.                                 if(EDEC)                                                                                                //點按減1鍵則調整位-1,檢查合理性
  231.                                 {        dis_buf[set_num]--;inputcheck();
  232.                                 }
  233.                                 break;
  234.                         }
  235.                         case 2:
  236.                         {
  237.                                 if(timer==0) LED8=!LED8;
  238.                                 if(ALARM)
  239.                                 {
  240.                                         set_num++;
  241.                                         if(set_num==6)
  242.                                         {
  243.                                                 for(i=2;i<6;i++)
  244.                                                         alarm_clock[i]=dis_buf[i];
  245.                                                 wrdisb();
  246.                                                 LED7=0;
  247.                                                 set_num=2; state=0;
  248.                                         }
  249.                                 }
  250.                                 if(EINC)                                                                                                //點按加1鍵則調整位+1,檢查合理性
  251.                                 {        dis_buf[set_num]++;inputcheck();
  252.                                 }
  253.                                 if(EDEC)                                                                                                //點按減1鍵則調整位-1,檢查合理性
  254.                                 {        dis_buf[set_num]--;inputcheck();
  255.                                 }
  256.                                 break;
  257.                         }       
  258.                 }
  259.         }
  260. }
復制代碼

所有資料51hei提供下載:
shiyan5.zip (72.78 KB, 下載次數: 14)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综网| 九九av| av网站在线看 | 成人做爰www免费看视频网站 | 国产精品久久久久久久午夜片 | 国产午夜av片 | 亚洲一区二区三区在线播放 | 日韩视频免费在线 | 欧美一区二区三区久久精品 | 亚洲欧美精品国产一级在线 | 国产日韩一区二区 | 一区二区免费在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 看片91| 亚洲精品中文字幕在线观看 | 中文字幕日韩欧美一区二区三区 | 成人精品一区亚洲午夜久久久 | 精品日韩一区 | 华丽的挑战在线观看 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 欧美电影一区 | 久久久精彩视频 | 91精品无人区卡一卡二卡三 | 欧美日韩一卡二卡 | 欧美精品一区三区 | 欧美国产视频 | 国产午夜精品久久久 | 99re视频在线 | av在线一区二区三区 | 欧美综合一区 | 亚欧精品一区 | 欧美日韩中文国产一区发布 | 中文字幕精品一区二区三区精品 | 亚洲第一网站 | 亚洲一区二区视频在线观看 | 免费在线观看91 | 第四色影音先锋 | 国内精品伊人久久久久网站 | 毛片一区二区三区 | 国产日韩一区 | 日韩中文字幕在线视频观看 |