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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機智能飲水機程序與Proteus仿真圖設計 渾濁度 溫度顯示

  [復制鏈接]
跳轉到指定樓層
樓主
基于51單片機制作的的智能飲水機的具體實現功能:
1.渾濁度、溫度檢測并在液晶上顯示相應數據;
2. 通過調滑動變阻器大小可以修改渾濁度的實時檢測情況;
3. 通過調節DS18B20溫度傳感器模塊上的“+””-“按鈕可以改變溫度;
     溫度數據的正確與否觀察模塊上的數據同LCD液晶是否一致;
4.定時提醒功能:按設置鍵三下進入定時提醒設置,設置好時間后;
   DS1302模塊根據實時顯示的時鐘情況與鬧鐘相比較,一致則定時提醒信號燈亮2s;
5.觸控傳感:用按鍵模擬,當按鍵按下,自動出水信號燈亮,松開則暗。

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


單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535
  4. #include "eeprom52.h"
  5. #include "nongli.h"
  6. #include "intrins.h"

  7. bit flag_200ms ;
  8. bit flag_100ms ;
  9. sbit hello=P2^7;
  10. sbit beep = P3^7;          //蜂鳴器定義
  11. bit flag_beep_en;
  12. uint clock_value;     //用作鬧鐘用的
  13. sbit CLK=        P2^0;//時鐘,初始狀態為0
  14. sbit DI=        P2^1;//數據輸入
  15. sbit DO=        P2^2; // 數據輸出
  16. sbit CS=        P2^3;
  17. sbit control=P2^5;
  18. sbit out=P2^4;
  19. sbit dq   = P3^1;          //18b20 IO口的定義
  20. uchar ADC(uchar ch);
  21. uchar water=0;
  22. uint temperature ;    //溫度變量
  23. uchar flag_nl;        //農歷 陽歷顯示標志位


  24. uchar menu_1,menu_2;



  25. uchar key_time,flag_value;      //用做連加的中間變量
  26. bit key_500ms  ;
  27. uchar n_nian,n_yue,n_ri;                //農歷顯示的函數



  28. #include "ds1302.h"
  29. #include "lcd1602.h"



  30. /******************把數據保存到單片機內部eeprom中******************/
  31. void write_eeprom()
  32. {
  33.         SectorErase(0x2000);
  34.         byte_write(0x2000, fen1);
  35.         byte_write(0x2001, shi1);
  36.         byte_write(0x2002, open1);
  37.         byte_write(0x2058, a_a);        
  38. }

  39. /******************把數據從單片機內部eeprom中讀出來*****************/
  40. void read_eeprom()
  41. {
  42.         fen1  = byte_read(0x2000);
  43.         shi1  = byte_read(0x2001);
  44.         open1  = byte_read(0x2002);
  45.         a_a      = byte_read(0x2058);
  46. }

  47. /**************開機自檢eeprom初始化*****************/
  48. void init_eeprom()
  49. {
  50.         read_eeprom();                //先讀
  51.         if(a_a != 1)                //新的單片機初始單片機內問eeprom
  52.         {
  53.                 fen1  = 3;
  54.                 shi1  = 8;
  55.                 open1  = 1;
  56.                 a_a = 1;
  57.                 write_eeprom();           //保存數據
  58.         }        
  59. }

  60. /***********************18b20初始化函數*****************************/
  61. void init_18b20()
  62. {
  63.         bit q;
  64.         dq = 1;                                //把總線拿高
  65.         delay_uint(1);            //15us
  66.         dq = 0;                                //給復位脈沖
  67.         delay_uint(80);                //750us
  68.         dq = 1;                                //把總線拿高 等待
  69.         delay_uint(10);                //110us
  70.         q = dq;                                //讀取18b20初始化信號
  71.         delay_uint(20);                //200us
  72.         dq = 1;                                //把總線拿高 釋放總線
  73. }

  74. /*************寫18b20內的數據***************/
  75. void write_18b20(uchar dat)
  76. {
  77.         uchar i;
  78.         for(i=0;i<8;i++)
  79.         {                                         //寫數據是低位開始
  80.                 dq = 0;                         //把總線拿低寫時間隙開始
  81.                 dq = dat & 0x01; //向18b20總線寫數據了
  82.                 delay_uint(5);         // 60us
  83.                 dq = 1;                         //釋放總線
  84.                 dat >>= 1;
  85.         }        
  86. }

  87. /*************讀取18b20內的數據***************/
  88. uchar read_18b20()
  89. {
  90.         uchar i,value;
  91.         for(i=0;i<8;i++)
  92.         {
  93.                 dq = 0;                         //把總線拿低讀時間隙開始
  94.                 value >>= 1;         //讀數據是低位開始
  95.                 dq = 1;                         //釋放總線
  96.                 if(dq == 1)                 //開始讀寫數據
  97.                         value |= 0x80;
  98.                 delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
  99.         }
  100.         return value;                 //返回數據
  101. }

  102. /*************讀取溫度的值 讀出來的是小數***************/
  103. uint read_temp()
  104. {
  105.         uint value;
  106.         uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
  107.         init_18b20();                   //初始化18b20
  108.         write_18b20(0xcc);           //跳過64位ROM
  109.         write_18b20(0x44);           //啟動一次溫度轉換命令
  110.         delay_uint(50);                   //500us

  111.         init_18b20();                   //初始化18b20
  112.         
  113.         write_18b20(0xcc);           //跳過64位ROM
  114.         write_18b20(0xbe);           //發出讀取暫存器命令
  115.         
  116.         EA = 0;
  117.         low = read_18b20();           //讀溫度低字節
  118.         value = read_18b20();  //讀溫度高字節
  119.         EA = 1;
  120.         value <<= 8;                   //把溫度的高位左移8位
  121.         value |= low;                   //把讀出的溫度低位放到value的低八位中
  122.         value *= 0.625;               //轉換到溫度值 小數
  123.         return value;                   //返回讀出的溫度 帶小數
  124. }



  125. /******************1ms 延時函數*******************/
  126. void delay_1ms(uint q)
  127. {
  128.         uint i,j;
  129.         for(i=0;i<q;i++)
  130.                 for(j=0;j<120;j++);
  131. }

  132. /******************寫星期函數*******************/
  133. void write_week(uchar hang,uchar add,uchar week)//寫星期函數
  134. {
  135.         if(hang==1)   
  136.                 write_com(0x80+add);
  137.         else
  138.                 write_com(0x80+0x40+add);         
  139.         switch(week)
  140.         {
  141.                 case 1:write_data('M');//星期數為1時,顯示
  142.                            write_data('O');
  143.                            write_data('N');
  144.                            break;
  145.            
  146.                 case 2:write_data('T');//星期數據為2時顯示
  147.                            write_data('U');
  148.                            write_data('E');
  149.                            break;
  150.                
  151.                 case 3:write_data('W');//星期數據為3時顯示
  152.                            write_data('E');
  153.                            write_data('D');
  154.                            break;
  155.                
  156.                 case 4:write_data('T');//星期數據為4是顯示
  157.                            write_data('H');
  158.                            write_data('U');
  159.                            break;
  160.                
  161.                 case 5:write_data('F');//星期數據為5時顯示
  162.                            write_data('R');
  163.                            write_data('I');
  164.                            break;
  165.                
  166.                 case 6:write_data('S');//星期數據為6時顯示
  167.                            write_data('T');
  168.                            write_data('A');
  169.                            break;
  170.                
  171.                 case 7:write_data('S');//星期數據為7時顯示
  172.                            write_data('U');
  173.                            write_data('N');
  174.                            break;
  175.         }
  176. }

  177. /*************時鐘顯示***************/
  178. void init_1602_ds1302()
  179. {
  180.         write_sfm2_ds1302(1,1,shi);                   //顯示時
  181.         write_sfm2_ds1302(1,4,fen);                   //顯示分
  182.         write_sfm2_ds1302(1,7,miao);           //顯示秒
  183.         write_sfm4_ppm(2,12,water);
  184.   //write_sfm1(1,14,week);                           //顯示星期
  185.         write_sfm3_18B20(1,11,temperature);           //顯示溫度
  186.         if(flag_nl == 0)  //顯示陽歷
  187.         {
  188.                 write_sfm2_ds1302(2,2,nian);   //顯示年
  189.                 write_sfm2_ds1302(2,5,yue);           //顯示月        
  190.                 write_sfm2_ds1302(2,8,ri);           //顯示日         
  191.         }
  192.         else                          //顯示農歷
  193.         {
  194.                 write_sfm2_ds1302(2,2,n_nian);        //顯示年
  195.                 write_sfm2_ds1302(2,5,n_yue);        //顯示月        
  196.                 write_sfm2_ds1302(2,8,n_ri);        //顯示日
  197.                
  198.         }
  199.         

  200.         
  201.                
  202. }                                                                           

  203. /*************定時器0初始化程序***************/
  204. void init_time0()         
  205. {
  206.         EA   = 1;                   //開總中斷
  207.         TMOD = 0X01;          //定時器0、工作方式1
  208.         ET0  = 1;                  //開定時器0中斷
  209.         TR0  = 1;                  //允許定時器0定時
  210. }

  211. /*************鬧鐘報警函數***************/
  212. void menu_dis()
  213. {
  214.         static uchar mm,value;
  215.         if(flag_100ms == 1)                  //100ms執行一次
  216.         {
  217.                 flag_100ms = 0;
  218.                 if(open1 == 1)        //如果鬧鐘打開
  219.                 {
  220.                         if((miao == 0) && (fen == fen1) && (shi == shi1))
  221.                         {                 
  222.                                 flag_beep_en = 1;        //有報警 打開蜂鳴器響的標志位                                
  223.                         }               
  224.                         if(flag_beep_en == 1)        //鬧鐘以被打開
  225.                         {
  226.                                 clock_value++;
  227.                                 if(clock_value <= 30)         
  228.                                         beep = ~beep;           //蜂鳴器叫3秒
  229.                                 else if(clock_value > 30)
  230.                                 {
  231.                                         beep = 1;                    //蜂鳴器停1秒
  232.                                         if(clock_value > 40)
  233.                                         {
  234.                                                 clock_value = 0;

  235.                                         }
  236.                                 }
  237.                                 //  1 分鐘后自動關閉鬧鐘
  238.                                 value ++;
  239.                                 if(value >= 10)
  240.                                 {
  241.                                         value = 0;
  242.                                         mm++;
  243.                                         if(mm >= 60)
  244.                                         {
  245.                                                 mm = 0;
  246.                                                 flag_beep_en = 0;
  247.                                                 beep = 1;        
  248.                                         }
  249.                                 }                                       
  250.                         }
  251.                 }        
  252.         }
  253. }


  254. /********************獨立按鍵程序*****************/
  255. uchar key_can;         //按鍵值

  256. void key()         //獨立按鍵程序
  257. {
  258.         static uchar key_new;
  259.         key_can = 20;                   //按鍵值還原
  260.         P3 |= 0x78;                     //對應的按鍵IO口輸出為1
  261.         if((P3 & 0x78) != 0x78)                //按鍵按下
  262.         {
  263.                 delay_1ms(1);                     //按鍵消抖動
  264.                 if(((P3 & 0x78) != 0x78) && (key_new == 1))
  265.                 {                                                //確認是按鍵按下
  266.                         key_new = 0;
  267.                         switch(P3 & 0x78)
  268.                         {
  269.                                 case 0x70:  key_can = 4;  break;         //得到按鍵值
  270.                                 case 0x68:  key_can = 3;  break;         //得到按鍵值
  271.                                 case 0x58:  key_can = 2;  break;         //得到按鍵值
  272.                                 case 0x38:  key_can = 1;  break;         //得到按鍵值
  273.                         }
  274. //                        write_sfm2(1,0,key_can);                                 //顯示按鍵值
  275.                 }                        
  276.         }
  277.         else
  278.                 key_new = 1;        
  279. }


  280. /**********************設置函數************************/
  281. void key_with()
  282. {
  283.         if(key_can == 1)        //設置鍵
  284.         {
  285.                 menu_1++;
  286.                 if(menu_1 == 1)          //設置時間
  287.                 {
  288.                         menu_2 = 1;
  289.                         write_string(1,0,"    :  :    W:  ");                        
  290.                         write_string(2,0," 20  -  -       ");        
  291.                 }
  292.                 if(menu_1 == 2)          //設置鬧鐘
  293.                 {
  294.                         menu_2 = 1;
  295.                         write_string(1,0,"   set clock    ");                        
  296.                         write_string(2,0,"    Y  00:00      ");        
  297.                 }
  298.                 if(menu_1 > 2)    //回到正常顯示
  299.                 {
  300.                         menu_1 = 0;
  301.                         write_guanbiao(1,2,0);         //關閉光標
  302.                         init_1602_dis_csf();      //初始化液晶顯示               
  303.                 }
  304.         }
  305.         if(key_can == 2)        //選擇鍵
  306.         {
  307.                 flag_200ms = 1;
  308.                 if(menu_1 == 1)                  //設置時間
  309.                 {
  310.                         menu_2 ++;
  311.                         if(menu_2 > 7)
  312.                                 menu_2 = 1;
  313.                 }
  314.                 if(menu_1 == 2)                 //設置鬧鐘
  315.                 {
  316.                         menu_2 ++;
  317.                         if(menu_2 > 3)
  318.                                 menu_2 = 1;                                
  319.                 }
  320.         }
  321.         if(menu_1 == 1)
  322.         {
  323.                 if(menu_2 == 1)                  //設置時
  324.                 {
  325.                         if(key_can == 3)        //加
  326.                         {
  327.                                 shi+=0x01;
  328.                                 if((shi & 0x0f) >= 0x0a)
  329.                                         shi = (shi & 0xf0) + 0x10;           ///***shi & 0xf0低四位清零,(shi & 0xf0) + 0x10向高位進1(高四位加1)***///                                if(shi >= 0x24)
  330.                                         shi = 0;
  331.                         }               
  332.                         if(key_can == 4)        //減
  333.                         {
  334.                                 if(shi == 0x00)         
  335.                                         shi = 0x24;
  336.                                 if((shi & 0x0f) == 0x00)  
  337.                                         shi = (shi | 0x0a) - 0x10;         ///***如果個位為0,高四位減1***///
  338.                                 shi -- ;
  339.                         }                                          
  340.                 }
  341.                 if(menu_2 == 2)                  //設置分
  342.                 {
  343.                         if(key_can == 3)        //加
  344.                         {
  345.                                 fen+=0x01;
  346.                                 if((fen & 0x0f) >= 0x0a)
  347.                                         fen = (fen & 0xf0) + 0x10;
  348.                                 if(fen >= 0x60)
  349.                                         fen = 0;
  350.                         }               
  351.                         if(key_can == 4)        //減         
  352.                         {
  353.                                 if(fen == 0x00)
  354.                                         fen = 0x5a;
  355.                                 if((fen & 0x0f) == 0x00)
  356.                                         fen = (fen | 0x0a) - 0x10;
  357.                                 fen -- ;
  358.                         }        
  359.                 }
  360.                 if(menu_2 == 3)                  //設置秒
  361.                 {
  362.                         if(key_can == 3)        //加
  363.                         {
  364.                                 miao+=0x01;
  365.                                 if((miao & 0x0f) >= 0x0a)
  366.                                         miao = (miao & 0xf0) + 0x10;
  367.                                 if(miao >= 0x60)
  368.                                         miao = 0;
  369.                         }        
  370.                         if(key_can == 4)        //減         
  371.                         {
  372.                                 if(miao == 0x00)
  373.                                         miao = 0x5a;
  374.                                 if((miao & 0x0f) == 0x00)
  375.                                         miao = (miao | 0x0a) - 0x10;
  376.                                 miao -- ;                        
  377.                         }
  378.                 }
  379.                 if(menu_2 == 4)                  //設置星期
  380.                 {
  381.                         if(key_can == 3)        //加
  382.                         {
  383.                             week+=0x01;
  384.                                 if((week & 0x0f) >= 0x0a)
  385.                                         week = (week & 0xf0) + 0x10;
  386.                                 if(week >= 0x08)
  387.                                         week = 1;
  388.                         }               
  389.                         if(key_can == 4)        //減         
  390.                         {
  391.                                 if(week == 0x01)
  392.                                         week = 0x08;
  393.                                 if((week & 0x0f) == 0x00)
  394.                                         week = (week | 0x0a) - 0x10;
  395.                                 week -- ;
  396.                         }        
  397.                 }
  398.                 if(menu_2 == 5)                  //設置年
  399.                 {
  400.                         if(key_can == 3)        //加
  401.                         {
  402.                             nian+=0x01;
  403.                                 if((nian & 0x0f) >= 0x0a)
  404.                                         nian = (nian & 0xf0) + 0x10;
  405.                                 if(nian >= 0x9a)
  406.                                         nian = 1;
  407.                         }               
  408.                         if(key_can == 4)        //減         
  409.                         {
  410.                                 if(nian == 0x01)
  411.                                         nian = 0x9a;
  412.                                 if((nian & 0x0f) == 0x00)
  413.                                         nian = (nian | 0x0a) - 0x10;
  414.                                 nian -- ;               
  415.                         }        
  416.                 }
  417.                 if(menu_2 == 6)                  //設置月
  418.                 {
  419.                         if(key_can == 3)        //加
  420.                         {
  421.                             yue+=0x01;
  422.                                 if((yue & 0x0f) >= 0x0a)
  423.                                         yue = (yue & 0xf0) + 0x10;
  424.                                 if(yue >= 0x13)
  425.                                         yue = 1;
  426.                         }               
  427.                         if(key_can == 4)        //減         
  428.                         {
  429.                                 if(yue == 0x01)
  430.                                         yue = 0x13;
  431.                                 if((yue & 0x0f) == 0x00)
  432.                                         yue = (yue | 0x0a) - 0x10;
  433.                                 yue -- ;                                       
  434.                         }        
  435.                 }
  436.                 if(menu_2 == 7)                  //設置日
  437.                 {
  438.                         if(key_can == 3)        //加
  439.                         {
  440.                     ri+=0x01;
  441.                         if((ri & 0x0f) >= 0x0a)
  442.                                 ri = (ri & 0xf0) + 0x10;
  443.                         if(ri >= 0x32)
  444.                                 ri = 0;                        
  445.                         }               
  446.                         if(key_can == 4)        //減         
  447.                         {
  448.                                 if(ri == 0x01)
  449.                                         ri = 0x32;
  450.                                 if((ri & 0x0f) == 0x00)
  451.                                         ri = (ri | 0x0a) - 0x10;
  452.                                 ri -- ;                        
  453.                         }        
  454.                 }
  455.                 write_sfm2_ds1302(1,2,shi);           ///***第一行第二字節開始顯示時,從十位開始寫***///
  456.                 write_sfm2_ds1302(1,5,fen);           //顯示分
  457.                 write_sfm2_ds1302(1,8,miao);           //顯示秒
  458.                 write_sfm1(1,14,week);           //顯示星期                                       
  459.                 write_sfm2_ds1302(2,3,nian);           //顯示年
  460.                 write_sfm2_ds1302(2,6,yue);           //顯示月
  461.                 write_sfm2_ds1302(2,9,ri);           //顯示日
  462.   ///***write_sfm3_18B20(2,12,temperature);           //顯示溫度        ***///        
  463.                 switch(menu_2)           // 光標顯示
  464.                 {
  465.                         case 1:  write_guanbiao(1,2,1);  break;
  466.                         case 2:  write_guanbiao(1,5,1);  break;
  467.                         case 3:  write_guanbiao(1,8,1);  break;
  468.                         case 4:  write_guanbiao(1,14,1);  break;
  469.                         case 5:  write_guanbiao(2,3,1);  break;
  470.                         case 6:  write_guanbiao(2,6,1);  break;
  471.                         case 7:  write_guanbiao(2,9,1);  break;
  472.                 }
  473.                 write_time();           //把時間寫進去
  474.         }        
  475. /***************設置鬧鐘*********************/
  476.         if(menu_1 == 2)
  477.         {
  478.                 if(menu_2 == 1)                  //設置鬧鐘開關
  479.                 {
  480.                         if(key_can == 3)        
  481.                         {
  482.                                 open1 = 1;          //鬧鐘開
  483.                         }               
  484.                         if(key_can == 4)        
  485.                         {
  486.                                 open1 = 0;          //鬧鐘關
  487.                         }                                          
  488.                 }
  489.                 if(menu_2 == 2)                  //設置鬧鐘時
  490.                 {
  491.                         if(key_can == 3)        //加
  492.                         {
  493.                             shi1+=0x01;
  494.                                 if((shi1 & 0x0f) >= 0x0a)
  495.                                         shi1 = (shi1 & 0xf0) + 0x10;
  496.                                 if(shi1 >= 0x24)
  497.                                         shi1 = 0;
  498.                         }               
  499.                         if(key_can == 4)        //減         
  500.                         {
  501.                                 if(shi1 == 0x00)
  502.                                         shi1 = 0x5a;
  503.                                 if((shi1 & 0x0f) == 0x00)
  504.                                         shi1 = (shi1 | 0x0a) - 0x10;
  505.                                 shi1 -- ;
  506.                         }        
  507.                 }
  508.                 if(menu_2 == 3)                  //設置秒
  509.                 {
  510.                         if(key_can == 3)        //加
  511.                         {
  512.                             fen1+=0x01;
  513.                                 if((fen1 & 0x0f) >= 0x0a)
  514.                                         fen1 = (fen1 & 0xf0) + 0x10;
  515.                                 if(fen1 >= 0x60)
  516.                                         fen1 = 0;
  517.                         }        
  518.                         if(key_can == 4)        //減         
  519.                         {
  520.                                 if(fen1 == 0x00)
  521.                                         fen1 = 0x5a;
  522.                                 if((fen1 & 0x0f) == 0x00)
  523.                                         fen1 = (fen1 | 0x0a) - 0x10;
  524.                                 fen1 -- ;                        
  525.                         }
  526.                 }
  527.                 if(open1 == 1)
  528.                         write_string(2,4,"Y");        
  529.                 else
  530.                         write_string(2,4,"N");        
  531.                 write_sfm2_ds1302(2,7,shi1);           //顯示鬧鐘時
  532.                 write_sfm2_ds1302(2,10,fen1);           //顯示鬧鐘分
  533.                 switch(menu_2)           // 光標顯示
  534.                 {
  535.                         case 1:  write_guanbiao(2,4,1);  break;
  536.                         case 2:  write_guanbiao(2,7,1);  break;
  537.                         case 3:  write_guanbiao(2,10,1);  break;
  538.                 }        
  539.                 write_eeprom();     //保存鬧鐘時間
  540.         }                        
  541. }

  542. /*****************主函數********************/
  543. void main()
  544. {        
  545.         beep = 0;                                //開機叫一聲   
  546.         delay_1ms(150);
  547.         P0 = P1 = P2 = P3 = 0xff;                //單片機IO口初始化為1
  548.         init_time0();                 //初始化定時器
  549.         init_ds1302();                 //ds1302初始化
  550.         init_1602();                 //lcd1602初始化
  551.         init_1602_dis_csf(); //lcd1602初始化顯示
  552.         init_eeprom();       //開始初始化保存的數據
  553.         temperature = read_temp();        //先讀出溫度的值
  554.         delay_1ms(650);
  555.         temperature = read_temp();        //先讀出溫度的值
  556.         while(1)
  557.         {        water=ADC(2);
  558.                 key();                         //按鍵程序
  559.                 if((shi == shi1)&&(fen==fen1)&&(miao==0))
  560.                 {hello=1;delay_1ms(2000);}
  561.         else hello=0;
  562.                 if(control==0) out=1;
  563.                 else out=0;
  564.                 if(key_can < 10)
  565.                 {
  566.                         if(flag_beep_en == 0)  //只有鬧鐘關了的時候才能進入設置
  567.                                 key_with();        
  568.                         else
  569.                         {
  570.                                 flag_beep_en = 0;         //按下任意鍵可關閉鬧鐘
  571.                                 beep = 1;
  572.                                 clock_value = 0;
  573.                                 read_time();
  574.                         }
  575.                         if(menu_1 == 0)
  576.                         {
  577.                                 if(key_can == 4)  //減鍵
  578.                                 {
  579.                                         flag_nl = ~flag_nl;                  //切換農歷和陽歷的顯示標志位        
  580.                                         if(flag_nl == 0)
  581.                                                 write_string(2,0,"2016");
  582.                                         else         
  583.                                                 write_string(2,0,"N ");
  584.                                 }
  585.                         }
  586.                 }
  587.                
  588.                 if(flag_200ms == 1)
  589.                 {        
  590.                         flag_200ms = 0;
  591.                         if(menu_1 == 0)
  592.                         {
  593.                                 read_time();                  //讀時間
  594.                                 temperature = read_temp();        //先讀出溫度的值
  595.                                 init_1602_ds1302();   //顯示時鐘
  596.                         }
  597.                 }
  598.                 menu_dis();           //鬧鐘報警函數
  599.                 delay_1ms(1);
  600.         }
  601. }

  602. /**************定時器0中斷程序*****************/
  603. void time0() interrupt 1
  604. {                        
  605.         static uchar value;
  606.         TH0 = 0X3C;
  607.         TL0 = 0XB0;           //50ms
  608.         value ++;           
  609.         if(shi == shi1)
  610.                 hello=1;
  611.         else hello=0;
  612.         if((value % 2) == 0)         //100ms  
  613.                 flag_100ms = 1;         
  614.         if(value >= 6)                         //200ms
  615.         {
  616.                 value = 0;
  617.                 flag_200ms = 1;
  618.         }
  619. }

  620. uchar ADC(uchar ch)//通道ch         1,2
  621. {
  622.         uchar temp0,temp1,i;
  623.         CS=0;
  624.         temp0=0;
  625.         temp1=0;
  626.         _nop_();
  627.         _nop_();
  628.         DI=1;//開始位
  629.         _nop_();
  630.         _nop_();
  631.         CLK=1;
  632.         _nop_();
  633.         _nop_();
  634.         CLK=0;
  635.         _nop_();
  636.         _nop_();
  637.         DI=0;
  638.         _nop_();
  639.         _nop_();
  640. //選擇通道0
  641.         DI=1;
  642.         _nop_();
  643.         CLK=1;//上升沿DI=1
  644.         _nop_();
  645.         CLK=0;//1個下降沿DI=1
  646.         _nop_();
  647.         if(ch==1)
  648.         DI=0;
  649.         if(ch==2)
  650.         DI=1;
  651.         _nop_();
  652.         CLK=1;
  653.         _nop_();
  654.         CLK=0;//第3個上升沿DI=0
  655.         _nop_();
  656.            DI=1;
  657. //********通道選擇結束開始讀取轉換后的二進制數****
  658. //下降沿讀數,一下進行判斷和處理,共8次
  659. for(i=0;i<8;i++)
  660.    {
  661.         temp0=temp0<<1;
  662.         CLK=1;
  663.     if(DO)
  664.            temp0++;
  665.            _nop_();
  666.            CLK=0;
  667.    }
  668. for(i=0;i<8;i++)
  669.    {
  670.         temp1=temp1>>1;
  671.         CLK=1;
  672.     if(DO)
  673.            temp1=temp1 +0x80;
  674.            _nop_();
  675.            CLK=0;
  676.    }
  677.          CS=1;
  678.    return temp0;
  679. }
