找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

菜鸡求助:单片机手动加热保温电路怎么改自动加热保温?附程序

查看数: 2146 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-3-10 16:43

正文摘要:

目前实现功能:开始仿真时是保温状态,按下加热键就是加热状态,再按加热键就会保温到设置保温的温度,按设置键可以设置保温温度,检测液位,加热至100℃和到保温温度报警 想要实现功能:开始仿真时是保温状态,按 ...

回复

ID:161164 发表于 2022-3-11 14:36
Ficus 发表于 2022-3-11 09:02
感谢帮助!不好意思!注释写错了!那个应该是中断初始化和外部中断0中断服务程序 我昨天要改一下的不小心 ...

不只注释写错了
中断号也错了
interrupt 1是定时器0的中断
interrupt 0才是外中断0的

而且中断里要干的事也太多了吧?

你的外中断设定是低电平触发
结合你的按键电路
R8把外中断0引脚接地了
你的程序就不断在外中断中循环了
ID:1005119 发表于 2022-3-11 09:02
lkc8210 发表于 2022-3-10 22:18
以下是原整代码
在while(1)中套while(1)是什么鬼写法?
定时器0没有初始化

感谢帮助!不好意思!注释写错了!那个应该是中断初始化和外部中断0中断服务程序 我昨天要改一下的不小心发出去了
ID:161164 发表于 2022-3-10 22:18
以下是原整代码
在while(1)中套while(1)是什么鬼写法?
定时器0没有初始化
定时器0中断中的代码是放着好看的吧?
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char           //宏定义
  4. #define LCD1602 P0
  5. sbit SET=P3^1;                            //定义调整键
  6. sbit DEC=P2^1;                            //定义减少键
  7. sbit ADD=P2^0;                            //定义增加键
  8. sbit BUZZ=P3^6;                            //定义蜂鸣器
  9. sbit ALAM=P1^2;                                //定义灯光报警
  10. sbit ALAM1=P1^4;
  11. sbit ALAM2=P1^6;
  12. sbit DQ=P3^7;                             //定义DS18B20总线I/O
  13. sbit RS = P2^7;
  14. sbit EN = P2^6;
  15. sbit key1=P1^0;
  16. sbit key2=P1^1;
  17. bit shanshuo_st;                            //闪烁间隔标志
  18. bit beep_st;                                     //蜂鸣器间隔标志
  19. uchar x=0;                                      //计数器

  20. sbit led1=P2^0;
  21. sbit led2=P2^1;
  22. sbit led3=P2^2;
  23. sbit led4=P2^3;
  24. sbit motor=P2^4;

  25. uchar code tab1[]= {"Now Tem:   .  C "};
  26. uchar code tab2[]= {"Set Tem:   C    "};
  27. uint c;
  28. uchar Mode=0;                             //状态标志
  29. signed char T=90;                  //设置报警温度,默认值为90


  30. //============================================================================================
  31. //====================================DS18B20=================================================
  32. //============================================================================================
  33. /*****延时子程序*****/
  34. void Delay_DS18B20(int num)
  35. {
  36.     while(num--) ;
  37. }
  38. void delay(uint xms)//延时函数,有参函数
  39. {
  40.     uint x,y;
  41.     for(x=xms; x>0; x--)
  42.         for(y=110; y>0; y--);
  43. }
  44. /*****初始化DS18B20*****/
  45. void Init_DS18B20(void)
  46. {
  47.     unsigned char x=0;
  48.     DQ = 1;         //DQ复位
  49.     Delay_DS18B20(8);    //稍做延时
  50.     DQ = 0;         //单片机将DQ拉低
  51.     Delay_DS18B20(80);   //精确延时,大于480us
  52.     DQ = 1;         //拉高总线
  53.     Delay_DS18B20(14);
  54.     x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  55.     Delay_DS18B20(20);
  56. }
  57. /*****读一个字节*****/
  58. unsigned char ReadOneChar(void)
  59. {
  60.     unsigned char i=0;
  61.     unsigned char dat = 0;
  62.     for (i=8; i>0; i--)
  63.     {
  64.         DQ = 0;     // 给脉冲信号
  65.         dat>>=1;
  66.         DQ = 1;     // 给脉冲信号
  67.         if(DQ)
  68.             dat|=0x80;
  69.         Delay_DS18B20(4);
  70.     }
  71.     return(dat);
  72. }
  73. /*****写一个字节*****/
  74. void WriteOneChar(unsigned char dat)
  75. {
  76.     unsigned char i=0;
  77.     for (i=8; i>0; i--)
  78.     {
  79.         DQ = 0;
  80.         DQ = dat&0x01;
  81.         Delay_DS18B20(5);
  82.         DQ = 1;
  83.         dat>>=1;
  84.     }
  85. }
  86. /*****读取温度*****/
  87. unsigned int ReadTemperature(void)
  88. {
  89.     unsigned char a=0;
  90.     unsigned char b=0;
  91.     unsigned int t=0;
  92.     float tt=0;
  93.     Init_DS18B20();
  94.     WriteOneChar(0xCC);  //跳过读序号列号的操作
  95.     WriteOneChar(0x44);  //启动温度转换
  96.     Init_DS18B20();
  97.     WriteOneChar(0xCC);  //跳过读序号列号的操作
  98.     WriteOneChar(0xBE);  //读取温度寄存器
  99.     a=ReadOneChar();     //读低8位
  100.     b=ReadOneChar();    //读高8位
  101.     t=b;
  102.     t<<=8;
  103.     t=t|a;
  104.     tt=t*0.0625;
  105. // t= tt*10+0.5;     //放大10倍输出并四舍五入
  106.     t= tt*10+0.5;
  107.     return(t);
  108. }

  109. /*****读取温度*****/
  110. void check_wendu(void)
  111. {
  112.     c=ReadTemperature()-5;                          //获取温度值并减去DS18B20的温漂误差
  113.     if(c>1200)
  114.     {
  115.         c=1200;
  116.     }
  117. }

  118. /********液晶写入指令函数与写入数据函数,以后可调用**************/

  119. void write_1602com(uchar com)//****液晶写入指令函数****
  120. {
  121.     RS=0;//数据/指令选择置为指令
  122. //        rw=0; //读写选择置为写
  123.     LCD1602=com;//送入数据
  124.     delay(1);
  125.     EN=1;//拉高使能端,为制造有效的下降沿做准备
  126.     delay(1);
  127.     EN=0;//en由高变低,产生下降沿,液晶执行命令
  128. }


  129. void write_1602dat(uchar dat)//***液晶写入数据函数****
  130. {
  131.     RS=1;//数据/指令选择置为数据
  132. //        rw=0; //读写选择置为写
  133.     LCD1602=dat;//送入数据
  134.     delay(1);
  135.     EN=1; //en置高电平,为制造下降沿做准备
  136.     delay(1);
  137.     EN=0; //en由高变低,产生下降沿,液晶执行命令
  138. }


  139. void lcd_init()//***液晶初始化函数****
  140. {
  141.     uchar a;
  142.     write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  143.     write_1602com(0x0c);//开显示不显示光标
  144.     write_1602com(0x06);//整屏不移动,光标自动右移
  145.     write_1602com(0x01);//清显示

  146.     write_1602com(0x80);//日历显示固定符号从第一行第1个位置之后开始显示
  147.     for(a=0; a<16; a++)
  148.     {
  149.         write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
  150.         delay(3);
  151.     }
  152.     write_1602com(0x80+0x40);//时间显示固定符号写入位置,从第2个位置后开始显示
  153.     for(a=0; a<16; a++)
  154.     {
  155.         write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
  156.         delay(3);
  157.     }

  158. }

  159. void display()
  160. {
  161.     if(Mode==0)
  162.     {
  163.         write_1602com(0x80+8);
  164.         write_1602dat(c/1000+0x30);
  165.         write_1602dat((c%1000)/100+0x30);
  166.         write_1602dat(((c%1000)%100)/10+0x30);

  167.         write_1602com(0x80+12);
  168.         write_1602dat(((c%1000)%100)%10+0x30);

  169.         write_1602com(0x80+13);
  170.         write_1602dat(0xdf);

  171.         write_1602com(0x80+0x40+8);
  172.         write_1602dat(T/10+0x30);
  173.         write_1602dat(T%10+0x30);
  174.         write_1602dat(0xdf);
  175.     }
  176. }
  177. //=====================================================================================

  178. /*****按键程序*****/
  179. void KEY()
  180. {
  181.     //功能键
  182.     if(SET==0)
  183.     {
  184.         BUZZ=0;
  185.         delay(10);
  186.         if(SET==0)
  187.         {
  188.             Mode++;
  189.             if(Mode==2)
  190.                 Mode=0;
  191.             BUZZ=1;
  192.         }
  193.         while(SET==0)
  194.         {
  195.             if(Mode==0)
  196.             {
  197.                 //        write_1602com(0x80+0x40+6);
  198.                 write_1602com(0x0c);
  199.             }
  200.             else if(Mode==1)
  201.             {
  202.                 write_1602com(0x80+0x40+9);
  203.                 write_1602com(0x0f);
  204.             }

  205.         }
  206.     }
  207.     //增加
  208.     if(ADD==0&&Mode==1)
  209.     {
  210.         BUZZ=0;
  211.         delay(10);
  212.         if(ADD==0)
  213.         {
  214.             T++;
  215.             if(T>=99)
  216.                 T=99;
  217.             write_1602com(0x80+0x40+8);
  218.             write_1602dat(T/10+0x30);
  219.             write_1602dat(T%10+0x30);
  220.             write_1602com(0x80+0x40+9);
  221.             BUZZ=1;
  222.         }
  223.         while(ADD==0);
  224.     }
  225.     //减少
  226.     if(DEC==0&&Mode==1)
  227.     {
  228.         BUZZ=0;
  229.         delay(10);
  230.         if(DEC==0)
  231.         {
  232.             T--;
  233.             write_1602com(0x80+0x40+8);
  234.             write_1602dat(T/10+0x30);
  235.             write_1602dat(T%10+0x30);
  236.             write_1602com(0x80+0x40+9);
  237.             BUZZ=1;
  238.         }
  239.         while(DEC==0);
  240.     }
  241. }

  242. /*****报警子程序*****/
  243. void Alarm()
  244. {
  245.     if(x>=10) {
  246.         beep_st=~beep_st;
  247.         x=0;
  248.     }
  249.     if(Mode==0)
  250.     {
  251.         if((c/10)>=T)
  252.         {
  253.             ALAM=0;
  254.             ALAM1=1;
  255.             ALAM2=1;
  256.             if(beep_st==1)
  257.                 BUZZ=0;
  258.             else
  259.                 BUZZ=1;
  260.         }
  261.         else
  262.         {
  263.             BUZZ=1;
  264.             ALAM=1;
  265.             ALAM1=0;
  266.             ALAM2=1;
  267.         }
  268.     }
  269. }

  270. /*****加热子程序*****/
  271. void Heating()
  272. {
  273.     if(x>=10) {
  274.         beep_st=~beep_st;
  275.         x=0;
  276.     }
  277.     if(Mode==0)
  278.     {
  279.         if((c/10)>=100)
  280.         {
  281.             ALAM=0;
  282.             ALAM1=1;
  283.             ALAM2=1;
  284.             if(beep_st==1)
  285.                 BUZZ=0;
  286.             else
  287.                 BUZZ=1;
  288.         }
  289.         else
  290.         {
  291.             BUZZ=1;
  292.             ALAM=1;
  293.             ALAM1=1;
  294.             ALAM2=0;
  295.         }
  296.     }
  297. }

  298. /*****中断*****/
  299. void init()
  300. {
  301.     EA=1;
  302.     EX0=1;
  303.     EX1=1;
  304.     PX0=0;
  305.     PX1=1;
  306.     IT0=0;
  307.     IT1=0;
  308. }

  309. /*****主函数*****/
  310. void main()
  311. {
  312.     while(1)
  313.     {
  314.         P1=0xFC;
  315.         if(key1==0&&key2==0)
  316.         {
  317.             ALAM=0;
  318.             ALAM1=0;
  319.             ALAM2=0;
  320.         }
  321.         else if(key1==1&&key2==1)
  322.         {
  323.             uint z;
  324.             delay(1);
  325.             lcd_init();
  326.             delay(1);
  327.             init();
  328.             for(z=0; z<100; z++)
  329.             {
  330.                 check_wendu();
  331.                 delay(1);
  332.             }
  333.             while(1)
  334.             {
  335.                 display();
  336.                 KEY();
  337.                 Alarm();
  338.                 check_wendu();
  339.             }
  340.         }
  341.         else if(key1==0&&key2==1)
  342.         {
  343.             ALAM=0;
  344.             ALAM1=0;
  345.             ALAM2=0;
  346.         }
  347.         else if(key1==1&&key2==0)
  348.         {
  349.             uint z;
  350.             delay(1);
  351.             lcd_init();
  352.             delay(1);
  353.             init();
  354.             for(z=0; z<100; z++)
  355.             {
  356.                 check_wendu();
  357.                 delay(1);
  358.             }
  359.             while(1)
  360.             {
  361.                 display();
  362.                 KEY();
  363.                 Alarm();
  364.                 check_wendu();
  365.             }
  366.         }
  367.     }
  368. }

  369. /*****定时器0中断服务程序*****/
  370. void init0() interrupt 1
  371. {
  372.     uchar k;
  373.     EX0=0;
  374.     for(k=0; k<2; k++)
  375.     {
  376.         uint z;
  377.         delay(1);
  378.         lcd_init();
  379.         delay(1);
  380.         init();
  381.         for(z=0; z<100; z++)
  382.         {
  383.             display();
  384.             delay(1);
  385.             KEY();
  386.             delay(1);
  387.             Heating();
  388.             delay(1);
  389.             check_wendu();
  390.             delay(1);
  391.             display();
  392.             delay(1);
  393.             KEY();
  394.             delay(1);
  395.             EX0=1;
  396.         }
  397.     }
  398. }
复制代码



ID:879809 发表于 2022-3-10 17:43
仿真不出来,做实际电路吧!

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

Powered by 单片机教程网

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