找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8410|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

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

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

基本的時間與溫度顯示功能/時間校準(zhǔn)/鬧鐘功能/秒表(開始、暫停、繼續(xù),記錄一個秒表時間,秒表進(jìn)行清零,長按顯示記錄的秒表時間)/倒計時(開始、暫停、繼續(xù),重新倒計時,倒計時清零)/12/24時顯示選擇
因為各種中斷的原因,這個電子鐘本身去記錄時間的功能已經(jīng)被破壞掉了,后續(xù)應(yīng)該可以在增加變量,去記錄所經(jīng)歷的中斷數(shù),對于基礎(chǔ)時鐘的時間進(jìn)行補償,使其達(dá)到更加精準(zhǔn)的效果。(不過那樣又是得花費很多時間去計算所占用的時間啊什么的,實在是肝不動了)
仿真原理圖如下(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,時間校準(zhǔn)
  12. sbit s_alarm=P3^3;//外部中斷1,鬧鐘設(shè)定
  13. sbit LED=P1^2;//低電平點亮
  14. sbit P2_4=P1^1;//24時12時標(biāo)記位,實在沒辦法了,data區(qū)已經(jīng)用完了
  15. //五個按鍵低電平有效,上下左右 確認(rèn) 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//所有數(shù)值均以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;//光標(biāo)位置
  57. uchar a_p_m=0;//am,pm標(biāo)記量
  58. uchar pFlag=0;
  59. uchar btFlag=1;//基本事件標(biāo)記
  60. uchar bpFlag=0;//基本校準(zhǔn)標(biāo)記
  61. uchar bfFlag=0;//基本選擇標(biāo)記
  62. uchar swFlag=0;//秒表標(biāo)記
  63. uchar cdFlag=0;//倒計時標(biāo)記
  64. uchar acFlag=0;//鬧鐘標(biāo)記
  65. uint timer=0;//中斷記錄變量
  66. uint sd=0;//秒表,倒計時記錄變量
  67. uchar sdFlag=0;//毫秒級計時標(biāo)記位
  68. int  B_state_tag=-1;//按鍵狀態(tài)標(biāo)記位

  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//時間校準(zhǔn)
  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://確認(rèn)
  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. //系統(tǒng)時鐘為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;)//只執(zhí)行一次清屏操作
  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;)//只執(zhí)行一次清屏操作
  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黑下載附件…………
復(fù)制代碼

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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

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

  7. void main(void)      //主函數(shù)
  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)                    //如果接收到了數(shù)據(jù)
  39.         {
  40.             USB_SendData(UsbOutBuffer,OutNumber);   //發(fā)送數(shù)據(jù)緩沖區(qū),長度(接收數(shù)據(jù)原樣返回, 用于測試)
  41.            
  42.             usb_OUT_done();
  43.         }
  44.                
  45.          }
  46. }
復(fù)制代碼
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

7#
ID:1058977 發(fā)表于 2022-12-24 11:11 | 只看該作者
樓主太強了
回復(fù)

使用道具 舉報

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

使用道具 舉報

5#
ID:1034880 發(fā)表于 2022-6-15 18:52 | 只看該作者
請問一下,這個調(diào)時間應(yīng)該怎么調(diào),只會調(diào)日期,不能調(diào)時間啊
回復(fù)

使用道具 舉報

地板
ID:992298 發(fā)表于 2021-12-14 17:21 | 只看該作者
挺好的,支持一下樓主
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

樓主
ID:615687 發(fā)表于 2021-12-13 23:51 | 只看該作者
沒仔細(xì)看呢,但看到這么多定義內(nèi)容先頂一個以表敬意
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表