找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1266|回复: 4
收起左侧

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

[复制链接]
ID:1005119 发表于 2022-3-10 16:43 | 显示全部楼层 |阅读模式
目前实现功能:开始仿真时是保温状态,按下加热键就是加热状态,再按加热键就会保温到设置保温的温度,按设置键可以设置保温温度,检测液位,加热至100℃和到保温温度报警
想要实现功能:开始仿真时是保温状态,按下加热键能先加热至100℃,自动保温到设置保温的温度按设置键可以设置保温温度,检测液位,加热至100℃和到保温温度报警
感谢各位大佬、大神!
电路图
电路图.png

加热
加热.png

保温
保温.png


单片机程序如下:
  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. uchar code tab1[]={"Now Tem:   .  C "};
  21. uchar code tab2[]={"Set Tem:   C    "};
  22. uint c;
  23. uchar Mode=0;                             //状态标志
  24. signed char T=90;                  //设置报警温度,默认值为90
  25. //============================================================================================
  26. //====================================DS18B20=================================================
  27. //============================================================================================
  28. /*****延时子程序*****/
  29. void Delay_DS18B20(int num)
  30. {
  31.     while(num--) ;
  32. }
  33. void delay(uint xms)//延时函数,有参函数
  34. {
  35.         uint x,y;
  36.         for(x=xms;x>0;x--)
  37.         for(y=110;y>0;y--);
  38. }
  39. /*****初始化DS18B20*****/
  40. void Init_DS18B20(void)
  41. {
  42.     unsigned char x=0;
  43.     DQ = 1;         //DQ复位
  44.     Delay_DS18B20(8);    //稍做延时
  45.     DQ = 0;         //单片机将DQ拉低
  46.     Delay_DS18B20(80);   //精确延时,大于480us
  47.     DQ = 1;         //拉高总线
  48.     Delay_DS18B20(14);
  49.     x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  50.     Delay_DS18B20(20);
  51. }
  52. /*****读一个字节*****/
  53. unsigned char ReadOneChar(void)
  54. {
  55.     unsigned char i=0;
  56.     unsigned char dat = 0;
  57.     for (i=8;i>0;i--)
  58.     {
  59.         DQ = 0;     // 给脉冲信号
  60.         dat>>=1;
  61.         DQ = 1;     // 给脉冲信号
  62.         if(DQ)
  63.         dat|=0x80;
  64.         Delay_DS18B20(4);
  65.     }
  66.         return(dat);
  67. }
  68. /*****写一个字节*****/
  69. void WriteOneChar(unsigned char dat)
  70. {
  71.     unsigned char i=0;
  72.     for (i=8; i>0; i--)
  73.     {
  74.         DQ = 0;
  75.         DQ = dat&0x01;
  76.         Delay_DS18B20(5);
  77.         DQ = 1;
  78.         dat>>=1;
  79.     }
  80. }
  81. /*****读取温度*****/
  82. unsigned int ReadTemperature(void)
  83. {
  84.     unsigned char a=0;
  85.     unsigned char b=0;
  86.     unsigned int t=0;
  87.     float tt=0;
  88.     Init_DS18B20();
  89.     WriteOneChar(0xCC);  //跳过读序号列号的操作
  90.     WriteOneChar(0x44);  //启动温度转换
  91.     Init_DS18B20();
  92.     WriteOneChar(0xCC);  //跳过读序号列号的操作
  93.     WriteOneChar(0xBE);  //读取温度寄存器
  94.     a=ReadOneChar();     //读低8位
  95.     b=ReadOneChar();    //读高8位
  96.     t=b;
  97.     t<<=8;
  98.     t=t|a;
  99.     tt=t*0.0625;
  100. // t= tt*10+0.5;     //放大10倍输出并四舍五入
  101.     t= tt*10+0.5;
  102.     return(t);
  103. }
  104. /*****读取温度*****/
  105. void check_wendu(void)
  106. {
  107.     c=ReadTemperature()-5;                          //获取温度值并减去DS18B20的温漂误差
  108.         if(c>1200)
  109.         {
  110.             c=1200;
  111.         }
  112. }
  113. /********液晶写入指令函数与写入数据函数,以后可调用**************/
  114. void write_1602com(uchar com)//****液晶写入指令函数****
  115. {
  116.     RS=0;//数据/指令选择置为指令
  117. //        rw=0; //读写选择置为写
  118.         LCD1602=com;//送入数据
  119.         delay(1);
  120.         EN=1;//拉高使能端,为制造有效的下降沿做准备
  121.         delay(1);
  122.         EN=0;//en由高变低,产生下降沿,液晶执行命令
  123. }
  124. void write_1602dat(uchar dat)//***液晶写入数据函数****
  125. {
  126.         RS=1;//数据/指令选择置为数据
  127.      //        rw=0; //读写选择置为写
  128.         LCD1602=dat;//送入数据
  129.         delay(1);
  130.         EN=1; //en置高电平,为制造下降沿做准备
  131.         delay(1);
  132.         EN=0; //en由高变低,产生下降沿,液晶执行命令
  133. }
  134. void lcd_init()//***液晶初始化函数****
  135. {
  136.         uchar a;
  137.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  138.         write_1602com(0x0c);//开显示不显示光标
  139.         write_1602com(0x06);//整屏不移动,光标自动右移
  140.         write_1602com(0x01);//清显示

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

  153. }
  154. void display()
  155. {
  156.     if(Mode==0)
  157.         {
  158.             write_1602com(0x80+8);                                  //显示当前温度         小数点前的数字
  159.                 write_1602dat(c/1000+0x30);
  160.                 write_1602dat((c%1000)/100+0x30);
  161.                 write_1602dat(((c%1000)%100)/10+0x30);

  162.                 write_1602com(0x80+12);                                         //小数点后的数字
  163.                 write_1602dat(((c%1000)%100)%10+0x30);

  164.                 write_1602com(0x80+13);                                //°
  165.                 write_1602dat(0xdf);

  166.             write_1602com(0x80+0x40+8);                 //显示设置温度
  167.                 write_1602dat(T/10+0x30);
  168.                 write_1602dat(T%10+0x30);
  169.                 write_1602dat(0xdf);
  170.         }
  171. }
  172. //=====================================================================================
  173. /*****按键程序*****/
  174. void KEY()
  175. {
  176.                         //功能键
  177.     if(SET==0)
  178.         {
  179.             BUZZ=0;
  180.                 delay(10);
  181.                 if(SET==0)
  182.                 {
  183.                     Mode++;
  184.                         if(Mode==2)
  185.                         Mode=0;
  186.                         BUZZ=1;
  187.                 }
  188.                 while(SET==0)
  189.                 {
  190.                     if(Mode==0)
  191.                         {
  192.                         //        write_1602com(0x80+0x40+6);
  193.                             write_1602com(0x0c);
  194.                         }
  195.                         else if(Mode==1)
  196.                         {
  197.                             write_1602com(0x80+0x40+9);
  198.                             write_1602com(0x0f);
  199.                         }

  200.                 }
  201.         }
  202.         //增加
  203.         if(ADD==0&&Mode==1)
  204.         {
  205.             BUZZ=0;
  206.                 delay(10);
  207.                 if(ADD==0)
  208.                 {
  209.                     T++;
  210.                         if(T>=99)
  211.                         T=99;
  212.                         write_1602com(0x80+0x40+8);
  213.                         write_1602dat(T/10+0x30);
  214.                         write_1602dat(T%10+0x30);
  215.                         write_1602com(0x80+0x40+9);
  216.                         BUZZ=1;
  217.                 }
  218.                 while(ADD==0);
  219.         }
  220.         //减少
  221.         if(DEC==0&&Mode==1)
  222.         {
  223.             BUZZ=0;
  224.                 delay(10);
  225.                 if(DEC==0)
  226.                 {
  227.                         T--;
  228.                         write_1602com(0x80+0x40+8);
  229.                         write_1602dat(T/10+0x30);
  230.                         write_1602dat(T%10+0x30);
  231.                         write_1602com(0x80+0x40+9);
  232.                         BUZZ=1;
  233.                 }
  234.                 while(DEC==0);
  235.         }
  236. }
  237. /*****保温子程序*****/
  238. void Alarm()
  239. {
  240.         if(x>=10){beep_st=~beep_st;x=0;}
  241.         if(Mode==0)
  242.         {
  243.             if((c/10)>=T)
  244.                 {
  245.                     ALAM=0;
  246.                         ALAM1=1;
  247.                         ALAM2=1;
  248.                         if(beep_st==1)
  249.                         BUZZ=0;
  250.                         else
  251.                         BUZZ=1;
  252.                 }
  253.                 else
  254.                 {
  255.                     BUZZ=1;
  256.                         ALAM=1;
  257.                         ALAM1=0;
  258.                         ALAM2=1;
  259.                 }
  260.         }
  261. }
  262. /*****加热子程序*****/
  263. void Heating()
  264. {
  265.     if(x>=10){beep_st=~beep_st;x=0;}
  266.     if(Mode==0)
  267.         {
  268.             if((c/10)>=100)        //温度到达100停止加热
  269.                 {
  270.                     ALAM=0;
  271.                         ALAM1=1;
  272.                     ALAM2=1;
  273.                      if(beep_st==1)
  274.                         BUZZ=0;
  275.                         else
  276.                         BUZZ=1;
  277.                 }
  278.                 else
  279.                 {
  280.                         BUZZ=1;
  281.                         ALAM=1;
  282.                         ALAM1=1;
  283.                         ALAM2=0;
  284.                 }
  285.     }
  286. }
  287. /*****中断*****/
  288. void init()
  289. {
  290.     EA=1;
  291.         EX0=1;EX1=1;
  292.         PX0=0;PX1=1;
  293.         IT0=0;IT1=0;
  294. }
复制代码
51hei图片_20220310130940.png
下载.png
下载 (1).png

程序和仿真.zip

108.4 KB, 下载次数: 4

回复

使用道具 举报

ID:879809 发表于 2022-3-10 17:43 | 显示全部楼层
仿真不出来,做实际电路吧!
回复

使用道具 举报

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:1005119 发表于 2022-3-11 09:02 | 显示全部楼层
lkc8210 发表于 2022-3-10 22:18
以下是原整代码
在while(1)中套while(1)是什么鬼写法?
定时器0没有初始化

感谢帮助!不好意思!注释写错了!那个应该是中断初始化和外部中断0中断服务程序 我昨天要改一下的不小心发出去了
回复

使用道具 举报

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

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

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

你的外中断设定是低电平触发
结合你的按键电路
R8把外中断0引脚接地了
你的程序就不断在外中断中循环了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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