我的报警函数clock_h_l()也就是当测的温度大于我给的阈值时,让点阵滚动显示报警,烧录我的单片机上为啥执行不了
下面是我的代码,希望大佬们帮帮我
单片机源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #include"LCD1602.h"
- #include"temp.h"
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- u16 max_value=20;
- u16 temp,offset=0;
- u8 i,j,h=16;
- //--定义使用的IO口--//
- sbit k1=P2^0;
- sbit k2=P2^1;
- sbit k3=P2^2;
- sbit k4=P2^3;
- sbit beep=P1^5;
- sbit SRCLK=P3^6;
- sbit RCLK=P3^5;
- sbit SER=P3^4;
- //定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作
- //数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平
- u8 code ledwei[]=
- {
- 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f,
- };
- u8 code ledduan1[]=
- {
- /*-- 文字: 温 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
- /*-- 文字: 度 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
- 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,
- /*-- 文字: 超 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,
- 0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,
- /*-- 文字: 标 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x10,0xD0,0xFF,0x90,0x10,0x20,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x20,0x00,
- 0x04,0x03,0x00,0xFF,0x00,0x13,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
- /*-- 文字: ! --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- /*******************************************************************************
- * 函 数 名 : delay10ms()
- * 函数功能 : 延时10ms
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void delay10ms() //误差 0us
- {
- u8 a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 数 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- * 函数功能 : 通过595发送四个字节的数据
- * 输 入 : dat1:第4个595输出数值
- * * dat2: 第3个595输出数值
- * * dat3:第2个595输出数值
- * * dat4:第1个595输出数值
- * 输 出 : 无
- *******************************************************************************/
- void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- {
- u8 a;
- SRCLK = 1;
- RCLK = 1;
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat1 >> 7; //从最高位开始发送
- dat1 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat2 >> 7; //从最高位开始发送
- dat2 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat3 >> 7; //从最高位开始发送
- dat3 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat4 >> 7; //从最高位开始发送
- dat4 <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
- /*******************************************************************************
- * 函 数 名 : tempture_display()
- * 函数功能 : 滚动显示“温度超标!”
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void temperature_display()
- {
- for(j=0;j<3;j++)
- {
- for(i=0;i<16;i++)
- {
- if(i<h)
- {
- Hc595SendByte(ledwei[i+16],ledwei[i],ledduan1[i+16+offset],ledduan1[i+offset]);
- delay(10);
- }
- else
- {
- Hc595SendByte(ledwei[i+16],ledwei[i],ledduan1[16+i+offset+16],ledduan1[i+offset+16]);
- delay(10);
- }
-
- }
- }
- h--;offset++;
- if(h==0)
- {h=16;offset+=16;}
- if(offset>128)
- {h=16;offset=0;}
- }
-
- /*******************************************************************************
- * 函 数 名 : datapros()
- * 函数功能 : 温度读取处理转换函数
- * 输 入 : temp
- * 输 出 : 无
- *******************************************************************************/
- u16 datapros(int temp)
- {
- float tp;
- if(temp< 0) //当温度值为负数
- {
- //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625+0.5;
- LCD_ShowChar(2,6,'-');
- LCD_ShowNum(2,7,temp/100,1);
- LCD_ShowNum(2,8,temp%100/10,1);
- LCD_ShowNum(2,9,temp%10,1);
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算加上0.5,还是在小数点后面。
- }
- else
- {
- tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
- //如果温度是正的那么,那么正数的原码就是补码它本身
- temp=tp*0.0625+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算加上0.5,还是在小数点后面。
- LCD_ShowChar(2,6,'+');
- LCD_ShowNum(2,7,temp/100,1);
- LCD_ShowNum(2,8,temp%100/10,1);
- LCD_ShowNum(2,9,temp%10,1);
- LCD_WriteData(0xdf);
- LCD_ShowChar(2,11,'C');
- }
- return temp;
-
- }
- void sound(u8 t)
- {
- uchar i;
- for(i=0;i<100;i++)
- {
- beep = ~beep;
- delay(t);
- }
- beep = 0;
- }
- /*******************************************************************************
- * 函 数 名 : key_scan
- * 函数功能 : 按键检测函数,判断按键K1是否按下
- *******************************************************************************/
- void key_scan()//先斩后奏检测
- {
- static bit Flag=1;
- if(!k1&&Flag)//一定是有按键按下
- {
- sound(50);
- max_value=max_value+1;//处理
- Flag=0;//禁止进入
- delay10ms();//进入消抖,消抖后是低电平
- }
- if(k1&&!Flag)//按键弹起确认
- {
- delay10ms();//先消抖
- if(k1)//确认弹起
- Flag=1;//允许再次进入按键检测
- }
- if(!k2&&Flag)//一定是有按键按下
- {
- sound(50);
- max_value=max_value-1;//处理
- Flag=0;//禁止进入
- delay10ms();//进入消抖,消抖后是低电平
- }
- if(k2&&!Flag)//按键弹起确认
- {
-
- delay10ms();//先消抖
- if(k2)//确认弹起
- Flag=1;//允许再次进入按键检测
- }
- if(!k3&&Flag)//一定是有按键按下
- {
- sound(50);
- LCD_Init();//处理
- Flag=0;//禁止进入
- delay10ms();//进入消抖,消抖后是低电平
- }
- if(k3&&!Flag)//按键弹起确认
- {
- delay10ms();//先消抖
- if(k3)//确认弹起
- Flag=1;//允许再次进入按键检测
- }
- if(!k4&&Flag)//一定是有按键按下
- {
- sound(50);//处理
- Flag=0;//禁止进入
- delay10ms();//进入消抖,消抖后是低电平
- }
- if(k4&&!Flag)//按键弹起确认
- {
- delay10ms();//先消抖
- if(k4)//确认弹起
- Flag=1;//允许再次进入按键检测
- }
- }
- /*******************************************************************************
- * 函 数 名 : clock_h_l()
- * 函数功能 : 报警函数
- *******************************************************************************/
- void clock_h_l()
- {
- if(temp>=max_value)
- {
- temperature_display();
- }
- }
- void main ()
- {
- LCD_Init();
-
- while(1)
- {
- 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:");
- key_scan();
- clock_h_l();
-
- }
- }
复制代码
|