復制代碼

所有資料51hei附件下載:
智能飲水機仿真代碼.7z (106.41 KB, 下載次數: 156)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:965040 發表于 2024-3-2 20:35 | 只看該作者
8.13版本 的才可以用
回復

使用道具 舉報

板凳
ID:210588 發表于 2024-4-22 14:14 | 只看該作者
仿真電路圖缺文件的
回復

使用道具 舉報

地板
ID:1118179 發表于 2024-4-24 21:35 | 只看該作者
可以的 很精彩,內容有點干貨
回復

使用道具 舉報

5#
ID:262 發表于 2024-4-26 03:12 | 只看該作者
lyh一點點 發表于 2024-4-22 14:14
仿真電路圖缺文件的

8.13版本可以打開啊
回復

使用道具 舉報

6#
ID:1123985 發表于 2024-6-6 17:12 來自手機 | 只看該作者
為什么,他那個控制不了自動出水信號燈
回復

使用道具 舉報

7#
ID:1033765 發表于 2024-6-9 09:58 | 只看該作者
那個定時提醒信號燈要怎么設置才可以亮呀?
回復

使用道具 舉報

8#
ID:1033765 發表于 2024-6-9 14:49 | 只看該作者
渾濁度顯示屏與檢測模塊不需要保持一致嗎?
回復

