找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大佬们看看我的这个报警函数为啥不能执行,这个单片机程序没有错误没有警告

[复制链接]
跳转到指定楼层
楼主
ID:718783 发表于 2020-5-2 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的报警函数clock_h_l()也就是当测的温度大于我给的阈值时,让点阵滚动显示报警,烧录我的单片机上为啥执行不了
下面是我的代码,希望大佬们帮帮我

单片机源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #include"LCD1602.h"
  4. #include"temp.h"

  5. typedef unsigned int u16;          //对数据类型进行声明定义
  6. typedef unsigned char u8;

  7. u16 max_value=20;
  8. u16 temp,offset=0;
  9. u8 i,j,h=16;


  10. //--定义使用的IO口--//
  11. sbit k1=P2^0;
  12. sbit k2=P2^1;
  13. sbit k3=P2^2;
  14. sbit k4=P2^3;

  15. sbit beep=P1^5;

  16. sbit SRCLK=P3^6;
  17. sbit RCLK=P3^5;
  18. sbit SER=P3^4;

  19. //定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作
  20. //数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平

  21. u8 code ledwei[]=
  22. {
  23. 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  24. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f,

  25. };



  26. u8 code ledduan1[]=
  27. {
  28. /*--  文字:  温  --*/
  29. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  30. 0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
  31. 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,

  32. /*--  文字:  度  --*/
  33. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  34. 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
  35. 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,

  36. /*--  文字:  超  --*/
  37. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  38. 0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,
  39. 0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,

  40. /*--  文字:  标  --*/
  41. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  42. 0x10,0x10,0xD0,0xFF,0x90,0x10,0x20,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x20,0x00,
  43. 0x04,0x03,0x00,0xFF,0x00,0x13,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,

  44. /*--  文字:  !  --*/
  45. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  46. 0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  47. 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  48. };



  49. /*******************************************************************************
  50. * 函 数 名         : delay10ms()
  51. * 函数功能                   : 延时10ms
  52. * 输    入         : 无
  53. * 输    出         : 无
  54. *******************************************************************************/
  55. void delay10ms()   //误差 0us
  56. {
  57.     u8 a,b,c;
  58.     for(c=1;c>0;c--)
  59.         for(b=38;b>0;b--)
  60.             for(a=130;a>0;a--);
  61. }
  62. /*******************************************************************************
  63. * 函 数 名         : delay
  64. * 函数功能                   : 延时函数,i=1时,大约延时10us
  65. *******************************************************************************/
  66. void delay(u16 i)
  67. {
  68.         while(i--);        
  69. }
  70. /*******************************************************************************
  71. * 函 数 名         : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
  72. * 函数功能                   : 通过595发送四个字节的数据
  73. * 输    入         : dat1:第4个595输出数值
  74. *                  * dat2: 第3个595输出数值
  75. *                  * dat3:第2个595输出数值
  76. *                  * dat4:第1个595输出数值
  77. * 输    出         : 无
  78. *******************************************************************************/
  79. void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
  80. {
  81.         u8 a;

  82.         SRCLK = 1;
  83.         RCLK = 1;

  84.         for(a=0;a<8;a++)                 //发送8位数
  85.         {
  86.                 SER = dat1 >> 7;                 //从最高位开始发送
  87.                 dat1 <<= 1;

  88.                 SRCLK = 0;                         //发送时序
  89.                 _nop_();
  90.                 _nop_();
  91.                 SRCLK = 1;        
  92.         }

  93.         for(a=0;a<8;a++)                 //发送8位数
  94.         {
  95.                 SER = dat2 >> 7;                 //从最高位开始发送
  96.                 dat2 <<= 1;

  97.                 SRCLK = 0;                         //发送时序
  98.                 _nop_();
  99.                 _nop_();
  100.                 SRCLK = 1;        
  101.         }

  102.         for(a=0;a<8;a++)                 //发送8位数
  103.         {
  104.                 SER = dat3 >> 7;                 //从最高位开始发送
  105.                 dat3 <<= 1;

  106.                 SRCLK = 0;                         //发送时序
  107.                 _nop_();
  108.                 _nop_();
  109.                 SRCLK = 1;        
  110.         }

  111.         for(a=0;a<8;a++)                 //发送8位数
  112.         {
  113.                 SER = dat4 >> 7;                 //从最高位开始发送
  114.                 dat4 <<= 1;

  115.                 SRCLK = 0;                         //发送时序
  116.                 _nop_();
  117.                 _nop_();
  118.                 SRCLK = 1;        
  119.         }

  120.         RCLK = 0;
  121.         _nop_();
  122.         _nop_();
  123.         RCLK = 1;
  124. }


  125. /*******************************************************************************
  126. * 函 数 名       : tempture_display()
  127. * 函数功能                 : 滚动显示“温度超标!”
  128. * 输    入       : 无
  129. * 输    出             : 无
  130. *******************************************************************************/
  131. void temperature_display()
  132. {

  133.         for(j=0;j<3;j++)
  134.          {
  135.                 for(i=0;i<16;i++)
  136.                  {
  137.                         if(i<h)
  138.                          {
  139.                                 Hc595SendByte(ledwei[i+16],ledwei[i],ledduan1[i+16+offset],ledduan1[i+offset]);
  140.                                 delay(10);
  141.                          }
  142.                         else
  143.                          {
  144.                                 Hc595SendByte(ledwei[i+16],ledwei[i],ledduan1[16+i+offset+16],ledduan1[i+offset+16]);
  145.                                 delay(10);        
  146.                          }
  147.                         
  148.                  }

  149.           }
  150.                 h--;offset++;
  151.                 if(h==0)
  152.                         {h=16;offset+=16;}
  153.                 if(offset>128)
  154.                         {h=16;offset=0;}        
  155. }               
  156.                

  157. /*******************************************************************************
  158. * 函 数 名         : datapros()
  159. * 函数功能                   : 温度读取处理转换函数
  160. * 输    入         : temp
  161. * 输    出         : 无
  162. *******************************************************************************/

  163. u16 datapros(int temp)         
  164. {
  165.            float tp;  
  166.         if(temp< 0)                                //当温度值为负数
  167.           {
  168.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  169.                 temp=temp-1;
  170.                 temp=~temp;
  171.                 tp=temp;
  172.                 temp=tp*0.0625+0.5;        
  173.                 LCD_ShowChar(2,6,'-');
  174.                 LCD_ShowNum(2,7,temp/100,1);
  175.                 LCD_ShowNum(2,8,temp%100/10,1);
  176.                 LCD_ShowNum(2,9,temp%10,1);
  177.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  178.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  179.                 //算加上0.5,还是在小数点后面。

  180.           }
  181.          else
  182.           {                        
  183.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  184.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  185.                 temp=tp*0.0625+0.5;        
  186.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  187.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  188.                 //算加上0.5,还是在小数点后面。
  189.                 LCD_ShowChar(2,6,'+');
  190.                 LCD_ShowNum(2,7,temp/100,1);
  191.                 LCD_ShowNum(2,8,temp%100/10,1);
  192.                 LCD_ShowNum(2,9,temp%10,1);
  193.                 LCD_WriteData(0xdf);
  194.                 LCD_ShowChar(2,11,'C');
  195.         }
  196.         return temp;
  197.         
  198. }

  199. void sound(u8 t)
  200. {
  201.          uchar i;
  202.         for(i=0;i<100;i++)
  203.         {
  204.                  beep = ~beep;
  205.                 delay(t);
  206.         }
  207.         beep = 0;
  208. }


  209. /*******************************************************************************
  210. * 函 数 名         : key_scan
  211. * 函数功能                   : 按键检测函数,判断按键K1是否按下
  212. *******************************************************************************/
  213. void key_scan()//先斩后奏检测
  214. {
  215.         static bit Flag=1;
  216.         if(!k1&&Flag)//一定是有按键按下
  217.         {
  218.                 sound(50);
  219.                 max_value=max_value+1;//处理
  220.                 Flag=0;//禁止进入

  221.                 delay10ms();//进入消抖,消抖后是低电平
  222.         }
  223.         if(k1&&!Flag)//按键弹起确认
  224.         {        
  225.                 delay10ms();//先消抖
  226.                 if(k1)//确认弹起
  227.                         Flag=1;//允许再次进入按键检测        
  228.         }
  229.         if(!k2&&Flag)//一定是有按键按下
  230.         {        
  231.                 sound(50);
  232.                 max_value=max_value-1;//处理
  233.                 Flag=0;//禁止进入

  234.                 delay10ms();//进入消抖,消抖后是低电平
  235.         }
  236.         if(k2&&!Flag)//按键弹起确认
  237.         {        
  238.                
  239.                 delay10ms();//先消抖
  240.                 if(k2)//确认弹起
  241.                         Flag=1;//允许再次进入按键检测        
  242.         }
  243.         if(!k3&&Flag)//一定是有按键按下
  244.         {
  245.                 sound(50);
  246.                 LCD_Init();//处理
  247.                 Flag=0;//禁止进入

  248.                 delay10ms();//进入消抖,消抖后是低电平
  249.         }
  250.         if(k3&&!Flag)//按键弹起确认
  251.         {        
  252.                 delay10ms();//先消抖
  253.                 if(k3)//确认弹起
  254.                         Flag=1;//允许再次进入按键检测        
  255.         }
  256.         if(!k4&&Flag)//一定是有按键按下
  257.         {
  258.                 sound(50);//处理
  259.                 Flag=0;//禁止进入

  260.                 delay10ms();//进入消抖,消抖后是低电平
  261.         }
  262.         if(k4&&!Flag)//按键弹起确认
  263.         {        
  264.                 delay10ms();//先消抖
  265.                 if(k4)//确认弹起
  266.                         Flag=1;//允许再次进入按键检测        
  267.         }
  268. }


  269. /*******************************************************************************
  270. * 函 数 名         : clock_h_l()
  271. * 函数功能                   : 报警函数
  272. *******************************************************************************/
  273. void clock_h_l()
  274. {
  275.         if(temp>=max_value)
  276.         {
  277.                 temperature_display();
  278.         }

  279. }
  280. void main ()
  281. {
  282.         LCD_Init();
  283.         
  284.         while(1)
  285.         {        
  286.                 datapros(Ds18b20ReadTemp());         //数据处理函数
  287.                 LCD_ShowString(1,2,"set:");
  288.                 LCD_ShowChar(1,6,'+');
  289.                 LCD_ShowNum(1,7,max_value,2);
  290.                 LCD_WriteData(0xdf);
  291.                 LCD_ShowChar(1,10,'C');
  292.                 LCD_ShowString(2,2,"now:");
  293.                 key_scan();
  294.                 clock_h_l();
  295.                                 
  296.         }               
  297. }
