找回密码
 立即注册

QQ登录

只需一步,快速开始

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

微波炉温度控制系统单片机源码

[复制链接]
跳转到指定楼层
楼主
ID:302637 发表于 2018-4-6 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int   
  4. uchar i;
  5. sbit lcdrs=P2^6;
  6. sbit lcdrw=P2^5;
  7. sbit lcden=P2^7;
  8. sbit  d1=P1^0;
  9. sbit  d2=P1^1;
  10. sbit  d3=P2^0;
  11. sbit  d4=P2^1;
  12. sbit  d5=P2^2;
  13. sbit  sound=P1^2;
  14. uchar code t0[]="the temperature ";  
  15. uchar code t1[]=" is             ";
  16. uchar code wendu[]="0123456789";                 //利用一个温度表解决温度显示乱码
  17. uchar second;
  18. uchar timer;
  19. void t1_init()
  20. {
  21.     TMOD=0x10;
  22.     IE=0X88;
  23.     TH1=0X3c;
  24.     TL1=0Xb0;
  25. }
  26. sbit DQ = P3^7;                                    //定义ds18B20总线IO
  27.                                                 //液晶显示模块
  28. void delay(uint z)         
  29. {
  30.    uint x,y;
  31.    for(x=100;x>1;x--);
  32.         for(y=z;y>1;y--);
  33. }
  34. void write_com(uchar com)
  35. {
  36.     lcdrs=0;
  37.     P0=com;
  38.     delay(5);
  39.     lcden=1;
  40.     delay(5);
  41.     lcden=0;
  42. }
  43. void write_date(uchar date)
  44. {
  45.     lcdrs=1;
  46.     P0=date;
  47.     delay(5);
  48.     lcden=1;
  49.     delay(5);
  50.     lcden=0;
  51. }
  52. void init_lcd()
  53. {
  54.        lcden=0;
  55.        lcdrw=0;
  56.        write_com(0x38);
  57.        write_com(0x01);
  58.        write_com(0x0c);
  59.        write_com(0x06);
  60.        write_com(0x80);
  61.        for(i=0;i<16;i++)
  62.     {
  63.          write_date(t0[i]);
  64.          delay(0);
  65.     }
  66.        write_com(0x80+0x40);
  67.        for(i=0;i<16;i++)
  68.        {
  69.           write_date(t1[i]);
  70.           delay(0);
  71.        }
  72. }
  73.                                                         //温度采集模块
  74. void tmpDelay(int num)                                    //延时函数      
  75. {
  76.        while(num--);
  77. }
  78. void Init_DS18B20()                                         //初始化ds1820
  79. {
  80.        unsigned char x=0;
  81.        DQ = 1;                                                 //DQ复位
  82.        tmpDelay(8);
  83.        DQ = 0;                                              //单片机将DQ拉低
  84.        tmpDelay(80);                                          //精确延时 大于 480us
  85.        DQ = 1;                                                    //拉高总线  
  86.        tmpDelay(14);
  87.        x=DQ;
  88.        tmpDelay(20);
  89. }
  90. unsigned char ReadOneChar()                                      //读一个字节
  91. {
  92.        unsigned char i=0;
  93.        unsigned char dat=0;
  94.        for (i=8;i>0;i--)
  95.        {
  96.            DQ = 0;                                                 // 给脉冲信号
  97.            dat>>=1;
  98.            DQ = 1;                                                  // 给脉冲信号
  99.            if(DQ)
  100.            dat|=0x80;
  101.            tmpDelay(4);
  102.    }
  103. return(dat);
  104. }
  105. void WriteOneChar(unsigned char dat)                        //写一个字节
  106. {
  107.        unsigned char i=0;
  108.        for (i=8; i>0; i--)
  109.        {
  110.           DQ = 0;
  111.           DQ = dat&0x01;
  112.           tmpDelay(5);
  113.           DQ = 1;
  114.           dat>>=1;
  115.     }
  116. }
  117. unsigned int Readtemp()                                          //读取温度
  118. {                                    
  119.        unsigned char a=0;
  120.        unsigned char b=0;
  121.        unsigned int t=0;
  122.        float tt=0;
  123.        Init_DS18B20();
  124.        WriteOneChar(0xCC);                                   // 跳过读序号列号的操作
  125.        WriteOneChar(0x44);                            // 启动温度转换
  126.        Init_DS18B20();
  127.        WriteOneChar(0xCC);                            //跳过读序号列号的操作
  128.        WriteOneChar(0xBE);                                //读取温度寄存器
  129.        a=ReadOneChar();                             //连续读两个字节数据   //读低8位
  130.        b=ReadOneChar();                               //读高8位
  131.        t=b;
  132.        t<<=8;
  133.        t=t|a;                                          //两字节合成一个整型变量。
  134.        tt=t*0.0625;                              //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
  135.        t= tt*10+0.5;                                //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
  136.        return(t);
  137.    }
  138. void display1()
  139. {   
  140.     unsigned int num,num1;
  141.     unsigned int shi,ge,xiaoshu;
  142.     num=Readtemp();
  143.     num1=num/10;
  144.     if(num1>24)
  145.     {d3=0;delay(5000);} ;
  146.     if(num1>25)
  147.     {d4=0;delay(5000);}
  148.     if(num1>26)
  149.     {d5=0;delay(5000);}
  150.     else
  151.     {d3=1;d4=1;d5=1;}
  152. }
  153. void display2()
  154. {
  155.     unsigned int num,num1;
  156.     unsigned int shi,ge,xiaoshu;
  157.     num=Readtemp();
  158.     num1=num/10;
  159.    
  160.     if(num1>27)
  161.     {sound=0;d1=0;d2=1;delay(5000);}
  162.     if(num1<23)
  163.        {
  164.         d1=1;
  165.         d2=0;
  166.         sound=0;
  167.         delay(500);
  168.     }
  169.        else
  170.        {
  171.         sound=1;
  172.         d1=1;
  173.         d2=1;
  174.     }
  175.     shi=num/100;
  176.     ge=num/10%10;
  177.     xiaoshu=num%10;
  178.     write_com(0x80+0x40+5);
  179.     write_date(wendu[shi]);
  180.     write_com(0x80+0x40+6);
  181.     write_date(wendu[ge]);
  182.     write_com(0x80+0x40+7);
  183.     write_date(0x2e);
  184.     write_com(0x80+0x40+8);
  185.     write_date(wendu[xiaoshu]);
  186. }
  187. void t1_func()
  188. {
  189.     TH1=0X3c;
  190.     TL1=0Xb0;
  191.     if(timer<20)
  192.     {
  193.         timer=timer+1;
  194.     }
  195.     else if(timer==20)
  196.     {
  197.         timer=0;
  198.         if(second==0)
  199.         { sound=0;delay(20000);
  200.           second=9;
  201.     }
  202.     else{second=second-1;sound=1;}
  203.     }
  204. }

  205. void main()
  206. {
  207.     init_lcd();
  208.     while(1)
  209.     {
  210.         display1();
  211.         display2();
  212.         delay(10);
  213.     }
  214.     t1_init();
  215.     second=9;
  216.     timer=0;
  217.     while(1);
  218. }

复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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