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

標題: 有溫度濕度顯示的單片機萬年歷 [打印本頁]

作者: 51mcu    時間: 2017-7-9 15:36
標題: 有溫度濕度顯示的單片機萬年歷
    這是一款有溫度濕度顯示的單片機萬年歷程序,程序來源于本壇,修改了一些原程序在KEIL4編譯環境下的編譯出出的警造,程序修改后用單片機開發板進行驗證,功能正常。
這是修改完善后的程序:
單片機開發板完成的單片機試驗_帶溫度濕度的多功能萬年歷.zip (2.72 MB, 下載次數: 132)

下面是試驗時的照片:






單片機源碼:
  1. #include <REGX52.H>                                          
  2. typedef  unsigned int u16;         
  3. typedef  unsigned char u8;
  4. sbit k2=P3^2;                                            //K1 K2 K3 K4按鍵接口,建議從左到右接K1-K4
  5. sbit k1=P3^5;
  6. sbit k3=P3^3;
  7. sbit k4=P3^4;
  8. sbit DQ=P3^7;
  9. sbit beep=P1^6;   
  10. sbit Data=P1^1;                                             //有源蜂鳴器在P16口
  11. sbit lcden=P0^5;                                                //LCD1602接口定義
  12. sbit lcdrs=P0^7;                                                   
  13. sbit lcdrw=P0^6;
  14. sbit bg=P1^7;                                                //背光變量接入LCD1602的K極,通過bg的高低電平就可控制自動熄滅與點亮
  15. u8 k,e,d,o=1,p=1,temp,nxflag=0,mbflag=0,tianmax;      
  16. float temperature;                                           //溫度變量,18B20接收時為浮點數
  17. u8 miao1,miao2,fen1,fen2,shi1,shi2,tian1,tian2,wk,tem1,tem2,tem3,wendufu;
  18. u8 day=1,mon=1,day1,day2,yue1,yue2,mbw,n=0,m=0,beiguang,RH,RL,TH,TL,tempH,tempL;
  19. u8 se1,se2,mon1,mon2,hou1,hou2,min1,min2,MB2,nian1,nian2,nian3,nian4;
  20. u16 y,MB1;
  21. u16 temper,buchang,tempwarn=0,tempwarn1=500;                //tempwarn為溫度下限,1為溫度上限
  22. u8 code set[]={"NaoZhong  Status"};                                    //上電后傻瓜調節模塊
  23. u8 code tempwarng[]={"Wendu Waring!"};
  24. u8 code temmin[]={"Min"};
  25. u8 code temmax[]={"Max"};               
  26. u8 code naozhongON[]={" ON"};
  27. u8 code naozhongOFF[]={"OFF"};
  28. u8 code setsucces[]={"Set Success!"};
  29. u8 code thanks[]={"Welcome to use !"};
  30. u8 code thanksu[]={"thanks for using"};
  31. u8 code make[]={"Designed by LY"};
  32. u8 code MB[]={"Stopwatch"};
  33. u8 code week1[]={"[MON]"};
  34. u8 code week2[]={"[TUE]"};
  35. u8 code week3[]={"[WED]"};
  36. u8 code week4[]={"[THU]"};
  37. u8 code week5[]={"[FRI]"};
  38. u8 code week6[]={"[SAT]"};
  39. u8 code week7[]={"[SUN]"};                        
  40. void delay(unsigned int z)                                   //定義延時函數
  41. {                                          
  42.   unsigned int x,y;                        
  43.   for(x=z;x>0;x--)
  44.   for(y=1;y>0;y--);
  45. }
  46. void DHT11_delay_us(u8 n)
  47. {
  48.     while(--n);
  49. }
  50. void DHT11_delay_ms(u16 z)               //定義DHT11延遲函數
  51. {
  52.    u16 i,j;
  53.    for(i=z;i>0;i--)
  54.       for(j=110;j>0;j--);
  55. }

  56.          void DHT11_start()
  57. {
  58.    Data=1;
  59.    DHT11_delay_us(2);
  60.    Data=0;
  61.    DHT11_delay_ms(20);   //延時18ms以上
  62.    Data=1;
  63.    DHT11_delay_us(30);
  64. }
  65. u8 DHT11_rec_byte()      //接收一個字節
  66. {
  67.   u8 i,dat=0;
  68.   for(i=0;i<8;i++)       //從高到低依次接收8位數據
  69.    {         
  70.       while(!Data);       //等待50us低電平過去
  71.       DHT11_delay_us(8);   //延時60us,如果還為高則數據為1,否則為0
  72.       dat<<=1;           //移位使正確接收8位數據,數據為0時直接移位
  73.       if(Data==1)        //數據為1時,使dat加1來接收數據1
  74.          dat+=1;
  75.       while(Data);       //等待數據線拉低   
  76.     }  
  77.     return dat;
  78. }
  79. void DHT11_receive()      //接收40位的數據
  80.         {
  81.     u8 R_H,R_L,T_H,T_L,revise;
  82.     DHT11_start();
  83.     if(Data==0)
  84.     {
  85.         while(Data==0);   //等待拉高     
  86.         DHT11_delay_us(40);      //拉高后延時80us
  87.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  88.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  89.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  90.         T_L=DHT11_rec_byte();    //接收溫度低八位
  91.         revise=DHT11_rec_byte(); //接收校正位
  92.         DHT11_delay_us(25);      //結束
  93.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  94.         {
  95.             RH=R_H;
  96.             RL=R_L;
  97.                         TH=T_H;
  98.                         TL=T_L;
  99.         }
  100.     }
  101.   }
  102. void beepon()                                                //PWM(如果你是無源蜂鳴器,這里寫PWM函數)
  103. {                                                             //當前為有源蜂鳴器,有源蜂鳴器無需更改
  104.    beep=0;
  105.    delay(1200);
  106.    beep=1;     
  107. }         
  108. void write_nian();                                  //預定義
  109. void write_yue();
  110. void write_tian();
  111. void write_shi();
  112. void write_fen();
  113. void write_miao();
  114. void write_week();
  115. void zhuanhuan();
  116. void write_temp();
  117. void write_nz();
  118. void nzON();
  119. void write_setsuccess();
  120. void beiguangpd();

  121. void write_com(u8 com)                                    //LCD1602初始化程序,了解1602時序圖后新手的話可以直接照搬使用                                    
  122. {
  123. lcdrs=0;
  124. P2=com;
  125. delay(5);
  126. lcden=1;
  127. delay(5);
  128. lcden=0;
  129. }
  130. void write_data(u8 date)
  131. {
  132. lcdrs=1;
  133. P2=date;
  134. delay(5);
  135. lcden=1;
  136. delay(5);
  137. lcden=0;
  138. }
  139. void init()
  140. {
  141. lcdrw=0;
  142. lcden=0;
  143. write_com(0x38);
  144. write_com(0x0c);
  145. write_com(0x06);
  146. write_com(0x01);
  147. write_com(0x80+0x10);  
  148. }
  149.         
  150. void TimerInit()                                                    //定時器0工作方式1 中斷初始化,923位12M晶振在KEIL仿真后的計算結果
  151. {   
  152.     TMOD=0X01;
  153.         TH0=(65535-901)/256;        
  154.         TL0=(65535-901)%256;        
  155.         ET0=1;                                          //打開定時器0中斷允許位
  156.         EA=1;                                         //打開總中斷允許
  157.         TR0=1;                                                 //打開 定時器0,開始計時
  158. }
  159. Init_DS18B20(void)                                    //DS18B20初始化與時序圖程序,仿真時溫度問題改進這個初始化程序就解決了
  160.   {
  161.        DQ=1;
  162.        delay(70);
  163.        DQ=0;
  164.        delay(485);
  165.        DQ=1;
  166.        delay(50);
  167.            return(1);
  168.   }
  169. ReadOneChar(void)                                      //18B20讀一個字節
  170.   {  
  171.     unsigned char i=0;
  172.     unsigned char dat=0;
  173.        for (i=8;i>0;i--)
  174.      {
  175.          DQ=1;
  176.          delay(1);
  177.          DQ=0;
  178.          dat>>=1;
  179.          DQ=1;
  180.          if(DQ)
  181.          dat|=0x80;
  182.          delay(4);
  183.        }
  184.     return(dat);
  185.    }  
  186. WriteOneChar(unsigned char dat)                     //18B20寫一個字節
  187.    {
  188.          unsigned char i=0;
  189.          for(i=8;i>0;i--)
  190.         {
  191.              DQ=0;
  192.              DQ=dat&0x01;
  193.              delay(5);
  194.              DQ=1;
  195.              dat>>=1;
  196.         }
  197.           delay(4);
  198.             return(1);
  199.     }
  200. ReadTemperature(void)                           //讀取溫度函數定義,返回值為浮點數
  201.    {
  202.         Init_DS18B20();
  203.         WriteOneChar(0xcc);
  204.         WriteOneChar(0x44);
  205.         delay(125);
  206.         Init_DS18B20();
  207.         WriteOneChar(0xcc);
  208.         WriteOneChar(0xbe);
  209.         tempL=ReadOneChar();
  210.         tempH=ReadOneChar();
  211.             if(tempH>0x7f)
  212.                 {
  213.                 tempH=~tempH;
  214.                 tempL=~tempL+1;
  215.                 wendufu=1;
  216.                 }
  217.                 else
  218.                 wendufu=0;
  219.                 temperature=(((tempH*256)+tempL)*0.0625)*10;
  220.         delay(200);
  221.         return(temperature);
  222.     }
  223. void welcome()                                       //定義歡迎函數
  224. { static u8 i;
  225.   init();                                              //初始化1602
  226.   delay(5000);
  227.   for(i=0;i<16;i++)
  228.   {
  229.   write_com(0x80+i);
  230.   write_data(thanks[i]);
  231.   delay(4000);
  232.   }
  233.   delay(50000);
  234.   for(i=0;i<14;i++)
  235.   {
  236.   write_com(0x81+0x40+i);
  237.   write_data(make[i]);
  238.   delay(4000);
  239.   }
  240.   delay(50000);
  241.   delay(50000);
  242. }

  243. void pdtian1()                          //PD在上電后設置完畢主界面處的天數判斷
  244. {
  245. if((p==1||p==3)||(p==5||p==7)||(p==8||p==10)||p==12)        
  246.                 tianmax=31;
  247.           if((p==4||p==6)||(p==9||p==11))
  248.            tianmax=30;

  249.           if(p==2)
  250.           {
  251.             if(((y%4==0)&&(y%100!=0))||(y%400==0))
  252.                   tianmax=29;
  253.                 else
  254.                   tianmax=28;
  255.           }
  256. }
  257. void pdxingqi1()                     //PD在上電后設置完畢至主界面處的星期判斷
  258. {
  259.   static char c,yi,mt,xwk1,xwk2,xwk3;
  260.   static int xwk,yn,xwk4;
  261.   yn=y;
  262.   if(p==1||p==2)
  263.           { yn=yn-1;
  264.             mt=p+12;
  265.          }
  266.           else
  267.       mt=p;
  268.    yi=yn%100;
  269.    c=yn/100;
  270.   xwk1=yi+(yi/4);
  271.   xwk2=c/4;
  272.   xwk3=2*c;
  273.   xwk4=(26*mt+26)/10;
  274.   xwk=xwk1+xwk2-xwk3+xwk4+o-1;
  275.   while(xwk<0)
  276.   {xwk+=7; }
  277.   wk=xwk%7;
  278. }
  279. void Display()                                //定義主程序 顯示部分函數模塊
  280. {           static u16 xunhuan;
  281.      RH=RH%100;
  282.      write_nian();                          //1602寫入顯示年
  283.      write_com(0x84);
  284.      write_data('-');                              
  285.      write_yue();                        //寫入月
  286.             write_com(0x87);
  287.      write_data('-');
  288.             write_com(0x88);
  289.      write_tian();                         //寫入天
  290.      write_week();
  291.      write_shi();
  292.          write_com(0x82+0x40);
  293.      write_data(':');
  294.      write_fen();
  295.          write_com(0x85+0x40);
  296.      write_data(':');
  297.          write_miao();                           //寫入溫度,溫度TEM1與2與3是溫度的三位數                                                         
  298.          xunhuan++;
  299.          if(xunhuan<180)
  300.         {if(wendufu==1)
  301.          {        
  302.          if((temper/100)!=0)
  303.          {
  304.          write_com(0x89+0x40);
  305.          write_data('-');
  306.          write_com(0x8a+0x40);
  307.          write_data(tem1);   
  308.          }
  309.          else
  310.          {
  311.          write_com(0x89+0x40);
  312.          write_data(' ');  
  313.          write_com(0x8a+0x40);
  314.          write_data('-');  
  315.          }
  316.          }

  317.          else
  318.          {
  319.          write_com(0x89+0x40);
  320.          write_data(' ');
  321.          
  322.          if((temper/100)!=0)  
  323.          {
  324.          write_com(0x8a+0x40);
  325.          write_data(tem1);
  326.          }
  327.          else
  328.          {
  329.          write_com(0x8a+0x40);
  330.          write_data(' ');
  331.          } }
  332.          write_com(0x8b+0x40);
  333.          write_data(tem2);
  334.          write_com(0x8c+0x40);
  335.          write_data('.');
  336.          write_com(0x8d+0x40);
  337.          write_data(tem3);
  338.          write_com(0x8e+0x40);
  339.          write_data(0xdf);
  340.          write_com(0x8f+0x40);
  341.          write_data('C');
  342.          }
  343.          if(xunhuan>180)
  344.          {
  345.          write_com(0x89+0x40);
  346.          write_data(' ');
  347.          write_com(0x8a+0x40);
  348.          write_data(' ');
  349.          write_com(0x8b+0x40);
  350.          write_data(RH/10+0x30);
  351.          write_com(0x8c+0x40);
  352.          write_data(RH%10+0x30);
  353.          write_com(0x8d+0x40);
  354.          write_data('%');
  355.          write_com(0x8e+0x40);
  356.           write_data('R');
  357.           write_com(0x8f+0x40);
  358.          write_data('H');
  359.          }
  360.          if(xunhuan==360)
  361.          xunhuan=0;         
  362. }
  363. void NZdisplay()                                    //定義鬧鐘模塊
  364. {
  365.    static u8 nzflag=2,nzwei;                        
  366.    delay(2000);
  367.    init();
  368.    delay(2000);
  369.    nzON();                                         //鬧鐘開關選擇模塊
  370.    while(k4)                                     //沒有檢測到K4鍵退出時無限循環
  371.     {  
  372. ...........................................................................................................................................
  373. 由于程序較長,需要的可以自己下載。
復制代碼



帶溫度補償超聲波測距:http://www.zg4o1577.cn/bbs/dpj-89712-1.html

單片機DHT11溫度濕度程序:http://www.zg4o1577.cn/bbs/dpj-89543-1.html




作者: liuchang9117    時間: 2017-7-9 22:54
說的見解到位,不錯
作者: 51mcu    時間: 2017-10-12 07:35
liuchang9117 發表于 2017-7-9 22:54
說的見解到位,不錯

謝謝你的鼓勵,我會繼續努力。
作者: zhangleixbyl    時間: 2021-1-28 15:05
請問斷電保存數據嗎
作者: zhangleixbyl    時間: 2021-1-28 19:51
有原理圖就好了
作者: zhangleixbyl    時間: 2021-1-29 21:57
屏幕接線圖給個就好了
作者: anan123123    時間: 2021-12-2 17:00
有仿真就好啦
作者: 3花木城    時間: 2021-12-4 20:12
清翔v2.0同款




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧洲精品在线观看 | 欧美极品在线观看 | 一区二区三区观看视频 | 激情五月综合 | 日韩欧美福利视频 | 欧美日韩国产在线观看 | 国产高清在线观看 | 成人 在线 | 亚洲一区中文 | 黄色av一区 | 在线国产视频 | 免费在线看黄视频 | 特黄视频 | 九九热精品在线 | 日韩在线观看一区二区三区 | 日韩电影a | 欧洲妇女成人淫片aaa视频 | 天天干视频 | 国产精品久久 | 免费色网址 | 另类专区成人 | 国产99久久精品一区二区300 | 久久久久无码国产精品一区 | 四虎影院欧美 | 操到爽 | 免费毛片网站 | 欧美一级片在线看 | 欧洲一区视频 | 在线观看a视频 | 99热在线播放 | 国产精彩视频 | 久久中文字幕电影 | 日韩视频精品在线 | 国产精品视频一二三区 | 欧美黄色片在线观看 | 久久99深爱久久99精品 | 亚洲成人一区二区 | 91看片免费版| 一级免费a | 亚洲精品久久久久久下一站 | a在线视频|