复制代码



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

使用道具 举报

沙发
ID:462827 发表于 2020-5-3 01:32 | 只看该作者
先斩后奏检测   笑死我了
回复

使用道具 举报

板凳
ID:213173 发表于 2020-5-3 07:32 | 只看该作者
这个程序中缺陷比较多,最明显的是按键扫描和蜂鸣器会干扰其它程序运行。报警函数不能执行是因为全局变量temp没有被赋值,默认为0。程序中此temp非彼temp。修改如下:

void clock_h_l(int Temp)
{
        if(Temp>=max_value)
        {
                temperature_display();
        }
}
void main ()
{
        LCD_Init();
        while(1)
        {        
                key_scan();
                clock_h_l(datapros(Ds18b20ReadTemp()));
                LCD_ShowString(1,2,"set:");
                LCD_ShowChar(1,6,'+');
                LCD_ShowNum(1,7,max_value,2);
                LCD_WriteData(0xdf);
                LCD_ShowChar(1,10,'C');
                LCD_ShowString(2,2,"now:");
        }               
}
回复

使用道具 举报

地板
ID:718783 发表于 2020-5-3 11:58 | 只看该作者
wulin 发表于 2020-5-3 07:32
这个程序中缺陷比较多,最明显的是按键扫描和蜂鸣器会干扰其它程序运行。报警函数不能执行是因为全局变量te ...

谢谢老哥,我懂了,执行成功了,非常感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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