找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的智能飲水機程序電路原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1108110 發(fā)表于 2024-6-12 20:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
制作出來的智能飲水機實物圖如下:


智能飲水機電路原理圖如下:


單片機智能飲水機源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. int num=0;
  6. unsigned char table[]={"0123456789"};//顯示的數(shù)值
  7. //   1602的引腳定義
  8. sbit RW=P2^1;
  9. sbit RS=P2^0;  
  10. sbit E=P2^2;   

  11. //報警引腳定義
  12. sbit Q1=P1^4;
  13. sbit Q2=P1^2;
  14. sbit key3=P1^5;
  15. sbit key1=P1^0;
  16. sbit key2=P1^1;

  17. int numm=0,nnum=0;

  18. void delayms(unsigned int ms)
  19. {
  20.         unsigned char i=100,j;
  21.         for(;ms;ms--)
  22.         {
  23.                 while(--i)
  24.                 {
  25.                         j=10;
  26.                         while(--j);
  27.                 }
  28.         }
  29. }

  30. bit flag;           //溫度變量
  31. uint temp;
  32. sbit ds=P1^3;  //溫度引腳

  33. //超聲波位定義
  34. sbit Trig = P3^7;
  35. sbit Echo = P3^6;
  36. uint time=0;
  37. unsigned long S=0;
  38. bit flagg=0;

  39. void delay2(uchar p)
  40.         {
  41.           uchar l,k;
  42.            for(l=p;l>0;l--)
  43.               for(k=110;k>0;k--);
  44.         }

  45. void delay(uchar z)
  46. {
  47.     while(z--);
  48. }

  49. //溫度初始化函數(shù)                        
  50. void ds_reste()         
  51. {
  52.         ds=1;
  53.         delay(5);
  54.         ds=0;
  55.         delay(80);
  56.         ds=1;
  57.         delay(14);
  58.         if(ds==0)                 //判斷ds總線被拉低
  59.         flag=1;
  60.         else
  61.         flag=0;
  62.         delay(20);
  63. }

  64. //讀一位字節(jié)
  65. bit ds_read_byte()        
  66. {
  67.          bit dat;
  68.          ds=0;               
  69.          _nop_();
  70.          _nop_();
  71.          ds=1;
  72.          _nop_();
  73.          dat=ds;         
  74.          delay(10);
  75.          return dat;
  76. }

  77. //讀一位字節(jié)
  78. uchar ds_read()        
  79. {
  80.         uchar i,j,k;
  81.       for(i=0;i<8;i++)
  82.         {
  83.         j=ds_read_byte();
  84.         k=(j<<7)|(k>>1);
  85.         }
  86.          return k;
  87. }

  88. //寫入數(shù)據(jù)
  89. void ds_write(uchar dat)
  90. {
  91.          uchar i;
  92.          for(i=0;i<8;i++)
  93.     {
  94.          ds=0;
  95.          _nop_();
  96.          ds=dat&0x01;
  97.          delay(6);
  98.          ds=1;
  99.          dat=dat>>1;
  100.         }
  101.          delay(6);
  102. }

  103. //讀取溫度
  104. uint read_temp()         
  105. {
  106.         uchar a,b;
  107.         ds_reste();
  108.         ds_write(0xcc);
  109.         ds_write(0xbe);
  110.         a=ds_read();
  111.         b=ds_read();
  112.         temp=b;
  113.         temp=temp<<8;
  114.         temp=temp|a;
  115.         temp=temp*0.0625*10+0.5;                 
  116.         return temp;
  117. }

  118. //寫入命令1602
  119. void write_com(uchar com)           
  120. {
  121.         RS=0;
  122.         RW=0;
  123.         E=0;
  124.         P0=com;           
  125.         delay2(5);
  126.         E=1;
  127.         delay2(5);
  128.         E=0;
  129. }

  130. //寫入數(shù)據(jù) 1602
  131. void write_data(uchar date)        
  132. {
  133.         RS=1;
  134.         RW=0;
  135.         E=0;
  136.         P0=date;               
  137.         delay2(5);
  138.         E=1;
  139.         delay2(5);
  140.         E=0;
  141. }

  142. //1602初始化顯示
  143. void init()                                 
  144. {
  145.     RS=0;
  146.         write_com(0x38);
  147.          write_com(0x0c);
  148.          write_com(0x06);
  149.         write_com(0x01);
  150.         write_com(0x80);
  151.                   write_com(0x80+0x40);
  152.           write_data('C');
  153.                 write_com(0x80+0x41);
  154.           write_data('O');
  155.                 write_com(0x80+0x42);
  156.           write_data('L');
  157.                 write_com(0x80+0x43);
  158.           write_data('D');
  159. }

  160. //溫度在1602上顯示出來
  161. void display(uint tempp)           
  162. {  
  163.          write_com(0x80+0x0b);                        
  164.          write_data(table[tempp/100]);         
  165.          delay2(0);
  166.   
  167.          write_com(0x80+0x0c);
  168.          write_data(table[tempp%100/10]);           
  169.          delay2(0);        

  170.             write_com(0x80+0x0d);
  171.          write_data('.');                           
  172.          delay2(0);
  173.    
  174.             write_com(0x80+0x0e);
  175.          write_data(table[tempp%100%10]);
  176.          delay2(0);                                                         

  177.          write_com(0x80+0x0f);
  178.          write_data('C');                                    
  179.          delay2(0);

  180.          write_com(0x80+0x09);
  181.          write_data('T');                                    
  182.          delay2(0);

  183.          write_com(0x80+0x0a);
  184.          write_data(':');                                 
  185.          delay2(0);
  186. if(tempp>50) Q1=0;
  187. else Q1=1;
  188. }

  189. //超聲波測距
  190. void Conut(void)
  191.         {  
  192.          time=TH0*256+TL0;
  193.          TH0=0;
  194.          TL0=0;
  195.          S=(time*1.7)/100+1;                //算出來測距值單位是CM
  196.          if((S>1000)||S<1||flagg==1)           //超出測量范圍顯示“***”
  197. //按鍵控制
  198. void KEY()
  199. {
  200.    if(key1==0)
  201.    {
  202.              delay2(2);         

  203. void  StartModule()          //啟動模塊
  204.   {
  205.           Trig=1;         //啟動一次模塊
  206.           _nop_(); _nop_(); _nop_();
  207.           _nop_(); _nop_(); _nop_();
  208.           _nop_(); _nop_(); _nop_();
  209.           _nop_(); _nop_(); _nop_();
  210.           _nop_(); _nop_(); _nop_();
  211.           _nop_(); _nop_(); _nop_();
  212.           _nop_(); _nop_(); _nop_();
  213.            
  214.           Trig=0;  
  215.          
  216.   }

  217. void tempchang(void)
  218. {
  219.            ds_reste();          //d8b20的初始化
  220.         delay2(1);
  221.         ds_write(0xcc);        //d8b20的數(shù)據(jù)
  222.         ds_write(0x44);        //d8b20的數(shù)據(jù)
  223. }

  224. void main()
  225. {        
  226.    Q1=1;
  227.          Q2=1;
  228.          EA=1;
  229. //         IT0=1;
  230. //         EX0=1;         
  231.          TMOD=0x01;                   //設(shè)T0為方式1,GATE=1;
  232.          TH0=0;
  233.          TL0=0;
  234.          TR0=1;         
  235.          ET0=1;             //允許T0中斷
  236. //       TH1=(65536-5000)/256;
  237. //         TL1=(65536-5000)%256;
  238. //         TR1=1;         
  239. //         ET1=1;         
  240.          init();                          //1602的初始化                  
  241.      
  242.          while(1)
  243.          {
  244.              display1();        //顯示按鍵值                           
  245.              KEY();                         //按鍵         
  246.                StartModule();
  247.              while(!Echo);          //當(dāng)RX為零時等待
  248.              TR0=1;                         //開啟計數(shù)
  249.              while(Echo);    //當(dāng)RX為1計數(shù)并等待
  250.              TR0=0;                     //關(guān)閉計數(shù)        
  251.              Conut();             //距離顯示
  252.               delayms(10);   
  253.              tempchang();    //溫度開始轉(zhuǎn)換
  254.              display(read_temp());//溫度顯示
  255.                  if(key3==0) Q2=0;
  256.                  .................
復(fù)制代碼

原理圖+代碼: 08-基于51單片機的智能飲水機.7z (627.92 KB, 下載次數(shù): 12)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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