使用道具 舉報

9#
ID:1139230 發表于 2024-12-10 14:26 | 只看該作者
回帖助人的獎勵!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产a级 | 亚洲精品成人在线 | 欧美日韩一区二区三区不卡视频 | 欧美一级片在线看 | 久久久久国产精品一区 | 亚洲成人av | 欧美不卡视频一区发布 | 成人三级av | 久久精品久久精品 | 久久爆操 | 国产真实精品久久二三区 | 成人免费视频网站在线看 | 在线伊人 | 黄色香蕉视频在线观看 | 成人福利在线观看 | 国产美女视频黄a视频免费 国产精品福利视频 | 日韩精品免费视频 | 黑人巨大精品欧美一区二区免费 | 欧美日韩不卡合集视频 | 亚洲国产精品精华素 | 亚洲成人av一区二区 | 91中文在线观看 | 国产精品久久久久久中文字 | 91免费看片| 一区二区三区在线 | 91精品久久久久久久久中文字幕 | 91精产国品一二三区 | 91精品国产欧美一区二区 | 亚洲成人中文字幕 | 亚洲av毛片 | 欧美精品区 | 亚洲欧美一区二区三区在线 | 在线视频一区二区 | 欧美成视频 | 久久久久亚洲 | 亚洲欧美高清 | 久久国产精品一区二区三区 | 91精品久久久 | 国产99久久精品一区二区永久免费 | 91久久久久久久久久久久久 | 午夜在线影院 |