標題:
大佬們看看我的這個報警函數(shù)為啥不能執(zhí)行,這個單片機程序沒有錯誤沒有警告
[打印本頁]
作者:
liangsheng0212
時間:
2020-5-2 22:03
標題:
大佬們看看我的這個報警函數(shù)為啥不能執(zhí)行,這個單片機程序沒有錯誤沒有警告
我的報警函數(shù)clock_h_l()也就是當測的溫度大于我給的閾值時,讓點陣滾動顯示報警,燒錄我的單片機上為啥執(zhí)行不了
下面是我的代碼,希望大佬們幫幫我
單片機源程序如下:
#include<reg51.h>
#include <intrins.h>
#include"LCD1602.h"
#include"temp.h"
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
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點陣的位選,也就是類似于數(shù)碼管的位選,因為要對其動態(tài)掃描操作
//數(shù)組前16位和后16位數(shù)據(jù)正好是相反的,也就是說先讓第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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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; 此字體下對應(yīng)的點陣為:寬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,
};
/*******************************************************************************
* 函 數(shù) 名 : delay10ms()
* 函數(shù)功能 : 延時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--);
}
/*******************************************************************************
* 函 數(shù) 名 : delay
* 函數(shù)功能 : 延時函數(shù),i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數(shù) 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
* 函數(shù)功能 : 通過595發(fā)送四個字節(jié)的數(shù)據(jù)
* 輸 入 : dat1:第4個595輸出數(shù)值
* * dat2: 第3個595輸出數(shù)值
* * dat3:第2個595輸出數(shù)值
* * dat4:第1個595輸出數(shù)值
* 輸 出 : 無
*******************************************************************************/
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat1 >> 7; //從最高位開始發(fā)送
dat1 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat2 >> 7; //從最高位開始發(fā)送
dat2 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat3 >> 7; //從最高位開始發(fā)送
dat3 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat4 >> 7; //從最高位開始發(fā)送
dat4 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
/*******************************************************************************
* 函 數(shù) 名 : tempture_display()
* 函數(shù)功能 : 滾動顯示“溫度超標!”
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
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;}
}
/*******************************************************************************
* 函 數(shù) 名 : datapros()
* 函數(shù)功能 : 溫度讀取處理轉(zhuǎn)換函數(shù)
* 輸 入 : temp
* 輸 出 : 無
*******************************************************************************/
u16 datapros(int temp)
{
float tp;
if(temp< 0) //當溫度值為負數(shù)
{
//因為讀取的溫度是實際溫度的補碼,所以減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);
//留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數(shù)點后面。
}
else
{
tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
temp=tp*0.0625+0.5;
//留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數(shù)點后面。
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;
}
/*******************************************************************************
* 函 數(shù) 名 : key_scan
* 函數(shù)功能 : 按鍵檢測函數(shù),判斷按鍵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;//允許再次進入按鍵檢測
}
}
/*******************************************************************************
* 函 數(shù) 名 : clock_h_l()
* 函數(shù)功能 : 報警函數(shù)
*******************************************************************************/
void clock_h_l()
{
if(temp>=max_value)
{
temperature_display();
}
}
void main ()
{
LCD_Init();
while(1)
{
datapros(Ds18b20ReadTemp()); //數(shù)據(jù)處理函數(shù)
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();
}
}
復(fù)制代碼
作者:
hantu
時間:
2020-5-3 01:32
先斬后奏檢測 笑死我了
作者:
wulin
時間:
2020-5-3 07:32
這個程序中缺陷比較多,最明顯的是按鍵掃描和蜂鳴器會干擾其它程序運行。報警函數(shù)不能執(zhí)行是因為全局變量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:");
}
}
作者:
liangsheng0212
時間:
2020-5-3 11:58
wulin 發(fā)表于 2020-5-3 07:32
這個程序中缺陷比較多,最明顯的是按鍵掃描和蜂鳴器會干擾其它程序運行。報警函數(shù)不能執(zhí)行是因為全局變量te ...
謝謝老哥,我懂了,執(zhí)行成功了,非常感謝
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1