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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AT89C51單片機LCD電子時鐘的Proteus仿真設計

[復制鏈接]
跳轉到指定樓層
樓主
自己做的設計,經過是仿真與調試,君沒有問題
利用STC89C51芯片為核心對電子時鐘進行開發,實現日期、時間、整點鬧鈴、實時環境溫度監測等功能。LCD1602液晶顯示器進行顯示,使用芯片內部定時中斷完成時鐘、日歷的基本功能,同時利用溫度傳感器DS18B20測量環境溫度。
仿真原理圖,程序工程文件在附件中 LCD時鐘課程設計-工程文件.zip (137.55 KB, 下載次數: 148)



單片機源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit lcdrs=P2^6;  //定義1602液晶RS端
  5. sbit lcden=P2^7;//定義1602液晶LCDEN端
  6. sbit lcdrw=P2^5;//定義1602液晶LCRW端
  7. sbit s1=P1^4;   //定義按鍵--功能鍵
  8. sbit s2=P1^5;        //定義按鍵--增加鍵
  9. sbit s3=P1^6;        //定義按鍵--減小鍵
  10. sbit s4=P1^7;        //定義按鍵--確認鍵
  11. sbit s5=P1^3;        //定義按鍵--時制轉換鍵
  12. sbit beep=P3^3; //定義蜂鳴器端
  13. sbit led=P2^3;  //定義LED燈端,閃爍測試
  14. sbit s6=P1^2;//定義按鍵--整點報時開關鍵
  15. bit s6bit;//定義整點報時開關標志位
  16. read_temp();
  17. bit t;// 定義分號":"閃爍標志位
  18. void ds1820disp();

  19. sbit DQ=P3^7;//溫度傳感器
  20. uint value;//溫度值
  21. uchar flag;//溫度符號標志
  22. uchar data disdata[5];

  23. sbit BF=P0^7;//判忙位

  24. uchar count,s1num,s5num,s6num;
  25. char year,month,day,week,miao,shi,fen,pshi;
  26. uchar code table[]=" 20  -  -   ";//定義初始上電時液晶默認顯示狀態


  27. void delay(uint z)  //延時函數
  28. {
  29.         uint x,y;
  30.         for(x=z;x>0;x--)
  31.                 for(y=110;y>0;y--);
  32. }
  33. void zhuanhuan()
  34. {
  35.         if(shi==0)
  36.             pshi=12;
  37.         if(shi<=12&&shi>=1)
  38.             pshi=shi;
  39.     if(shi>12)
  40.             pshi=shi-12;                                          
  41. }                        


  42. void di_delay(int i)
  43. {
  44.         while(i--);        
  45. }


  46. void di()//蜂鳴器發聲函數
  47. {

  48.         beep=~beep;
  49.         di_delay(20);//延時大約20us  通過修改此延時時間達到不同的發聲效果        
  50.         
  51. }

  52. ///////////判忙//////////////
  53. uchar lcd_busy(void)
  54. {
  55. bit result;
  56.         lcdrs=0;
  57.   lcdrw=1;
  58.         lcden=1;
  59.         delay(3);
  60.         result=BF;
  61.         lcden=0;
  62.         return result;

  63. }


  64. void write_com(uchar com)//液晶寫命令函數

  65. {
  66.         
  67.         while (lcd_busy());
  68.         lcdrs=0;
  69.         lcdrw=0;
  70.         lcden=0;
  71.         P0=com;
  72.         delay(5);
  73.         lcden=1;
  74.         delay(5);
  75.         lcden=0;        
  76.         
  77. }
  78. void write_date(uchar date)//液晶寫數據函數

  79. {
  80.         while (lcd_busy());
  81.         lcdrs=1;
  82.         lcdrw=0;
  83.         lcden=0;
  84.         P0=date;
  85.         delay(5);
  86.         lcden=1;
  87.         delay(5);
  88.         lcden=0;        
  89. }
  90. void _shi()        //寫"AM"、"PM"函數
  91. {
  92.    if(shi>=12)
  93.    {
  94.          write_com(0x80+0x40+0);//寫出"PM"
  95.          write_date('P');
  96.          //write_date('M');
  97.    }
  98.    else
  99.    {
  100.          write_com(0x80+0x40+0);//寫出"AM"
  101.          write_date('A');
  102.          //write_date('M');
  103.    }
  104. }
  105. void write_ymd(uchar add1,uchar date1)//寫年月日函數
  106. {
  107.         uchar shi,ge;
  108.         shi=date1/10;//分解一個2位數的十位和個位
  109.         ge=date1%10;
  110.         write_com(0x80+add1);//設置顯示位置
  111.         write_date(0x30+shi);//送去液晶顯示十位
  112.         write_date(0x30+ge); //送去液晶顯示個位
  113. }
  114. void write_sfm(uchar add,uchar date)//寫時分秒函數
  115. {
  116.         uchar shi,ge;
  117.         shi=date/10;//分解一個2位數的十位和個位
  118.         ge=date%10;
  119.         write_com(0x80+0x40+add);//設置顯示位置
  120.         write_date(0x30+shi);//送去液晶顯示十位
  121.         write_date(0x30+ge); //送去液晶顯示個位
  122. }
  123. void write_week(char week)           //寫液晶星期顯示函數
  124. {
  125.         write_com(0x80+12);
  126.         switch(week)
  127.         {
  128.                 case 1:        write_date('M');delay(5);
  129.                                 write_date('O');delay(5);
  130.                                 write_date('N');
  131.                                 break;
  132.                 case 2:        write_date('T');delay(5);
  133.                                 write_date('U');delay(5);
  134.                                 write_date('E');
  135.                                 break;
  136.                 case 3:        write_date('W');delay(5);
  137.                                 write_date('E');delay(5);
  138.                                 write_date('D');
  139.                                 break;
  140.                 case 4:        write_date('T');delay(5);
  141.                                 write_date('H');delay(5);
  142.                                 write_date('U');
  143.                                 break;
  144.                 case 5:        write_date('F');delay(5);
  145.                                 write_date('R');delay(5);
  146.                                 write_date('I');
  147.                                 break;
  148.                 case 6:        write_date('S');delay(5);
  149.                                 write_date('A');delay(5);
  150.                                 write_date('T');
  151.                                 break;
  152.                 case 7:        write_date('S');delay(5);
  153.                                 write_date('U');delay(5);
  154.                                 write_date('N');
  155.                                 break;
  156.         }
  157. }
  158. void writeym()
  159. {
  160.    day=1;
  161.    month++;
  162.    if(month==13)
  163.    {
  164.          month=1;
  165.          year++;
  166.          if(year==100)
  167.             year=0;
  168.          write_ymd(3,year);//年若變化則重新寫入
  169.         }
  170.         write_ymd(6,month);//月若變化則重新寫入
  171. }
  172. void init()//初始化函數
  173. {
  174.    uchar num;
  175.         lcden=0;
  176.         year=19;//初始化種變量值
  177.         month=6;
  178.         day=12;
  179.         week=3;
  180.         shi=13;
  181.         fen=59;
  182.         miao=50;
  183.         count=0;
  184.         s1num=0;
  185.         s5num=0;
  186.         s6num=0;
  187.         write_com(0x38);//初始化1602液晶,5x7點陣,八位數據傳輸
  188.         write_com(0x0c);//開顯示
  189.         write_com(0x06);//寫讀地址指針自動加一
  190.         write_com(0x01);
  191.         write_com(0x80);//設置顯示初始坐標
  192.         for(num=0;num<15;num++)//顯示年月日星期
  193.         {
  194.                 write_date(table[num]);
  195.                 delay(5);
  196.         }
  197.                 delay(5);
  198.                 write_com(0x80+0x40+4);//寫出時間顯示部分的兩個":"
  199.                 write_date(':');
  200.                 delay(5);
  201.                 write_com(0x80+0x40+7);
  202.                 write_date(':');
  203.                 delay(5);
  204.         write_week(week);
  205.         write_ymd(3,year);//分別送去液晶顯示
  206.         write_ymd(6,month);
  207.         write_ymd(9,day);
  208.         write_sfm(8,miao);//分別送去液晶顯示
  209.         write_sfm(5,fen);
  210.         write_sfm(2,shi);
  211.         TMOD=0x01;//設置定時器0工作模式1
  212.         TH0=(65536-50000)/256;//定時器裝初值
  213.         TL0=(65536-50000)%256;
  214.         EA=1;        //開總中斷
  215.         ET0=1;        //開定時器0中斷
  216.         TR0=1;        //啟動定時器0
  217. }
  218. void keyscan()//按鍵掃描函數
  219. {
  220.         if(s1==0)        
  221.         {
  222.                 delay(5);
  223.                 if(s1==0)//確認功能鍵被按下
  224.                 {        
  225.                     s1num++;//功能鍵按下次數記錄
  226.                         while(!s1);//釋放確認                        
  227.                         if(s1num==4)//第一次被按下時
  228.                         {
  229.                             //TR0=0;  //關閉定時器
  230.                                 write_com(0x80+3);//光標定位到年位置
  231.                                 //write_com(0x0f); //光標開始閃爍
  232.                         }
  233.                         if(s1num==5)//第二次按下光標閃爍定位到月位置
  234.                         {
  235.                                 write_com(0x80+6);
  236.                         }
  237.                         if(s1num==6)//第三次按下光標閃爍定位到日位置
  238.                         {
  239.                                 write_com(0x80+9);
  240.                         }
  241.                         if(s1num==7)//第四次按下光標閃爍定位到星期位置
  242.                         {
  243.                                 write_com(0x80+12);
  244.                         }
  245.                         if(s1num==1)//第七次被按下時光標定位到秒位置
  246.                         {
  247.                                  TR0=0;  //關閉定時器
  248.                                 write_com(0x80+0x40+8);
  249.                                 write_com(0x0f); //光標開始閃爍
  250.                         }
  251.                         if(s1num==2)//第六次按下光標閃爍定位到分位置
  252.                         {
  253.                                 write_com(0x80+0x40+5);
  254.                         }
  255.                         if(s1num==3)//第五次按下光標閃爍定位到時位置
  256.                         {
  257.                                 write_com(0x80+0x40+2);
  258.                         }
  259.                         if(s1num==8)//第七次按下
  260.                         {
  261.                                 s1num=0;//記錄按鍵數清零
  262.                                 write_com(0x0c);//取消光標閃爍
  263.                                 TR0=1;        //啟動定時器使時鐘開始走
  264.                         }               
  265.                 }
  266.         }
  267.         if(s1num!=0)//只有功能鍵被按下后,增加和減小鍵才有效
  268.         {
  269.                 if(s4==0)        
  270.           {
  271.                                 delay(5);
  272.                                 if(s4==0)//確認功能鍵被按下
  273.                                 {        
  274.                                                 while(!s4);//釋放確認
  275.                                                 s1num=0;//記錄按鍵數清零
  276.                                                 write_com(0x0c);//取消光標閃爍
  277.                                                 TR0=1;        //啟動定時器使時鐘開始走
  278.                                 
  279.                                 }
  280.     }
  281.                
  282.                 if(s2==0)
  283.                 {
  284.                         delay(5);
  285.                         if(s2==0)//增加鍵確認被按下
  286.                         {
  287.                                 while(!s2);//按鍵釋放
  288.                                 if(s1num==4)//若功能鍵第一次按下
  289.                                 {
  290.                                         year++; //則調整年加1
  291.                                         if(year==100)//若滿100后將清零
  292.                                                 year=0;
  293.                                         write_ymd(3,year);//每調節一次送液晶顯示一下
  294.                                         write_com(0x80+3);//顯示位置重新回到調節處
  295.                                 }
  296.                                 if(s1num==5)//若功能鍵第二次按下
  297.                                 {
  298.                                         month++;//則調整月加1
  299.                                         if(month==13)//若滿12后將置一
  300.                                                 month=1;
  301.                                         write_ymd(6,month);//每調節一次送液晶顯示一下
  302.                                         write_com(0x80+6);//顯示位置重新回到調節處
  303.                                 }
  304.                                 if(s1num==6)//若功能鍵第三次按下
  305.                                 {
  306.                                         day++;//則調整日加1
  307.                                         if(year%4==0&&month==2)
  308.                                         {
  309.                                             if(day==30)//若滿29后將置一
  310.                                                 day=1;
  311.                                          }
  312.                                          if(year%4!=0&&month==2)
  313.                                         {
  314.                                             if(day==29)//若滿28后將置一
  315.                                                 day=1;
  316.                                          }
  317.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  318.                                          {
  319.                                             if(day==32)//若滿31后將置一
  320.                                                 day=1;
  321.                                          }
  322.                                          if(month==4||month==6||month==9||month==11)
  323.                                          {         
  324.                                                 if(day==31)//若滿30后將置一
  325.                                                 day=1;
  326.                                          }
  327.                                         write_ymd(9,day);;//每調節一次送液晶顯示一下
  328.                                         write_com(0x80+9);//顯示位置重新回到調節處
  329.                                 }
  330.                                 if(s1num==7)//若功能鍵第四次按下
  331.                                 {
  332.                                         week++;//則調整星期加1
  333.                                         if(week==8)//若滿8后將置一
  334.                                                 week=1;
  335.                                         write_week(week);//每調節一次送液晶顯示一下
  336.                                         write_com(0x80+12);//顯示位置重新回到調節處
  337.                                 }
  338.                                 if(s1num==1)//若功能鍵第七次按下
  339.                                 {
  340.                                         miao++; //則調整秒加1
  341.                                         if(miao==60)//若滿60后將清零
  342.                                                 miao=0;
  343.                                         write_sfm(8,miao);//每調節一次送液晶顯示一下
  344.                                         write_com(0x80+0x40+8);//顯示位置重新回到調節處
  345.                                 }
  346.                                 if(s1num==2)//若功能鍵第二次按下
  347.                                 {
  348.                                         fen++;//則調整分鐘加1
  349.                                         if(fen==60)//若滿60后將清零
  350.                                                 fen=0;
  351.                                         write_sfm(5,fen);//每調節一次送液晶顯示一下
  352.                                         write_com(0x80+0x40+5);//顯示位置重新回到調節處
  353.                                 }
  354.                                 if(s1num==3)//若功能鍵第五次按下
  355.                                 {                                       
  356.                                         shi++;
  357.                                         if(shi==24)//若滿24后將清零
  358.                       {
  359.                                            shi=0;
  360.                                         }
  361.                                            if(s5num==0)
  362.                                            {                                                                                       
  363.                                               write_sfm(2,shi);;//每調節一次送液晶顯示一下
  364.                                               write_com(0x80+0x40+2);//顯示位置重新回到調節處
  365.                                            }                                          
  366.                                            if(s5num==1)
  367.                                            {
  368.                                                      zhuanhuan();
  369.                                               _shi();
  370.                                               write_sfm(2,pshi);;//每調節一次送液晶顯示一下
  371.                                               write_com(0x80+0x40+2);//顯示位置重新回到調節處
  372.                                        }                                       
  373.                               }
  374.                         }
  375.                 }
  376.         }
  377.                 if(s3==0)
  378.                 {
  379.                         delay(5);
  380.                         if(s3==0)//確認減小鍵被按下
  381.                         {
  382.                                 while(!s3);//按鍵釋放
  383.                                 if(s1num==4)//若功能鍵第一次按下
  384.                                 {
  385.                                         year--;//則調整秒減1
  386.                                         if(year==-1)//若減到負數則將其重新設置為99
  387.                                                 year=99;
  388.                                         write_ymd(3,year);//每調節一次送液晶顯示一下
  389.                                         write_com(0x80+3);//顯示位置重新回到調節處
  390.                                 }
  391.                                 if(s1num==5)//若功能鍵第二次按下
  392.                                 {
  393.                                         month--;//則調整分鐘減1
  394.                                         if(month==0)//若減到負數則將其重新設置為59
  395.                                                 month=12;
  396.                                         write_ymd(6,month);//每調節一次送液晶顯示一下
  397.                                         write_com(0x80+6);//顯示位置重新回到調節處
  398.                                 }
  399.                                 if(s1num==6)//若功能鍵第二次按下
  400.                                 {
  401.                                         day--;//則調整日加1
  402.                                         if(year%4==0&&month==2)
  403.                                         {
  404.                                             if(day==0)//若滿29后將置一
  405.                                                 day=29;
  406.                                          }
  407.                                          if(year%4!=0&&month==2)
  408.                                         {
  409.                                             if(day==0)//若滿28后將置一
  410.                                                 day=28;
  411.                                          }
  412.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  413.                                          {
  414.                                             if(day==0)//若滿31后將置一
  415.                                                 day=31;
  416.                                          }
  417.                                          if(month==4||month==6||month==9||month==11)
  418.                                          {         
  419.                                                 if(day==0)//若滿30后將置一
  420.                                                 day=30;
  421.                                          }
  422.                                         write_ymd(9,day);;//每調節一次送液晶顯示一下
  423.                                         write_com(0x80+9);//顯示位置重新回到調節處
  424.                                 }
  425.                                 if(s1num==7)//若功能鍵第二次按下
  426.                                 {
  427.                                         week--;//則調整小時減1
  428.                                         if(week==0)//若減到負數則將其重新設置為23
  429.                                                 week=7;
  430.                                         write_week(week);//每調節一次送液晶顯示一下
  431.                                         write_com(0x80+12);//顯示位置重新回到調節處
  432.                                 }
  433.                                 if(s1num==1)//若功能鍵第一次按下
  434.                                 {
  435.                                         miao--;//則調整秒減1
  436.                                         if(miao==-1)//若減到負數則將其重新設置為59
  437.                                                 miao=59;
  438.                                         write_sfm(8,miao);//每調節一次送液晶顯示一下
  439.                                         write_com(0x80+0x40+8);//顯示位置重新回到調節處
  440.                                 }
  441.                                 if(s1num==2)//若功能鍵第二次按下
  442.                                 {
  443.                                         fen--;//則調整分鐘減1
  444.                                         if(fen==-1)//若減到負數則將其重新設置為59
  445.                                                 fen=59;
  446.                                         write_sfm(5,fen);//每調節一次送液晶顯示一下
  447.                                         write_com(0x80+0x40+5);//顯示位置重新回到調節處
  448.                                 }
  449.                                 if(s1num==3)//若功能鍵第二次按下
  450.                                 {
  451.                                         shi--;
  452.                                         if(shi==-1)//若滿24后將清零
  453.                                            shi=23;
  454.                                            if(s5num==0)
  455.                                            {                                                                                    
  456.                                               write_sfm(2,shi);;//每調節一次送液晶顯示一下
  457.                                               write_com(0x80+0x40+2);//顯示位置重新回到調節處                                                     
  458.                                            }
  459.                                            if(s5num==1)
  460.                                            {                                          
  461.                               zhuanhuan();
  462.                                               _shi();
  463.                                               write_sfm(2,pshi);;//每調節一次送液晶顯示一下
  464.                                               write_com(0x80+0x40+2);//顯示位置重新回到調節處
  465.                                        }                                       
  466.                              }
  467.                 }
  468.         }
  469.         if(s1num==0)
  470.         {
  471.           if(s5==0)        
  472.           {
  473.                         delay(5);
  474.                         if(s5==0)//確認功能鍵被按下
  475.                         {        
  476.                                         s5num++;//功能鍵按下次數記錄
  477.                                 while(!s5);//釋放確認                        
  478.                                 if(s5num==1)//第一次被按下時
  479.                                 {
  480.                                                 zhuanhuan();
  481.                                         _shi();
  482.                                         write_sfm(2,pshi);
  483.                                 }                        
  484.                                 if(s5num==2)//第二次按下
  485.                                 {
  486.                                         s5num=0;//記錄按鍵數清零
  487.                                         write_com(0x80+0x40+0);
  488.                                         write_date(' ');
  489.                                         //write_date(' ');
  490.                                         write_sfm(2,shi);
  491.                                 }               
  492.                         }
  493.     }
  494.                
  495. /////S6_beep_text//////////////
  496.                 if(s6==0)        
  497.           {
  498.                         delay(5);
  499.                         if(s6==0)//確認功能鍵被按下
  500.                         {        
  501.                                         s6num++;//功能鍵按下次數記錄
  502.                                 while(!s6);//釋放確認                        
  503.                                 if(s6num==1)//第一次被按下時
  504.                                 {
  505.                                                 s6bit=1;
  506.                                         write_com(0x80+0x40+1);
  507.                                         write_date(0xa1);
  508.                                 }                        
  509.                                 if(s6num==2)//第二次按下
  510.                                 {
  511.                                         s6num=0;//記錄按鍵數清零
  512.                                         s6bit=0;
  513.                                         write_com(0x80+0x40+1);
  514.                                         write_date(' ');
  515.                                 }               
  516.                         }
  517.     }
  518.                
  519.         
  520.                
  521.         }   
  522. }


  523. //////////////////定時器0中斷服務程序///////////////////////////

  524. void timer0() interrupt 1
  525. {
  526.         TH0=(65536-50000)/256;//再次裝定時器初值
  527.         TL0=(65536-50000)%256;
  528.         count++;                //中斷次數累加
  529.         if(count==20) //20次50毫秒為1秒
  530.         {
  531.                 count=0;
  532.                 miao++;
  533.                 if(miao==60)//秒加到60則進位分鐘
  534.                 {
  535.                         miao=0;//同時秒數清零
  536.                         fen++;
  537.                         if(fen==60)//分鐘加到60則進位小時
  538.                         {
  539.                                 fen=0;//同時分鐘數清零
  540.                                 shi++;                                
  541.                                 if(shi==24)//小時加到24則小時清零
  542.                                 {
  543.                                         shi=0;
  544.                                         week++;
  545.                                            if(week==8)
  546.                                            {
  547.                                                week=1;
  548.                                            }
  549.                                            write_week(week);//星期若變化則重新寫入
  550.                                         day++;
  551.                                            if(year%4==0&&month==2)//判斷是否為閏年的2月
  552.                                            {
  553.                                               if(day==30)
  554.                                                   {
  555.                                                      writeym();                                                                                                                                                         
  556.                                                   }
  557.                                                   write_ymd(9,day);//日若變化則重新寫入
  558.                                            }
  559.                                            if(year%4!=0&&month==2)//判斷是否為平年的2月
  560.                                            {
  561.                                               if(day==29)
  562.                                                   {
  563.                                                      writeym();                                                                                                  
  564.                                                   }
  565.                                                   write_ymd(9,day);//日若變化則重新寫入
  566.                                            }
  567.                                            if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  568.                                            {
  569.                                               if(day==32)
  570.                                                   {
  571.                                                      writeym();                                                                                                  
  572.                                                   }
  573.                                                   write_ymd(9,day);//日若變化則重新寫入
  574.                                            }
  575.                                            if(month==4||month==6||month==9||month==11)
  576.                                            {
  577.                                               if(day==31)
  578.                                                   {
  579.                                                      writeym();                                                                                                  
  580.                                                   }
  581.                                                   write_ymd(9,day);//日若變化則重新寫入
  582.                                            }
  583.                                 }
  584.                                 if(s5num==1)
  585.                                   {
  586.                                      zhuanhuan();
  587.                                          _shi();                                 
  588.                                      write_sfm(2,pshi);//12小時制小時若變化則重新寫入
  589.                                   }
  590.                                 else write_sfm(2,shi);//24小時制小時若變化則重新寫入                                
  591.                         }
  592.                         write_sfm(5,fen);//分鐘若變化則重新寫入
  593.                 }
  594.                 read_temp();//讀取溫度
  595.     ds1820disp();//溫度顯示
  596.    
  597.                 write_sfm(8,miao);//秒若變化則重新寫入        
  598.                
  599.         ////////分號":"閃爍////////
  600.                 t=miao%2;
  601.                 if(t==0)
  602.                 {write_com(0x80+0x40+7);
  603.                 write_date(' ');}//顯示為空白
  604.                 else{write_com(0x80+0x40+7);
  605.                 write_date(':');}
  606.                
  607.         }        
  608. }


  609. /*****18B20延時1微秒 *****/
  610. void delay_18B20(unsigned int i){
  611. while(i--);
  612. }
  613. /*****ds1820復位*****/
  614. void ds1820rst()
  615. {
  616. unsigned char x=0;
  617. DQ = 1;          //DQ復位
  618. delay_18B20(4);  //延時
  619. DQ = 0;          //DQ拉低
  620. delay_18B20(100); //精確延時大于480us
  621. DQ = 1;          //拉高
  622. delay_18B20(40);   
  623. }  
  624. /*讀數據*/
  625. uchar ds1820rd()  
  626. {
  627. unsigned char i=0;
  628. unsigned char dat = 0;
  629. for (i=8;i>0;i--)
  630. {  DQ = 0; //給脈沖信號
  631. dat>>=1;
  632. DQ = 1; //給脈沖信號
  633. if(DQ)
  634. dat|=0x80;
  635. delay_18B20(10);
  636. }
  637. return(dat);
  638. }
  639. /*寫數據*/
  640. void ds1820wr(uchar wdata)
  641. {unsigned char i=0;
  642. for (i=8; i>0; i--)
  643. { DQ = 0;
  644. DQ = wdata&0x01;
  645. delay_18B20(10);
  646. DQ = 1;
  647. wdata>>=1;
  648. }
  649. }

  650. read_temp()/*讀取溫度值并轉換*/
  651. {uchar a,b;
  652. ds1820rst();   
  653. ds1820wr(0xcc);//*跳過讀序列號*/
  654. ds1820wr(0x44);//*啟動溫度轉換*/

  655. ds1820rst();   
  656. ds1820wr(0xcc);//*跳過讀序列號*/
  657. ds1820wr(0xbe);//*讀取溫度*/
  658. a=ds1820rd();
  659. b=ds1820rd();
  660. value=b;
  661. value<<=8;
  662. value=value|a;
  663. if(value<0x0fff)
  664. flag=0;
  665. else
  666. {value=~value+1;
  667. flag=1;
  668. }
  669. value=value*(0.625);//溫度值擴大10倍,精確到1位小數
  670. return(value);
  671. }


  672. /****************溫度值顯示*****************/
  673. void ds1820disp()
  674. {
  675. uchar flagdat;
  676. disdata[0]=value/1000+0x30;//百位數;加0x30使其與字庫中數字字符對應
  677. disdata[1]=value%1000/100+0x30;//十位數
  678. disdata[2]=value%100/10+0x30;//個位數
  679. disdata[3]=value%10+0x30;//小數位
  680. if(flag==0)
  681. flagdat=0x20;//正溫度不顯示符號;0x20在字庫中對應字符為"空"
  682. else
  683. flagdat=0x2d;//負溫度顯示負號:-
  684. if(disdata[0]==0x30)
  685. {
  686.         disdata[0]=0x20;//如果百位為0,不顯示
  687.   if(disdata[1]==0x30)
  688.   {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
  689.    }
  690. }
  691. write_com(0x80+0x40+10);
  692. write_date(flagdat);//顯示符號位
  693. write_com(0x80+0x40+11);
  694. write_date(disdata[0]);//顯示百位
  695. write_com(0x80+0x40+12);
  696. write_date(disdata[1]);//顯示十位   
  697. write_com(0x80+0x40+13);
  698. write_date(disdata[2]);//顯示個位   
  699. write_com(0x80+0x40+14);
  700. write_date(0x2e);//顯示小數點   
  701. write_com(0x80+0x40+15);
  702. write_date(disdata[3]);//顯示小數位

  703. }


  704. /********************主函數*************************/


  705. void main()
  706. {
  707.         init();//首先初始化各數據               
  708.         while(1)//進入主程序大循環
  709.         {
  710.                
  711.                 keyscan();//不停的檢測按鍵是否被按下
  712.                 if(s1num!=0)
  713.                    led=0;
  714.                 else            
  715.                    led=miao%2;
  716.                
  717.                 if((s6bit==1)&&(fen==0)&&(miao==0)&&(s1num==0))        
  718.                 {
  719.                  di();                 
  720.                  }                                

  721.          }
  722.         
  723.          
  724.          
  725. }








