找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机微波炉控制系统 含Proteus仿真+源程序

[复制链接]
跳转到指定楼层
楼主
这是我之前做过的微波炉单片机课程设计,用了大概一周的时间
我是用protues做的仿真
附件里面有文档,源码和protues仿真的实验
希望和大家多多交流

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


单片机源程序如下:
  1. Wendu.h (头文件)
  2. #define jump_ROM 0xCC//ds18B20定义
  3. #define start 0x44
  4. #define read_EEROM 0xBE
  5. void delay(unsigned int N);
  6. void delay_1();
  7. unsigned char Reset(void);//复位DS18B20
  8. unsigned char read_bit(void);//从DS18B20读一个位值
  9. void write_bit(unsigned char bitval);//向DS18B20写一位
  10. unsigned char read_byte(void);//从DS18B20读一个字节
  11. void write_byte(unsigned char val);// 向DS18B20写一个字节

  12. Wendu.c (Wendu.h 的实现)
  13. #include<reg52.h>
  14. #include"wendu.h"
  15. sbit DQ = P2^3;         //DS18B20数据口

  16. /********************************************************************
  17. * 名称 : delay()
  18. * 功能 : 延时,延时时间大概为140US。
  19. * 输入 : 无
  20. * 输出 : 无
  21. ***********************************************************************/
  22. void delay_1()
  23. {
  24.         int i,j;
  25.         for(i=0; i<=10; i++)
  26.         for(j=0; j<=2; j++);
  27. }
  28. /********************************************************************
  29. * 名称 : delay()
  30. * 功能 : 延时函数
  31. * 输入 : 无
  32. * 输出 : 无
  33. ***********************************************************************/
  34. void delay(unsigned int N)
  35. {
  36.         int i;
  37.         for(i=0; i<N; i++);
  38. }
  39. /********************************************************************
  40. * 名称 : Reset()
  41. * 功能 : 复位DS18B20
  42. * 输入 : 无
  43. * 输出 : 无
  44. ***********************************************************************/
  45. unsigned char Reset(void)
  46. {
  47.         unsigned char deceive_ready;
  48.         DQ = 0;
  49.         delay(29);
  50.         DQ = 1;
  51.         delay(3);
  52.         deceive_ready = DQ;
  53.         delay(25);
  54.         return(deceive_ready);
  55. }
  56. /********************************************************************
  57. * 名称 : read_byte()
  58. * 功能 : 从DS18B20读一个字节
  59. * 输入 : 无
  60. * 输出 : 从DS18B20读到的值
  61. ***********************************************************************/
  62. /********************************************************************
  63. * 名称 : read_bit()
  64. * 功能 : 从DS18B20读一个位值
  65. * 输入 : 无
  66. * 输出 : 从DS18B20读出的一个位值
  67. ***********************************************************************/
  68. unsigned char read_bit(void)
  69. {
  70.         unsigned char i;
  71.         DQ = 0;
  72.         DQ = 1;
  73.         for(i=0; i<3; i++);
  74.         return(DQ);
  75. }
  76. /********************************************************************
  77. * 名称 : write_bit()
  78. * 功能 : 向DS18B20写一位
  79. * 输入 : bitval(要对DS18B20写入的位值)
  80. * 输出 : 无
  81. ***********************************************************************/
  82. void write_bit(unsigned char bitval)
  83. {
  84. DQ=0;if(bitval==1)
  85. DQ=1;
  86. delay(5);
  87. DQ=1;
  88. }
  89. /********************************************************************
  90. * 名称 : read_byte()
  91. * 功能 : 从DS18B20读一个字节
  92. * 输入 : 无
  93. * 输出 : 从DS18B20读到的值
  94. ***********************************************************************/
  95. unsigned char read_byte(void)
  96. {
  97.         unsigned char i,m,receive_data;
  98.         m = 1;
  99.         receive_data = 0;
  100.         for(i=0; i<8; i++)
  101.         {
  102.                 if(read_bit())
  103.                 {
  104.                         receive_data = receive_data + (m << i);
  105.                 }
  106.                 delay(6);
  107.         }
  108.         return(receive_data);
  109. }

  110. /********************************************************************
  111. * 名称 : write_byte()
  112. * 功能 : 向DS18B20写一个字节
  113. * 输入 : val(要对DS18B20写入的命令值)
  114. * 输出 : 无
  115. ***********************************************************************/
  116. void write_byte(unsigned char val)
  117. {
  118.         unsigned char i,temp;
  119.         for(i=0; i<8; i++)
  120.         {
  121.                 temp = val >> i;
  122.                 temp = temp & 0x01;
  123.                 write_bit(temp);
  124.                 delay(5);
  125.         }
  126. }

  127. 主函数的实现
  128. #include<reg52.h>
  129. #include"wendu.h"
  130. sbit key1=P1^4;       //矩阵键盘定义
  131. sbit key2=P1^5;
  132. sbit key3=P1^6;
  133. sbit key4=P1^7;
  134. sbit S1=P3^2;          //按键定义
  135. sbit S2=P3^3;
  136. sbit S3=P3^4;
  137. sbit RS=P2^5;           //12864定义
  138. sbit RW=P2^6;
  139. sbit E=P2^7;
  140. sbit BEEP = P2^0;          //蜂鸣器定义
  141. sbit Hot=P2^1;
  142. unsigned char TMPH,TMPL,key41=1,Temp,T;   //温度常量
  143. unsigned int count1,count2,count3;    //时间常量
  144. unsigned int countor,m,s;         //计时常量
  145. unsigned char button,sound;  //其他常量
  146. unsigned char code table[]={"0123456789"};

  147. /******************子程序说明********************/
  148. void delay_1ms(unsigned int i);      //1ms延时
  149. void delay();                    //延时子程序
  150. void beep();                     //响铃程序
  151. void set(char n);        //12864写指令子程序
  152. void weizhi(int hang,int lie);         //12864字符显示位置
  153. void wdata(unsigned char d);              //往12864写数据,单个字符
  154. void wsdata(char tab[]);                //往12864写数据,字符串
  155. void scan();                 //矩阵键盘第一列扫描,确定所输入的时间
  156. void setTemp();                 //温度设定,采用扫描独立键盘来确定输入
  157. void setTime();            //时间设定
  158. void showTime();          //显示时间
  159. void chu12864();  //初始化12864
  160. void chuDS();    //初始化DS18B20

  161. /********************主程序*************************/
  162. void main()             //主函数
  163. {  
  164.         chu12864();//12864的初始化
  165.         setTemp();
  166.         setTime();  
  167.         while(1)
  168.         {
  169.         chuDS();
  170.                 if(Temp==T)                  
  171.                    TR0=1;
  172.                 showTemp();                 
  173.             showTime();               
  174.                 if(sound==1)
  175.               beep();   
  176.           }  
  177. }
  178. /******************************************/

  179. void time0(void) interrupt 1 using 1    //定时中断程序
  180. {
  181.         countor++;
  182.         if(countor==20)
  183.         {
  184.               if(m==0&&s==0) //倒计时
  185.             {
  186.               m=0;
  187.               s=0;
  188.               sound=1;
  189.               Hot=0;
  190.               TR0=0;
  191.              }
  192.                 else
  193.                 if(s==0)
  194.             { m--;s=59;}
  195.             else
  196.                 s--;
  197.      countor=0;
  198.    }
  199.   TH0=(65536-50000)/256;
  200.   TL0=(65536-50000)%256;
  201. }


  202. /************************************************/
  203. void delay_1ms(unsigned int i)      //1ms延时
  204. {
  205.         unsigned char x,j;
  206.         for(j=0;j<i;j++)
  207.         for(x=0;x<=148;x++);        
  208. }
  209. /************************************************/
  210. void delay()                    //延时子程序
  211. {
  212.   int a,b;
  213.    for(a=0;a<100;a++)
  214.     for(b=0;b<10;b++);
  215. }/************************************************/
  216. void beep()                     //响铃程序
  217. {
  218.   unsigned char i;
  219.   for (i=0;i<100;i++)
  220.    {
  221.    delay_1ms(1);
  222.    BEEP=!BEEP;                 //BEEP取反
  223.    }
  224.   BEEP=1;                      //关闭蜂鸣器
  225. }
  226. /************************************************/
  227. void set(char n)        //12864写指令子程序
  228. {
  229.   P0=n;
  230.   RS=0;
  231.   RW=0;
  232.   E=0;
  233.   delay();
  234.   E=1;
  235.   delay();
  236. }
  237. /******************************************/
  238. void weizhi(int hang,int lie)         //12864字符显示位置
  239. {
  240.   char a;
  241.   if(hang==1) a=0x80;
  242.   if(hang==2) a=0xc0;
  243.   a=a+lie-1;
  244.   set(a);
  245. }
  246. /******************************************/
  247. void wdata(unsigned char d)              //往12864写数据,单个字符
  248. {
  249.   RS=1;
  250.   RW=0;
  251.   P0=d;
  252.   E=0;
  253.   delay();
  254.   E=1;
  255.   delay();
  256. }
  257. /******************************************/
  258. void wsdata(char tab[])                //往12864写数据,字符串
  259. {
  260.   int i=0;
  261.   RS=1;
  262.   RW=0;
  263.   while(tab[i]!='\0')          //不是结束符时执行
  264.    {
  265.      P0=tab[i];
  266.      E=0;
  267.      delay();
  268.      E=1;
  269.      delay();
  270.          i++;
  271.   }
  272. }
  273. /******************************************/
  274. void scan()                 //矩阵键盘第一列扫描,确定所输入的时间
  275. {
  276. P1=0xfe;
  277.   if(key1==0)
  278.    { delay();
  279.      if(key1==1)
  280.     { count1++;        
  281.            beep();
  282.     }
  283.    }
  284.   if(key2==0)
  285.   { delay();
  286.     if(key2==1)
  287.         {
  288.       count2++;
  289.       beep();
  290.         }
  291.   }
  292.   if(key3==0)
  293.   {  delay();
  294.     if(key3==1)
  295.         {
  296.       count3++;
  297.           beep();
  298.           }
  299.   }
  300.   if (key4==0)
  301.    {
  302.      key41=0;        
  303.          beep();
  304.    }
  305. }
  306. /******************************************/
  307. void setTemp()                 //温度设定,采用扫描独立键盘来确定输入
  308. {
  309.         while(1)
  310.         {
  311.                 P3=0xff;
  312.                 if(S1==0) button=1;     //20度
  313.                 if(S2==0) button=2;     //30度
  314.                 if(S3==0) button=3;     //50度
  315.                 if(button==1)
  316.         {
  317.                 T=20;
  318.                 weizhi(2,5);
  319.                 wdata(table[2]);
  320.                 delay_1ms(1);
  321.                 weizhi(2,6);
  322.                 wdata(table[0]);
  323.         }
  324.         if(button==2)
  325.         {
  326.                 T=30;
  327.                 weizhi(2,5);
  328.                 wdata(table[3]);
  329.                 delay_1ms(1);
  330.                 weizhi(2,6);
  331.                 wdata(table[0]);
  332.         }
  333.         if(button==3)
  334.         {
  335.                 T=50;
  336.                 weizhi(2,5);
  337.                 wdata(table[5]);
  338.                 delay_1ms(1);
  339.                 weizhi(2,6);
  340.                 wdata(table[0]);
  341.         }
  342.         if(button==1||button==2||button==3)
  343.                 break;
  344.         }
  345. }
  346. /****************************************/
  347. void setTime()            //时间设定
  348. {
  349.   while(1)
  350.     {
  351.       scan();
  352.       if(key41==0)
  353.         break;
  354.     }  
  355. m=(1*count1)+(2*count2)+(5*count3);      //计算所设定的时间
  356. Hot=1;
  357. }
  358. void showTime()          //显示时间
  359. {
  360.   weizhi(2,11);
  361.   wdata(table[m/10]);       //显示分
  362.   delay_1ms(1);
  363.   weizhi(2,12);
  364.   wdata(table[m%10]);
  365.   delay_1ms(1);
  366.   weizhi(2,13);
  367.   wdata(':');
  368.   delay_1ms(1);
  369.   weizhi(2,14);
  370.   wdata(table[s/10]);     //显示秒
  371.   delay_1ms(1);
  372.   weizhi(2,15);
  373.   wdata(table[s%10]);
  374.   delay_1ms(1);
  375. }
  376. /****************************************/
  377. void showTemp()         //显示温度
  378. {
  379.   delay_1ms(1);
  380.   weizhi(1,13);
  381.   wdata(table[Temp/10]);
  382.   delay_1ms(1);
  383.   weizhi(1,14);
  384.   wdata(table[Temp%10]);
  385.   delay_1ms(1);
  386. }
  387. /****************************************/
  388. void chu12864()  //初始化12864
  389. {
  390.         set(0x01);    //清屏
  391.         set(0x38);   //显示模式
  392.         set(0x0c);    //显示开
  393.         set(0x06);   //光标设置
  394.         weizhi(1,4);   //定义字符显示位置 第一行,第四列
  395.         wsdata("Welcome"); //显示开机欢迎语
  396.         weizhi(2,3);
  397.         wsdata("T=");
  398.         weizhi(2,7);
  399.         wsdata("oC");
  400.         IE=0x82;    //设定定时器工作方式
  401.         TMOD=0X01;
  402.         TH0=(65536-50000)/256;  //设定计时器的定时时长50MS
  403.         TL0=(65536-50000)%256;
  404.         button=0;      //初始化参数
  405.         count1=0;
  406.         count2=0;
  407.         count3=0;
  408.         Hot=0;         
  409.         m=0;
  410.         s=0;
  411.         T=0;
  412. }
  413. void chuDS()    //初始化DS18B20
  414. {
  415.         Reset();
  416.         write_byte(jump_ROM);
  417.         write_byte(start);
  418.         Reset();
  419.         write_byte(jump_ROM);
  420.         write_byte(read_EEROM);
  421.         TMPL = read_byte();
  422.         TMPH = read_byte();
  423.         Temp = TMPL / 16 + TMPH * 16;
  424.         delay_1ms(1);
  425. }
复制代码

全部资料51hei下载地址:
仿真 程序.zip (82.38 KB, 下载次数: 97)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:577010 发表于 2019-7-3 11:46 | 只看该作者
谢谢分享
回复

使用道具 举报

板凳
ID:577010 发表于 2019-7-3 13:23 | 只看该作者
下载压缩包里面没有仿真图
回复

使用道具 举报

地板
ID:709667 发表于 2020-3-16 20:00 | 只看该作者
Wendu.h(头文件)是什么啊
回复

使用道具 举报

5#
ID:862503 发表于 2020-12-21 20:42 | 只看该作者
请问蜂鸣器不响是为什么呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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