找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机模拟微波炉的控制器 ds18b20数据时不时跳一下

[复制链接]
跳转到指定楼层
楼主
本帖最后由 迷失朋友 于 2018-3-4 20:48 编辑

我自己做一个模拟微波炉的控制器,大概就是用ds18b20提供的温度控制步进电机,怎么我用ds18b20测温数据时不时跳一下然后又正常。有没有人帮我看一下,可以回复,也可以加我qq904784778。 微波炉.rar (28.5 KB, 下载次数: 43)


单片机源程序如下:
  1. #include <reg51.h>
  2. #define  uint unsigned int
  3. #define  uchar unsigned char
  4. uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //七段数码管显示码,显示0~9
  5. uint tt=20;    // 为了计时一秒,定时器一次中断为50ms,20*50ms=1s
  6. uint tmax=30;     //火力上限
  7. uint check=0;
  8. uint m;
  9. int count_s=0;    //时间
  10. sbit P10=P1^0;                //引脚定义
  11. sbit P11=P1^1;
  12. sbit P12=P1^2;
  13. sbit P13=P1^3;
  14. sbit P14=P1^4;
  15. sbit P15=P1^5;
  16. sbit P16=P1^6;
  17. sbit P17=P1^7;
  18. sbit P20=P2^0;
  19. sbit P21=P2^1;
  20. sbit P22=P2^2;
  21. sbit P23=P2^3;
  22. sbit P24=P2^4;
  23. sbit P25=P2^5;
  24. sbit P26=P2^6;
  25. sbit P30=P3^0;
  26. sbit P31=P3^1;
  27. sbit P32=P3^2;
  28. sbit P33=P3^3;
  29. sbit P34=P3^4;
  30. sbit P35=P3^5;
  31. sbit P36=P3^6;
  32. sbit P37=P3^7;
  33. sbit DQ=P2^7;   //定义DS18B20总线I/O
  34. sbit DP=P0^7;

  35. void Delay(uint i)//延时
  36. {
  37. while( i-- );
  38. }

  39. void T_initalize()
  40. {
  41.         EA=1;            //开中断
  42.         ET0=1;
  43.         ET1=1;           //定时器 中断允许
  44.         TMOD=0x11;       //定时器T0 定时   方式一
  45.         TH0=0x3c;
  46.         TL0=0xaf;         //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
  47. }

  48. void Init_DS18B20(void)//初始化DS18B20
  49. {
  50.   uchar x=0;
  51.   DQ=1;
  52.   Delay(8);    //稍做延时
  53.   DQ=0;         //单片机将DQ拉低
  54.   Delay(80);   //精确延时,大于480us
  55.   DQ=1;         //拉高总线
  56.   Delay(14);
  57.   x=DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  58.   Delay(20);
  59. }

  60. uchar Readonechar(void)//读一个字节
  61. {
  62.   uchar i=0;
  63.   uchar dat=0;
  64.   for (i=8;i>0;i--)
  65.   {
  66.     DQ=0;     // 给脉冲信号
  67.     dat>>=1;
  68.     DQ=1;     // 给脉冲信号
  69.     if(DQ)
  70.     dat|=0x80;
  71.     Delay(4);
  72.   }
  73.   Delay(500);
  74.   return(dat);
  75. }

  76. void Writeonechar(uchar dat)//写一个字节
  77. {
  78.   uchar i=0;
  79.   for (i=8; i>0; i--)
  80.   {
  81.     DQ=0;
  82.     DQ=dat&0x01;
  83.     Delay(10);
  84.     DQ=1;
  85.     dat>>=1;
  86.   }
  87. }

  88. void Tmperature_change(void) //发送温度转换命令
  89. {
  90.   Init_DS18B20();
  91.   Writeonechar(0xCC);  //跳过读序号列号的操作
  92.   Writeonechar(0x44);  //启动温度转换
  93. }

  94. uint Read_temperature(void)//读取温度
  95. {
  96.   uchar a=0;
  97.   uchar b=0;
  98.   uint t=0;
  99.   Tmperature_change();
  100.   Init_DS18B20();
  101.   Writeonechar(0xCC);  //跳过读序号列号的操作
  102.   Writeonechar(0xBE);  //读取温度寄存器
  103.   a=Readonechar();     //读低8位
  104.   b=Readonechar();    //读高8位
  105.   t=b;
  106.   t<<=8;
  107.   t=t|a;
  108.   t=t*0.0625;
  109.   return(t);
  110. }

  111. void Display_temperature()//显示温度
  112. {
  113. uint f,g,h,i;
  114. i=Read_temperature();  //获取温度值
  115. f=i/100;               //百位
  116. g=i%100/10;            //十位
  117. h=i%10;                //个位
  118. m=i;
  119. P24=1,P25=1,P26=1;
  120. P0=codevalue[h];   //显示个位  
  121. P24=1,P25=1,P26=0;      
  122. Delay(160);  
  123. P24=1,P25=1,P26=1;
  124. P0=codevalue[g];    //显示十位
  125. P24=1;P25=0;P26=1;
  126. Delay(160);
  127. P24=1,P25=1,P26=1;
  128. P0=codevalue[f];    //显示百位
  129. P24=0,P25=1,P26=1;
  130. Delay(160);
  131. P24=1,P25=1,P26=1;
  132. }

  133. void Display_time()//显示时间
  134. {
  135. uint a,b,c,d;
  136. a=count_s/600;             //取分的十位
  137. b=(count_s/60)%10;         //取分的个位                                 
  138. c=(count_s%60)/10;         //取秒的十位
  139. d=(count_s%60)%10;                  //取秒的个位
  140. P20=1,P21=1,P22=1,P23=1;
  141. P0=codevalue[d];           //显示秒的个位
  142. P20=1,P21=1,P22=1,P23=0;
  143. Delay(150);
  144. P20=1,P21=1,P22=1,P23=1;
  145. P0=codevalue[c];           //显示秒的十位
  146. P20=1,P21=1,P22=0,P23=1;
  147. Delay(160);
  148. P20=1,P21=1,P22=1,P23=1;
  149. P0=codevalue[b];           //显示分的个位
  150. P20=1,P21=0,P22=1,P23=1;
  151. Delay(160);
  152. P20=1,P21=1,P22=1,P23=1;
  153. P0=codevalue[a];           //显示分的十位
  154. P20=0,P21=1,P22=1,P23=0;
  155. Delay(160);
  156. P20=1,P21=1,P22=1,P23=1;
  157. }

  158. void Display_initalize()
  159. {
  160. P2=0xff;
  161. P0=0x40;
  162. P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
  163. Delay(120);
  164. P2=0xff;
  165. P0=0x40;
  166. P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
  167. Delay(120);
  168. P2=0xff;
  169. P0=0x40;
  170. P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
  171. Delay(120);
  172. P2=0xff;
  173. P0=0x40;
  174. P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
  175. Delay(120);
  176. P2=0xff;
  177. P0=0x40;
  178. P20=0,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
  179. Delay(120);
  180. P2=0xff;
  181. P0=0x40;
  182. P20=0,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
  183. Delay(120);
  184. P2=0xff;
  185. P0=0x40;
  186. P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
  187. Delay(120);
  188. P2=0xff;
  189. }

  190. void Motor()//电机
  191. {
  192. if(check==1)
  193. {
  194. P33=1,P34=0,P35=0,P36=0;
  195. Delay(100);
  196. P33=0,P34=1,P35=0,P36=0;
  197. Delay(100);
  198. P33=0,P34=0,P35=1,P36=0;
  199. Delay(100);
  200. P33=0,P34=0,P35=0,P36=1;
  201. Delay(100);
  202. }
  203. }

  204. void Temperature_check()//温度检测
  205. {if(check==1)
  206. {
  207. if(m<=tmax)
  208. P17=0;
  209. if(m>tmax)
  210. P17=1;
  211. }
  212. }

  213. void Key_scan()//键位扫描
  214. {   
  215.         if(!P10)
  216.         {
  217.          Delay(150);
  218.                 if(!P10)
  219.                 count_s+=60;      //时间+1分
  220.         if (count_s>6000)
  221.             count_s=0;
  222.         }
  223.         
  224.     if(!P11)
  225.         {
  226.          Delay(150);
  227.                 if(!P11)
  228.                 count_s-=60;       //时间-1分
  229.         if (count_s<0)
  230.             count_s=0;
  231.         }

  232.         if(!P12)
  233.         {
  234.          Delay(150);
  235.                 if(!P12)
  236.                 tmax=50;      //小火
  237.         }

  238.         if(!P13)
  239.         {
  240.          Delay(150);
  241.                 if(!P13)
  242.             tmax=80;      //中火

  243.         }

  244.         if(!P14)
  245.         {
  246.          Delay(150);
  247.                 if(!P14)
  248.                 tmax=120;    //大火

  249.         }

  250.         if(!P15)
  251.         {
  252.          Delay(150);
  253.                 if(!P15)
  254.                 {
  255.                  P22=1;
  256.          if(count_s==0)          //如果没有设定时间,不加热,定时器不工作
  257.             TR0=0;
  258.          else                    //如果已经设定时间,则开始计时,开始加热
  259.                     {                  
  260.             T_initalize();
  261.             TR0=1;
  262.             check=1;
  263.             P17=0;
  264.             }
  265.                 }

  266.         }

  267.         if(!P16)               //停止加热,终止定时器
  268.         {
  269.          Delay(150);
  270.                 if(!P16)
  271.                 {P17=1;
  272.                  TR0=0;
  273.          check=0;
  274.                 }
  275.         }
  276. }

  277. void t0() interrupt 1//定时
  278. {        
  279.     TR0=0;
  280.     TH0=0x3c;
  281.         TL0=0xaf;
  282.     tt--;
  283.         if (tt==0)
  284.                 {tt=20;
  285.                 count_s--;  //时间-1S
  286.         if (count_s==0)  //如果定时已到
  287.             {
  288.                          P17=1;      //停止加热,定时器终止
  289.              TR0=0;
  290.                          check=0;
  291.              P37=0;
  292.                          Delay(500);
  293.                          P37=1;
  294.                          P37=0;
  295.                          Delay(500);
  296.                          P37=1;
  297.                          P37=0;
  298.                          Delay(500);
  299.                          P37=1;
  300.             }
  301.         else
  302.             TR0=1;        //继续定时
  303.                 }
  304.     else
  305.         TR0=1;
  306.            
  307. }

  308. void main()
  309. {
  310. uint j;
  311. P37=0;
  312. Delay(500);
  313. P37=1;
  314. Read_temperature();
  315. for(j=0;j<100;j++)
  316. {
  317. Display_initalize();
  318. }

  319. while(1)
  320. {
  321. Key_scan();
  322. Display_temperature();
  323. Display_time();
  324. Temperature_check();
  325. }
  326. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2018-3-5 13:19 | 只看该作者
软件仿真改改就好并非实际电路

204016kzxt66464pt77r77.png (206.36 KB, 下载次数: 21)

204016kzxt66464pt77r77.png
回复

使用道具 举报

板凳
ID:250518 发表于 2018-3-6 11:24 | 只看该作者
本帖最后由 迷失朋友 于 2018-3-6 19:18 编辑
wc86110 发表于 2018-3-5 13:19
软件仿真改改就好并非实际电路

还是不行哦,还是会跳。
回复

使用道具 举报

地板
ID:337139 发表于 2021-9-10 10:36 | 只看该作者
先调试DS18B20,然后再去调主程序控制部分,这样可能会好点。
回复

使用道具 举报

5#
ID:94031 发表于 2021-9-10 11:13 | 只看该作者
仿真的东西不要认得太真,和实际不是一回事,有这个时间,搭电路学习更有价值。
回复

使用道具 举报

6#
ID:844772 发表于 2021-9-10 11:34 | 只看该作者
我大致看了,因为是模拟的,所以可以排除干扰,觉得应该是你定时中断导致的问题,你在读温度的时候,要关中断,读完再开,它速度很快的,基本不影响计时。
就是加在 Readonechar(void) Writeonechar(uchar dat)两个函数。
回复

使用道具 举报

7#
ID:965016 发表于 2021-9-10 14:58 | 只看该作者
可能程序哪里有bug
回复

使用道具 举报

8#
ID:517951 发表于 2021-9-11 11:27 | 只看该作者
仿真的东西还需用实物样品来验证,仿真通过了样品可能还会有问题。
回复

使用道具 举报

9#
ID:731755 发表于 2021-9-11 13:16 来自手机 | 只看该作者
同意楼上的大师们,最好用实物来验证,我买的学习板,都是在板上验证的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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