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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的電子鐘仿真程序(7個功能,具體功能見帖內介紹)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:750420 發表于 2021-12-13 14:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大一時候做的單片機設計,在b站錄了視頻進行相應的介紹(BV1mJ411L7Ek)很多朋友一直想要但是以前的代碼水平并不咋地(怕放出來丟人)也就一直沒有開源,之后有時間會用狀態機+時間片輪的思想進行重構給朋友們進行對比學習,這次就先給各位放出來了

基本的時間與溫度顯示功能/時間校準/鬧鐘功能/秒表(開始、暫停、繼續,記錄一個秒表時間,秒表進行清零,長按顯示記錄的秒表時間)/倒計時(開始、暫停、繼續,重新倒計時,倒計時清零)/12/24時顯示選擇
因為各種中斷的原因,這個電子鐘本身去記錄時間的功能已經被破壞掉了,后續應該可以在增加變量,去記錄所經歷的中斷數,對于基礎時鐘的時間進行補償,使其達到更加精準的效果。(不過那樣又是得花費很多時間去計算所占用的時間啊什么的,實在是肝不動了)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<absacc.h>
  3. #include<stdio.h>
  4. #include<intrins.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. #define out P0
  8. sbit RS=P2^0;
  9. sbit RW=P2^1;
  10. sbit E=P2^2;
  11. sbit ctime=P3^2;//外部中斷0,時間校準
  12. sbit s_alarm=P3^3;//外部中斷1,鬧鐘設定
  13. sbit LED=P1^2;//低電平點亮
  14. sbit P2_4=P1^1;//24時12時標記位,實在沒辦法了,data區已經用完了
  15. //五個按鍵低電平有效,上下左右 確認 1234 0

  16. void lcd_initial(void);
  17. void lcd_initial2(void);
  18. void check_busy(void);
  19. void write_command(uchar com);
  20. void write_data(uchar dat);
  21. void string(uchar ad,uchar*s);
  22. void delay(uint);
  23. int read_keys(void);
  24. void c_string(uchar ad,uchar *s);
  25. void s_string(uchar ad,uchar s);
  26. void write_time(void);
  27. void inter_init(void);
  28. void base_time(void);
  29. void C_time(void);
  30. void alarm(void);
  31. void stopwatch(void);
  32. void countdown(void);
  33. void c_down(void);
  34. void t24_12(void);

  35. struct xwei
  36. {
  37.         uchar x_address;//顯示屏的地址
  38.         uchar* zhi;//指向傳遞值的指針
  39. }wei[2][7];

  40. struct zwei
  41. {
  42.         uchar x_address;//顯示屏的地址
  43.         uchar zhi;//存儲值
  44. };

  45. uchar code mdays[12]={31,29,31,30,31,30,31,31,30,31,30,31};
  46. uchar code weeks[7][5]={"Mon","Tues","Wed","Thur","Fri","Sat","Sun"};
  47. uchar code tab1[]={"20  -  - "};
  48. uchar code tab2[]={"  :  :    "};
  49. uchar second[3]={53,55};//記錄s//所有數值均以ASCII值表示
  50. uchar minute[3]={53,57};//記錄min
  51. uchar hour[3]={50,51};//記錄h
  52. uchar day[3]={51,49};//記錄日
  53. uchar month[3]={49,50};//記錄月
  54. uchar year[3]={49,56};//記錄年
  55. uchar week=7;//記錄星期幾
  56. uchar x=0,y=0;//光標位置
  57. uchar a_p_m=0;//am,pm標記量
  58. uchar pFlag=0;
  59. uchar btFlag=1;//基本事件標記
  60. uchar bpFlag=0;//基本校準標記
  61. uchar bfFlag=0;//基本選擇標記
  62. uchar swFlag=0;//秒表標記
  63. uchar cdFlag=0;//倒計時標記
  64. uchar acFlag=0;//鬧鐘標記
  65. uint timer=0;//中斷記錄變量
  66. uint sd=0;//秒表,倒計時記錄變量
  67. uchar sdFlag=0;//毫秒級計時標記位
  68. int  B_state_tag=-1;//按鍵狀態標記位

  69. //鬧鐘變量
  70. struct zwei alarm_clock[4];
  71. struct zwei TIME_clock[4];
  72. void timer0() interrupt 1 using 1//基本時鐘
  73. {
  74.         timer++;
  75.         if(timer==10000)
  76.         {
  77.                 timer=0;
  78.                 btFlag=1;
  79.         }
  80. }
  81. void timer1() interrupt 3 using 1//秒表,倒計時時鐘
  82. {
  83.         sd++;
  84.         if(sd==800)//每100ms加加//由實際測試得出非計算值
  85.         {
  86.                 sd=0;
  87.                 sdFlag=1;
  88.         }
  89. }
  90. void int0() interrupt 0 using 0//時間校準
  91. {
  92.         bpFlag=1;
  93. }
  94. void int1() interrupt 2//功能選擇
  95. {
  96.         bfFlag=1;//帶選擇
  97.         EA=0;
  98.         //TR0=0;
  99.         pFlag=1;
  100.         lcd_initial2();
  101.         delay(1);
  102.         write_command(0x01);
  103.         delay(1);
  104.         x=0;
  105.         while(bfFlag)
  106.         {
  107.                 while(read_keys()==-1);//等待按鍵按下
  108.                 B_state_tag=read_keys();
  109.                 x=B_state_tag-1;//上下按鍵選擇日期或者時間
  110.                 while(bfFlag)//按鍵與顯示屏操作
  111.                 {
  112.                         while(read_keys()==-1);
  113.                         B_state_tag=read_keys();//讀取按鍵值
  114.                         while(read_keys()!=-1);
  115.                         switch(B_state_tag)
  116.                         {
  117.                                 case 1://上
  118.                                 {
  119.                                         string(0x80,"alarm clock");
  120.                                         acFlag=1;
  121.                                 }break;
  122.                                 case 2://下
  123.                                 {
  124.                                         string(0x80,"stopwatch");
  125.                                         swFlag=1;
  126.                                 }break;
  127.                                 case 3://左
  128.                                 {
  129.                                         string(0x80,"countdown");
  130.                                         cdFlag=1;
  131.                                 }break;
  132.                                 case 4://右
  133.                                 {
  134.                                         if(P2_4==0)
  135.                                           P2_4=1;
  136.                                         if(P2_4==1)
  137.                                                 string(0xce,"  ");
  138.                                         string(0x80,"24or12");
  139.                                 }break;
  140.                                 case 0://確認
  141.                                 {
  142.                                         bfFlag=0;
  143.                                 }break;
  144.                                 default:break;
  145.                         }
  146.                         while(read_keys()!=-1);
  147.                 }
  148.         }
  149.         lcd_initial();
  150.         inter_init();
  151.         bfFlag=0;
  152. }
  153. //系統時鐘為12MHZ
  154. void main()
  155. {
  156.         P2_4=0;
  157.         lcd_initial();
  158.         inter_init();
  159.         P1=0xff;//讀取按鍵,先寫入
  160.         string(0x80,tab1);
  161.         string(0xc0,tab2);
  162.         
  163.         while(1)
  164.         {
  165.                 if(swFlag==1)//秒表
  166.                 {
  167.                         for(x=1;x<=1;)//只執行一次清屏操作
  168.                         {
  169.                                 TR1=1;
  170.                                 TH1=0x9C;//100us 中斷一次
  171.               TL1=0x9C;
  172.                                 write_command(0x01);
  173.                                 string(0x83,":");
  174.                                 x=2;
  175.                         }
  176.                         stopwatch();
  177.                 }
  178.                 else
  179.                 {
  180.                         write_time();
  181.                 }
  182.                
  183.                 if(cdFlag==1)//倒計時
  184.                 {
  185.                         for(x=1;x<=1;)//只執行一次清屏操作
  186.                         {
  187.                                 write_command(0x01);
  188.                                 string(0x83,":");
  189.                                 countdown();
  190.                                 TH1=0x9C;//100us 中斷一次
  191.               TL1=0x9C;
  192.                                 x=2;
  193.                         }
  194.                         countdown();
  195.                         c_down();
  196.                 }
  197.                 else
  198.                 {
  199.                         write_time();
  200.                 }
  201.                
  202.                 if(btFlag==1)
  203.                 {
  204.                         base_time();
  205.                 }
  206.                 if(bpFlag==1)
  207.                 {
  208.                         C_time();
  209.                 }
  210.                 if(acFlag==1)
  211.                 {
  212.                         LED=1;
  213. ……………………

  214. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

仿真代碼51hei附件下載:
多功能電子鐘.7z (75.87 KB, 下載次數: 262)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:615687 發表于 2021-12-13 23:51 | 只看該作者
沒仔細看呢,但看到這么多定義內容先頂一個以表敬意
回復

使用道具 舉報

板凳
ID:91165 發表于 2021-12-14 10:18 | 只看該作者
支持一下樓主,希望多發好帖
回復

使用道具 舉報

地板
ID:991417 發表于 2021-12-14 13:54 | 只看該作者
需要用Proteus8.8仿真
回復

使用道具 舉報

5#
ID:992298 發表于 2021-12-14 17:21 | 只看該作者
挺好的,支持一下樓主
回復

使用道具 舉報

6#
ID:1034880 發表于 2022-6-15 18:52 | 只看該作者
請問一下,這個調時間應該怎么調,只會調日期,不能調時間啊
回復

使用道具 舉報

7#
ID:1043718 發表于 2022-9-3 14:54 | 只看該作者
真的很有效地解決了我的問題,看到樓主的這篇,我忽然茅塞頓開
回復

使用道具 舉報

8#
ID:1058977 發表于 2022-12-24 11:11 | 只看該作者
樓主太強了
回復

使用道具 舉報

9#
ID:1124603 發表于 2024-6-11 09:57 | 只看該作者
做的真好,太強了
回復

使用道具 舉報

10#
ID:1138266 發表于 2024-12-4 10:00 | 只看該作者
挺好的,支持一下樓主
回復

使用道具 舉報

11#
ID:961114 發表于 2024-12-4 13:38 | 只看該作者
其實串口打印也挺好用的,很多工程師都在用,加上不停電下載
  1. #include "ai8051u.h"              //調用頭文件
  2. #include "stc32_stc8_usb.h"       //調用頭文件

  3. #define   FOSC  24000000UL
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";

  7. void main(void)      //主函數
  8. {
  9.         WTST=0;
  10.         CKCON=0;
  11.         P_SW2 |= 0x80;      //B7位寫1,使能訪問XFR

  12.        
  13.         P0M1 = 0x00;   P0M0 = 0x00;
  14.     P1M1 = 0x00;   P1M0 = 0x00;
  15.     P2M1 = 0x00;   P2M0 = 0x00;
  16.     P3M1 = 0x00;   P3M0 = 0x00;
  17.     P4M1 = 0x00;   P4M0 = 0x00;
  18.     P5M1 = 0x00;   P5M0 = 0x00;
  19.     P6M1 = 0x00;   P6M0 = 0x00;
  20.     P7M1 = 0x00;   P7M0 = 0x00;
  21.        
  22.         P3M0 &=~0x03;
  23.         P3M1 = 0x03;
  24.         IRC48MCR =0x80;
  25.         while (!(IRC48MCR & 0x01));
  26.         USBCLK=0x00;
  27.         USBCON=0x90;
  28.        
  29.         usb_init();                                     //USB CDC 接口配置
  30.    
  31.     EUSB = 1;                                    //使能USB中斷
  32.     EA = 1;                                         //
  33.        
  34.     while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  35.        
  36.         while(1)
  37.         {
  38.                  if (bUsbOutReady)                    //如果接收到了數據
  39.         {
  40.             USB_SendData(UsbOutBuffer,OutNumber);   //發送數據緩沖區,長度(接收數據原樣返回, 用于測試)
  41.            
  42.             usb_OUT_done();
  43.         }
  44.                
  45.          }
  46. }
復制代碼
回復

使用道具 舉報

12#
ID:1140334 發表于 2024-12-18 17:11 | 只看該作者
太強了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级片在线播放 | 美女拍拍拍网站 | 欧美一区二区三区在线免费观看 | 欧美一区精品 | 亚洲日韩欧美一区二区在线 | 91精品国产91久久久久久最新 | 日韩高清中文字幕 | 欧美一区二区视频 | 中文字幕高清一区 | 一区二区国产在线观看 | 岛国av免费在线观看 | 国产一区二区在线播放视频 | 精品av| 欧美自拍网站 | 九九精品在线 | 国产欧美日韩在线 | 天天射天天操天天干 | 精品成人免费视频 | 99热这里只有精品8 激情毛片 | 色888www视频在线观看 | 久久免费视频1 | 玖玖国产 | 男人天堂网址 | 国产二区精品视频 | 日本不卡一区二区 | 国产精品视频免费观看 | 久久r久久 | 久久精品亚洲国产奇米99 | 国产午夜久久久 | 新av在线| 色婷婷综合久久久中文字幕 | 精品国产乱码久久久久久丨区2区 | 在线观看日本网站 | 91小视频| 涩涩视频网站在线观看 | 欧美一区二区三区日韩 | 欧美精品欧美精品系列 | 日韩视频成人 | 国产免费一区 | 国产免费福利小视频 | 亚洲国产精品一区二区三区 |