|
我的報(bào)警函數(shù)clock_h_l()也就是當(dāng)測(cè)的溫度大于我給的閾值時(shí),讓點(diǎn)陣滾動(dòng)顯示報(bào)警,燒錄我的單片機(jī)上為啥執(zhí)行不了
下面是我的代碼,希望大佬們幫幫我
單片機(jī)源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #include"LCD1602.h"
- #include"temp.h"
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- 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點(diǎn)陣的位選,也就是類似于數(shù)碼管的位選,因?yàn)橐獙?duì)其動(dòng)態(tài)掃描操作
- //數(shù)組前16位和后16位數(shù)據(jù)正好是相反的,也就是說先讓第3個(gè)595輸出低電平,然后再讓第4個(gè)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; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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,
- /*-- 文字: 標(biāo) --*/
- /*-- 宋體12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬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ù)功能 : 延時(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í)函數(shù),i=1時(shí),大約延時(shí)10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- * 函數(shù)功能 : 通過595發(fā)送四個(gè)字節(jié)的數(shù)據(jù)
- * 輸 入 : dat1:第4個(gè)595輸出數(shù)值
- * * dat2: 第3個(gè)595輸出數(shù)值
- * * dat3:第2個(gè)595輸出數(shù)值
- * * dat4:第1個(gè)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ā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat2 >> 7; //從最高位開始發(fā)送
- dat2 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat3 >> 7; //從最高位開始發(fā)送
- dat3 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat4 >> 7; //從最高位開始發(fā)送
- dat4 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : tempture_display()
- * 函數(shù)功能 : 滾動(dòng)顯示“溫度超標(biāo)!”
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- 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) //當(dāng)溫度值為負(fù)數(shù)
- {
- //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減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);
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- }
- else
- {
- tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- 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ù)功能 : 按鍵檢測(cè)函數(shù),判斷按鍵K1是否按下
- *******************************************************************************/
- void key_scan()//先斬后奏檢測(cè)
- {
- static bit Flag=1;
- if(!k1&&Flag)//一定是有按鍵按下
- {
- sound(50);
- max_value=max_value+1;//處理
- Flag=0;//禁止進(jìn)入
- delay10ms();//進(jìn)入消抖,消抖后是低電平
- }
- if(k1&&!Flag)//按鍵彈起確認(rèn)
- {
- delay10ms();//先消抖
- if(k1)//確認(rèn)彈起
- Flag=1;//允許再次進(jìn)入按鍵檢測(cè)
- }
- if(!k2&&Flag)//一定是有按鍵按下
- {
- sound(50);
- max_value=max_value-1;//處理
- Flag=0;//禁止進(jìn)入
- delay10ms();//進(jìn)入消抖,消抖后是低電平
- }
- if(k2&&!Flag)//按鍵彈起確認(rèn)
- {
-
- delay10ms();//先消抖
- if(k2)//確認(rèn)彈起
- Flag=1;//允許再次進(jìn)入按鍵檢測(cè)
- }
- if(!k3&&Flag)//一定是有按鍵按下
- {
- sound(50);
- LCD_Init();//處理
- Flag=0;//禁止進(jìn)入
- delay10ms();//進(jìn)入消抖,消抖后是低電平
- }
- if(k3&&!Flag)//按鍵彈起確認(rèn)
- {
- delay10ms();//先消抖
- if(k3)//確認(rèn)彈起
- Flag=1;//允許再次進(jìn)入按鍵檢測(cè)
- }
- if(!k4&&Flag)//一定是有按鍵按下
- {
- sound(50);//處理
- Flag=0;//禁止進(jìn)入
- delay10ms();//進(jìn)入消抖,消抖后是低電平
- }
- if(k4&&!Flag)//按鍵彈起確認(rèn)
- {
- delay10ms();//先消抖
- if(k4)//確認(rèn)彈起
- Flag=1;//允許再次進(jìn)入按鍵檢測(cè)
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : clock_h_l()
- * 函數(shù)功能 : 報(bào)警函數(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ù)制代碼
|
|