我的報警函數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();
-
- }
- }
復制代碼
|