復制代碼




評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:423224 發表于 2020-1-3 12:35 | 只看該作者
這個仿真圖是什么后綴的
回復

使用道具 舉報

板凳
ID:683128 發表于 2020-1-9 13:24 | 只看該作者
這個復位為什么不能到000000
回復

使用道具 舉報

地板
ID:745663 發表于 2020-5-9 19:34 | 只看該作者
為什么第一次檢測到按下的時候判斷s1num==4?用這個程序真的出來了嘛?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产精品一区二区三区 | 久久久久久久久中文字幕 | 日韩亚洲一区二区 | 欧美国产一区二区 | 成人午夜视频在线观看 | 国产不卡一区 | 国产精品视频久久 | 亚洲人a | 久久极品 | 成人av免费| 亚洲性人人天天夜夜摸 | 天天综合操 | 国产精品一区视频 | 国产在线中文字幕 | 欧美激情精品久久久久久变态 | 美女视频网站久久 | 日韩成人一区 | 亚洲精品视频在线播放 | 亚洲国产精品一区二区第一页 | 日韩av一区二区在线观看 | 国产成人精品久久 | 在线免费av观看 | 免费观看色 | 久久久久国产精品一区二区 | 午夜免费在线观看 | 成人乱人乱一区二区三区软件 | 日本a视频 | 欧美一级片a | 99精品国产一区二区三区 | 91免费观看视频 | 精品久久中文字幕 | www.午夜| 国产精品久久久久久久久久99 | 国产一区视频在线 | 九九九视频在线观看 | av在线电影网 | 亚洲高清在线观看 | 日韩欧美视频 | 国产精品日日摸夜夜添夜夜av | 国产日韩精品一区二区三区 | 国产精品久久久久久久久免费桃花 |