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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2857|回復: 3
收起左側

單片機數字電子鐘(年月日星期時分秒、溫濕度、整點報時、鬧鐘、播放音樂、記憶 LM041L

  [復制鏈接]
ID:1050891 發表于 2022-11-7 18:24 | 顯示全部樓層 |閱讀模式
基于AT89C51單片機、DHT11傳感器、LCD、蜂鳴器設計的數字電子鐘,通過按鍵初始化當前時刻和鬧鐘,并顯示年月日星期時分秒、溫濕度顯示、整點報時、鬧鐘、播放音樂(小星星)、記憶時刻,內容包括:Proteus工程和Keil

LM041L大屏幕顯示

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define port P0

  6. sbit rst=P3^0;        // 復位
  7. sbit sclk=P3^1;        // 時鐘
  8. sbit io=P3^2;        // 輸入輸出口
  9. sbit e=P2^2;        // 使能
  10. sbit rw=P2^1;        // 讀寫
  11. sbit rs=P2^0;        // 數據/命令
  12. sbit busy=P0^7;        // 檢測忙
  13. sbit BUZZ=P2^3;        // 蜂鳴器
  14. sbit DHT11=P1^0;// DHT11
  15. sbit START=P1^1;
  16. sbit NEXT=P1^3;
  17. sbit JIA=P1^5;
  18. sbit JIAN=P1^7;

  19. uchar setup[10]={20,1,1,1,0,0,0,0,0,0};
  20. uint M_sec,M_min,M_hour;
  21. uint t;
  22. uchar t_H,t_L;
  23. uchar H_1,H_2,T_1,T_2;

  24. code unsigned int toneH[7]={     //音調對應的定時器計數值的高8位 中音1,2,3,4,5,6,7
  25. 0XF9,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC
  26. };
  27. code unsigned int toneL[7]={     //音調對應的定時器計數值的低8位
  28. 0X21,0XE1,0X8C,0XD8,0X68,0XE9,0X5B
  29. };

  30. code unsigned int soundtone[42]={ //小星星樂譜-音調
  31. 1,1,5,5,6,6,5,4,4,3,3,2,2,1,
  32. 5,5,4,4,3,3,2,5,5,4,4,3,3,2,
  33. 1,1,5,5,6,6,5,4,4,3,3,2,2,1
  34. };

  35. code unsigned int soundlong[42]={ //小星星樂譜-節拍
  36. 1,1,1,1,1,1,2,1,1,1,1,1,1,2,
  37. 1,1,1,1,1,1,2,1,1,1,1,1,1,2,
  38. 1,1,1,1,1,1,2,1,1,1,1,1,1,2
  39. };

  40. /*************************************************
  41. 函數名:send()
  42. 說明:發送一個字節uchar數據
  43. 入口參數:txd(發送的數據)
  44. 返回值:無
  45. **************************************************/
  46. void send(uchar txd)
  47. {
  48.         uchar i;
  49.         for(i=0;i<8;i++)
  50.         {
  51.         sclk=0;
  52.         io=txd&0x01;        // 取第一位
  53.         txd>>=1;                // 左移一位
  54.         sclk=1;                        // 上升沿有效
  55.         }
  56. }
  57. /*************************************************
  58. 函數名:write()
  59. 說明:寫地址、數據
  60. 入口參數:addr(DS1302地址);dat(寫入的數據)
  61. 返回值:無
  62. **************************************************/
  63. void write(uchar addr,uchar dat)
  64. {
  65.         rst=0;sclk=0;rst=1;
  66.         send(addr);                // 發送地址
  67.         send(dat);                // 發送數據
  68.         rst=1;
  69. }
  70. /*************************************************
  71. 函數名:receive()
  72. 說明:接收1個字節uchar數據
  73. 入口參數:無
  74. 返回值:dat
  75. **************************************************/
  76. uchar receive()
  77. {
  78.         uchar i;
  79.         uchar dat=0;
  80.         for(i=0;i<8;i++)// 循環8次
  81.         {
  82.         sclk=1;
  83.         dat>>=1;
  84.         sclk=0;                        // 下降沿讀取
  85.         io=1;                        // 讀引腳前置1
  86.         if(io==1)dat|=0x80;
  87.         }                                // 此時dat為16進制比如0x10
  88.         dat=(dat/16)*10+dat%16;
  89.                                         // 轉化為10進制,現在是10;
  90.         return(dat);        // 返回值
  91. }
  92. /*************************************************
  93. 函數名:read()
  94. 說明:讀時鐘
  95. 入口參數:addr(地址)
  96. 返回值:dat(接受到的一字節uchar數據)
  97. **************************************************/
  98. uchar read(uchar addr)
  99. {
  100.         uchar dat=0;
  101.         rst=0;sclk=0;rst=1;
  102.         send(addr);                // 發送地址
  103.         dat=receive();        // 接收
  104.         rst=0;
  105.         return(dat);
  106. }
  107. /*************************************************
  108. 函數名:delay()
  109. 說明:延時函數
  110. 入口參數:n
  111. 返回值:無
  112. **************************************************/
  113. void delay(uint n)
  114. {
  115.         uint i;
  116.         for(;n>0;n--)
  117.         for(i=200;i>0;i--);
  118. }
  119. /*************************************************
  120. 函數名:check()
  121. 說明:判斷LCD是否忙
  122. 入口參數:無
  123. 返回值:無
  124. **************************************************/
  125. void check()
  126. {
  127.         rs=0;
  128.         rw=1;                  // 讀 e=1;
  129.         port=0x00;
  130.         e=1;
  131.         while(busy);
  132.         e=0;
  133. }
  134. /*************************************************
  135. 函數名:sendcommand()
  136. 說明:LCD寫指令
  137. 入口參數:command(一個字節uchar的指令)
  138. 返回值:無
  139. **************************************************/
  140. void sendcommand(uchar command)
  141. {
  142.         check();
  143.         rs=0; // 指令
  144.         rw=0;  // 寫 e=0;
  145.         port=command;
  146.         e=1;
  147.         _nop_();_nop_();
  148.         e=0; // 寫入指令
  149. }
  150. /*************************************************
  151. 函數名:writedata()
  152. 說明:LCD寫數據
  153. 入口參數:dat(一個字節uchar數據)
  154. 返回值:無
  155. **************************************************/
  156. void writedata(uchar dat)
  157. {
  158.         check();
  159.         rs=1;  // 數據
  160.         rw=0;
  161.         port=dat;
  162.         e=1;
  163.         _nop_();_nop_();
  164.         e=0;
  165. }
  166. /*************************************************
  167. 函數名:pos()
  168. 說明:設置LCD光標位置
  169. 入口參數:p(一個字節的無符號整型)
  170. 返回值:無
  171. **************************************************/
  172. void pos(uint p)
  173. {
  174.         sendcommand(p|0x80);// 第一行第一個 0x80;
  175. }
  176. /*************************************************
  177. 函數名:init()
  178. 說明:初始化LCD
  179. 入口參數:無
  180. 返回值:無
  181. **************************************************/
  182. void init()
  183. {
  184.         sendcommand(0x38); // 8 位數據,雙列, 5*7 字形
  185.         delay(1);
  186.         sendcommand(0x0c); // 開 0x08 關
  187.         delay(1);
  188.         sendcommand(0x06);// 地址增加一
  189.         delay(1);
  190.         sendcommand(0x01);// 清屏
  191.         delay(1);
  192. }
  193. /*************************************************
  194. 函數名:welcome_setup()
  195. 說明:設置時的LCD初始界面
  196. 入口參數:無
  197. 返回值:無
  198. **************************************************/
  199. void welcome_setup()
  200. {
  201.         int i=0;
  202.         uchar Date[]="Date:";
  203.         uchar Time[]="Time:";
  204.         uchar Week[]="Week:";
  205.         uchar Alarm[]="Alarm:";
  206.         init();delay(10);
  207.         pos(0x00);delay(1);
  208.         while(Date[i]!='\0') {writedata(Date[i++]);delay(1); }
  209.         i=0;delay(10);
  210.         pos(0x10);delay(1);
  211.         while(Week[i]!='\0') {writedata(Week[i++]);delay(1); }
  212.         i=0;delay(10);
  213.         pos(0x40);delay(1);
  214.         while(Time[i]!='\0') {writedata(Time[i++]);delay(1); }
  215.         i=0;delay(10);
  216.         pos(0x50);delay(1);
  217.         while(Alarm[i]!='\0') {writedata(Alarm[i++]);delay(1);}
  218. }
  219. /*************************************************
  220. 函數名:welcome()
  221. 說明:LCD初始界面
  222. 入口參數:無
  223. 返回值:無
  224. **************************************************/
  225. void welcome()
  226. {
  227.         int i=0;
  228.         uchar Date[]="Date:";
  229.         uchar Time[]="Time:";
  230.         uchar Week[]="Week:";
  231.         uchar H[]="H:";
  232.         uchar T[]="T:";
  233.         init();delay(10);
  234.         pos(0x00);delay(1);
  235.         while(Date[i]!='\0') {writedata(Date[i++]);delay(1); }
  236.         i=0;delay(10);
  237.         pos(0x10);delay(1);
  238.         while(Week[i]!='\0') {writedata(Week[i++]);delay(1); }
  239.         i=0;delay(10);
  240.         pos(0x40);delay(1);
  241.         while(Time[i]!='\0') {writedata(Time[i++]);delay(1); }
  242.         i=0;delay(10);
  243.         pos(0x50);delay(1);
  244.         while(H[i]!='\0') {writedata(H[i++]);delay(1);}
  245.         i=0;delay(10);
  246.         pos(0x57);delay(1);
  247.         while(T[i]!='\0') {writedata(T[i++]);delay(1);}
  248. }
  249. /*************************************************
  250. 函數名:showLCD()
  251. 說明:讀取時間和日期并在LCD上顯示
  252. 入口參數:無
  253. 返回值:無
  254. **************************************************/
  255. void showLCD()
  256. {
  257.         uchar num[]="0123456789";
  258.         uchar sign=':';
  259.         uchar note='-';
  260.         delay(5);pos(0x05);
  261.         delay(1);writedata(num[setup[0]/10]);
  262.         delay(1);writedata(num[setup[0]%10]);
  263.         delay(1);writedata(note);
  264.         delay(1);writedata(num[setup[1]/10]);
  265.         delay(1);writedata(num[setup[1]%10]);
  266.         delay(1);writedata(note);
  267.         delay(1);writedata(num[setup[2]/10]);
  268.         delay(1);writedata(num[setup[2]%10]);
  269.         delay(5);pos(0x15);
  270.         delay(1);writedata(num[setup[3]%10]);
  271.         delay(5);pos(0x45);
  272.         delay(1);writedata(num[setup[4]/10]);
  273.         delay(1);writedata(num[setup[4]%10]);
  274.         delay(1);writedata(sign);
  275.         delay(1);writedata(num[setup[5]/10]);
  276.         delay(1);writedata(num[setup[5]%10]);
  277.         delay(1);writedata(sign);
  278.         delay(1);writedata(num[setup[6]/10]);
  279.         delay(1);writedata(num[setup[6]%10]);
  280.         delay(5);pos(0x56);
  281.            delay(1);writedata(num[setup[7]/10]);
  282.         delay(1);writedata(num[setup[7]%10]);
  283.         delay(1);writedata(sign);
  284.         delay(1);writedata(num[setup[8]/10]);
  285.         delay(1);writedata(num[setup[8]%10]);
  286.         delay(1);writedata(sign);
  287.         delay(1);writedata(num[setup[9]/10]);
  288.         delay(1);writedata(num[setup[9]%10]);
  289. }
  290. /*************************************************
  291. 函數名:writeLCD()
  292. 說明:讀取時間和日期并在LCD上顯示
  293. 入口參數:無
  294. 返回值:無
  295. **************************************************/
  296. void writeLCD()
  297. {
  298.         uchar num[]="0123456789";
  299.         uchar sign=':';
  300.         uchar note='-';
  301.         delay(5);pos(0x05);
  302.         delay(1);writedata(num[read(0x8d)/10]);
  303.         delay(1);writedata(num[read(0x8d)%10]);
  304.         delay(1);writedata(note);
  305.         delay(1);writedata(num[read(0x89)/10]);
  306.         delay(1);writedata(num[read(0x89)%10]);
  307.         delay(1);writedata(note);
  308.         delay(1);writedata(num[read(0x87)/10]);
  309.         delay(1);writedata(num[read(0x87)%10]);
  310.         delay(5);pos(0x15);
  311.         delay(1);writedata(num[read(0x8B)%10]);
  312.         delay(1);writedata(' ');
  313.         delay(1);writedata(num[M_hour/10]);
  314.         delay(1);writedata(num[M_hour%10]);
  315.         delay(1);writedata(sign);
  316.         delay(1);writedata(num[M_min/10]);
  317.         delay(1);writedata(num[M_min%10]);
  318.         delay(1);writedata(sign);
  319.         delay(1);writedata(num[M_sec/10]);
  320.         delay(1);writedata(num[M_sec%10]);
  321.         delay(5);pos(0x45);
  322.         delay(1);writedata(num[read(0x85)/10]);
  323.         delay(1);writedata(num[read(0x85)%10]);
  324.         delay(1);writedata(sign);
  325.         delay(1);writedata(num[read(0x83)/10]);
  326.         delay(1);writedata(num[read(0x83)%10]);
  327.         delay(1);writedata(sign);
  328.         delay(1);writedata(num[read(0x81)/10]);
  329.         delay(1);writedata(num[read(0x81)%10]);
  330.         delay(5);pos(0x52);
  331.         delay(1);writedata(num[H_1]);
  332.         delay(1);writedata(num[H_2]);
  333.         delay(1);writedata('R');
  334.         delay(1);writedata('H');
  335.         delay(5);pos(0x59);
  336.         delay(1);writedata(num[T_1]);
  337.         delay(1);writedata(num[T_2]);
  338.         delay(1);writedata(0XDF);
  339.         delay(1);writedata(0X43);
  340. }
  341. /*************************************************
  342. 函數名:Delay_us()/Delay_ms()
  343. 說明:DHT11延時程序
  344. 入口參數:無
  345. 返回值:無
  346. **************************************************/
  347. void Delay_us(unsigned char n)//n us延時函數 精度 ±4us
  348. {
  349.         n=n/2;
  350.         while(--n);
  351. }
  352. void Delay_ms(unsigned int n)//n毫秒延時
  353. {
  354.         unsigned char j;
  355.         while(n--)
  356.         {
  357.         for(j=0;j<125;j++);
  358.         }
  359. }
  360. /*************************************************
  361. 函數名:COM()
  362. 說明:接收DHT11數據
  363. 入口參數:無
  364. 返回值:comdata數據
  365. **************************************************/
  366. uchar  COM(void)
  367.       {   
  368.            uchar i,temp,comdata;
  369.        for(i=0;i<8;i++)           
  370.             {
  371.                            while(!DHT11);        //表示讀取的高電位延時大于20多us 則讀取的是1 否則讀取的是0
  372.                         Delay_us(35);                        //通過FLAG,可判斷DHT11顯示數據的脈長
  373.                         temp=0;         
  374.                      if(DHT11)temp=1;                  
  375.                          while(DHT11);                    
  376.                            comdata<<=1;
  377.                               comdata|=temp;
  378.             }
  379.                    return         comdata;
  380.         }
  381. /*************************************************
  382. 函數名:getDHT11()
  383. 說明:主機發送起始信號,獲取溫、濕度值并校驗
  384. 入口參數:無
  385. 返回值:無
  386. **************************************************/
  387. void getDHT11(void)
  388.         {
  389.            uchar  T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
  390.           //主機拉低18ms
  391.            GO1:DHT11=0;
  392.            Delay_ms(18);
  393.            DHT11=1;
  394.          //總線由上拉電阻拉高 主機延時20us
  395.            Delay_us(20);           
  396.          //主機設為輸入 判斷從機響應信號

  397.          //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行         
  398.            if(!DHT11)         
  399.            {         
  400.            while(!DHT11);                //wait DHT goto high           
  401.            while(DHT11);
  402.          //數據接收狀態                           
  403.            RH_data_H=COM();           
  404.            RH_data_L=COM();         
  405.            T_data_H=COM();           
  406.            T_data_L=COM();         
  407.            checkdata=COM();
  408.            DHT11=1;
  409.          //數據校驗           
  410.            if((T_data_H+T_data_L+RH_data_H+RH_data_L)!=checkdata)         //if check wrong,read again
  411.            goto  GO1;
  412.            }
  413.            H_1=RH_data_H/10;
  414.            H_2=RH_data_H%10;
  415.            T_1=T_data_H/10;
  416.            T_2=T_data_H%10;   
  417.         }
  418. /*************************************************
  419. 函數名:Count_Time()
  420. 說明:計時
  421. 入口參數:無
  422. 返回值:無
  423. **************************************************/
  424. void init_Ex1() {
  425.   EA = 1;         //開啟總中斷
  426.   EX1 = 1;         //開啟0號外部中斷
  427.   IT1 = 0;         //設置外部中斷觸發方式
  428.              //0 - 低電平觸發
  429.              //1 - 負跳變觸發
  430. }
  431. void ex1_intr() interrupt 2 {
  432.         M_sec=read(0x81); //讀秒寄存器
  433.         M_min=read(0x83); //讀分寄存器
  434.         M_hour=read(0x85);//讀時寄存器
  435. }
  436. /*************************************************
  437. 函數名:init_T0()
  438. 說明:初始化定時器0
  439. 入口參數:無
  440. 返回值:無
  441. **************************************************/
  442. void init_T0(void)
  443. {
  444.         TMOD|= 0x01;          //使用方式1,16位定時器                     
  445.         TH0=0x00;              //給TH0和TL0賦初值,計數器由0開始計數,到65535溢出
  446.         TL0=0x00;
  447.         EA=1;            //總中斷打開
  448.         ET0=1;           //定時器中斷打開
  449.         TR0=0;           //關閉定時器
  450. }
  451. /*************************************************
  452. 函數名:T0_ISR()
  453. 說明:定時器0中斷服務程序
  454. 入口參數:無
  455. 返回值:無
  456. **************************************************/
  457. void T0_ISR(void) interrupt 1
  458. {
  459.         TH0=t_H;                  //給TH0和TL0重新賦值
  460.         TL0=t_L;
  461.         BUZZ=~BUZZ;      //BUZZ的值取反,改變蜂鳴器的狀態。
  462. }
  463. /*************************************************
  464. 函數名:alarm()
  465. 說明:鬧鈴
  466. 入口參數:h(小時),m(分鐘),s(秒)
  467. 返回值:無
  468. **************************************************/
  469. void alarm(int h,int m,int s)
  470. {
  471.         int sec,min,hour;
  472.         sec=read(0x81); //讀秒寄存器
  473.         min=read(0x83); //讀分寄存器
  474.         hour=read(0x85);//讀時寄存器
  475.         if((sec==0)&(min==0))
  476.         {
  477.                 t_H=0XFC;
  478.                 t_L=0X5B;
  479.             TR0=1;              //打開定時器,蜂鳴器發聲
  480.             Delay_ms(50);
  481.             BUZZ=0;             //蜂鳴器不發聲,停頓片刻
  482.             TR0=0;
  483.         }
  484.         if((hour==h)&(min==m)&(sec==s))
  485.             for(t=0;t<42;t++)
  486.         {
  487.                         getDHT11();
  488.             writeLCD();
  489.                         t_H=toneH[soundtone[t]];//提取音調對應的定時器初始值
  490.             t_L=toneL[soundtone[t]];//提取音調對應的定時器初始值
  491.                 TH0=t_H;                    //給TH0和TL0賦值
  492.                 TL0=t_L;
  493.             TR0=1;              //打開定時器,蜂鳴器發聲
  494.             Delay_ms(soundlong[t]*200);    //延時soundlong[t]指定的時間長度
  495.             BUZZ=0;             //蜂鳴器不發聲,停頓片刻
  496.             TR0=0;
  497.             Delay_ms(1);
  498. ……………………

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

Keil代碼與Proteus仿真下載:
數字電子鐘.7z (62.8 KB, 下載次數: 88)

評分

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

查看全部評分

回復

使用道具 舉報

ID:1073043 發表于 2023-4-21 11:12 | 顯示全部樓層
需要用Proteus8.13版本來打開
回復

使用道具 舉報

ID:1073043 發表于 2023-4-21 11:12 | 顯示全部樓層
那個Proteus是那個版本的呢
回復

使用道具 舉報

ID:1065355 發表于 2023-4-26 08:24 來自手機 | 顯示全部樓層
能看得到完整的代碼嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品1区2区| 日本精品视频在线 | 免费成人av网站 | 国产女人与拘做受免费视频 | 美女视频黄色的 | 日本福利在线 | 五月天婷婷狠狠 | 亚洲第一福利网 | 亚洲国产成人av | 蜜臀网| 精品国产一二三区 | 久久三区 | 精品一区二区三区在线播放 | 亚洲欧美国产精品久久 | 国产一区二区三区视频 | 成人国产免费观看 | 97人人澡人人爽91综合色 | 久久久久久亚洲精品 | 欧美日韩亚洲国产 | 看特级黄色片 | 岛国午夜 | 久久精品免费 | 欧美日韩一区二区三区四区 | 精品麻豆剧传媒av国产九九九 | 黄视频在线网站 | 高清av电影| 日产精品久久久一区二区福利 | 日韩免费视频一区二区 | 毛片a级毛片免费播放100 | 不卡视频一区二区三区 | 久久精品小视频 | 一区二区三区在线免费观看 | 国产精品久久久乱弄 | 成人精品久久 | 国产精品亚洲综合 | 91精品国产99 | 久久小视频 | 国产特级毛片 | 国产精品av久久久久久毛片 | 久久久精品一区 | 美国一级黄色片 |