找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1823|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的智能饮水机程序电路原理图

[复制链接]
跳转到指定楼层
楼主
制作出来的智能饮水机实物图如下:


智能饮水机电路原理图如下:


单片机智能饮水机源程序如下:
  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"};//显示的数值
  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. //温度初始化函数                        
  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. //读一位字节
  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. //读一位字节
  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. //写入数据
  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. //写入数据 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的数据
  222.         ds_write(0x44);        //d8b20的数据
  223. }

  224. void main()
  225. {        
  226.    Q1=1;
  227.          Q2=1;
  228.          EA=1;
  229. //         IT0=1;
  230. //         EX0=1;         
  231.          TMOD=0x01;                   //设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);          //当RX为零时等待
  248.              TR0=1;                         //开启计数
  249.              while(Echo);    //当RX为1计数并等待
  250.              TR0=0;                     //关闭计数        
  251.              Conut();             //距离显示
  252.               delayms(10);   
  253.              tempchang();    //温度开始转换
  254.              display(read_temp());//温度显示
  255.                  if(key3==0) Q2=0;
  256.                  .................
复制代码

原理图+代码: 08-基于51单片机的智能饮水机.7z (627.92 KB, 下载次数: 12)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表