|
這個(gè)是我的課件做的,所以電路圖不知道怎么畫 就用畫圖程序畫了一個(gè),將就看吧,功能很簡(jiǎn)單就是檢測(cè)溫度的高低,高于某個(gè)值就報(bào)警,蜂鳴器響,同理低于某個(gè)值也響,最高值和最低值可以通過修改源碼初始化值重新編譯下載到單片機(jī)里,當(dāng)然,我也設(shè)置了功能按鍵,可以通過diy板上的鍵設(shè)置這兩個(gè)值,區(qū)別在于每次斷電后這兩個(gè)值會(huì)恢復(fù)到源碼里面設(shè)置那個(gè)值,好了上圖上源碼
圖片2.png (472.79 KB, 下載次數(shù): 45)
下載附件
diy成品演示
2019-9-9 11:41 上傳
圖片1.png (29.67 KB, 下載次數(shù): 57)
下載附件
diy板接線電路圖
2019-9-9 11:41 上傳
單片機(jī)源程序如下:
- //采用共陰極數(shù)碼管
- //P0接數(shù)碼管段選 可加一個(gè)排阻
- //P2接數(shù)碼管位選
- //P1^1接溫度傳感器
- //P1^0接蜂鳴器(需要一個(gè)三極管放大來驅(qū)動(dòng)蜂鳴器,通常是8550)
- //僅供參考(八哥)
- /*****************************************************************************/
- //程序部分開始//
- /****************************************************************************/
- //頭文件
- #include <reg51.h>
- /*****************************************************************************/
- //數(shù)碼管的段碼編碼
- unsigned char code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //下一行的數(shù)組可以顯示數(shù)值外,還可以顯示數(shù)碼管的點(diǎn)
- unsigned char code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
- unsigned char code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned int sec = 0,item_h=300,item_l=100;
- bit w = 0;
- bit v = 1;
- /*****************************************************************************/
- sbit KEY_1 = P1^4;
- sbit KEY_2 = P1^5;
- sbit KEY_3 = P1^6;
- sbit KEY_4 = P1^7;
- sbit led_r = P1^3;
- sbit led_g = P1^2;
- sbit DQ = P1^1;//ds18B20
- sbit beep = P1^0;//蜂鳴器
- /******************************************************************************/
- //DS18B20溫度傳感器驅(qū)動(dòng)(顯示0至60度)
- /******************************************************************************/
- void Delay(int num){//延時(shí)函數(shù)
- while(num--) ;
- }
- /****************************************************************************/
- void Delay_1ms(unsigned int a){//延時(shí)函數(shù) 1MS/次
- unsigned char i;
- while( --a != 0){
- for(i = 0; i < 125; i++); //一個(gè) ; 表示空語句,CPU空轉(zhuǎn)。
- } //i 從0加到125,CPU大概就耗時(shí)1毫秒
- }
- /****************************************************************************/
- /******************************************************************************/
- void Init_DS18B20(void){//初始化ds1820
- unsigned char x=0;
- DQ = 1; //DQ復(fù)位
- Delay(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- Delay(80); //精確延時(shí) 大于 480us
- DQ = 1; //拉高總線
- Delay(14);
- x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
- Delay(20);
- }
- /******************************************************************************/
- unsigned char ReadOneChar(void){//讀一個(gè)字節(jié)
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--){
- DQ = 0; // 給脈沖信號(hào)
- dat>>=1;
- DQ = 1; // 給脈沖信號(hào)
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- return(dat);
- }
- /******************************************************************************/
- void WriteOneChar(unsigned char dat){//寫一個(gè)字節(jié)
- unsigned char i=0;
- for (i=8; i>0; i--){
- DQ = 0;
- DQ = dat&0x01;
- Delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /******************************************************************************/
- unsigned int ReadTemperature(void){//讀取溫度
- unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
- a=ReadOneChar(); //讀低8位
- b=ReadOneChar(); //讀高8位
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10+0.5; //放大10倍輸出并四舍五入
- return(t);
- }
- /*****************************************************************************/
- void Display(unsigned int i)
- {
- unsigned char a=0,b=0,c=0;
- a=i/100;
- b=(i/10)%10;
- c=i%10;
-
- P0 = 0;
- P2 = LED_W[3];
- P0 = table[12]; //顯示C
- Delay_1ms(7.5);
-
- P0 = 0;
- P2 = LED_W[2];
- P0 = table[c]; //顯示小數(shù)位溫度
- Delay_1ms(7.5);
-
- P0 = 0;
- P2 = LED_W[1];
- P0 = table_d[b]; //顯示個(gè)位溫度,帶點(diǎn)顯示
- Delay_1ms(7.5);
-
- P0 = 0;
- P2 = LED_W[0];
- P0 = table[a]; //顯示十位溫度
- Delay_1ms(7.5);
- }
- /*****************************************************************************/
- void Beep_key(void){//-揚(yáng)聲器--按鍵音
- if (v == 1)
- {
- unsigned char a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
- for(a=100;a>0;a--){//聲音的長(zhǎng)度
- beep = ~beep;
- Delay(50);//音調(diào)設(shè)置延時(shí)
- }
- beep = 1;//音樂結(jié)束后揚(yáng)聲器拉高關(guān)閉
- }
- }
- /*****************************************************************************/
- void set_t(unsigned char sel)
- {
- if (sel==0)
- {
- Display(item_h);
- led_r = 1;
- led_g = 0;
- }
- if (sel==1)
- {
- Display(item_l);
- led_r = 0;
- led_g = 1;
- }
- if (KEY_1 == 0)
- {
- if (KEY_1 == 0 && sel == 0) item_h--;
- if (KEY_1 == 0 && sel == 1) item_l--;
- //if (KEY_1 == 0 && sel == 2) v = 1;
- }
- if (KEY_2 == 0)
- {
- if (KEY_2 == 0 && sel == 0) item_h++;
- if (KEY_2 == 0 && sel == 1) item_l++;
- //if (KEY_1 == 0 && sel == 2) v = 0;
- }
- }
- /*****************************************************************************/
- void main(void)
- {
- unsigned char e=0;
- beep = 1;
- while(1)
- {
- if(w == 0)
- {
- sec=ReadTemperature();//讀溫度并送顯
- Display(sec);
- if (sec > item_h || sec < item_l)beep = 0; //蜂鳴器響
- else beep = 1;
- }
- else
- {
- if(e==0)Display(item_h);
- if(e==1)Display(item_l);
- }
- /*******************************************************/
- if (KEY_1 == 0) //減調(diào)整
- {
- Delay_1ms(15);
- if (KEY_1 == 0 && w == 1)//調(diào)溫狀態(tài)減調(diào)整
- {
- Beep_key();
- set_t(e);
- }
- }
- /*******************************************************/
- if (KEY_2 == 0) //加調(diào)整
- {
- Delay_1ms(15);
- if (KEY_2 == 0 && w == 1)//調(diào)溫狀態(tài)加調(diào)整
- {
- Beep_key();//按鍵音
- set_t(e);
- }
- }
- /*******************************************************/
- if (KEY_3 == 0) //模式調(diào)節(jié)
- {
- Delay_1ms(15);
- if (KEY_3 == 0 && w == 0) //正常顯示狀態(tài)進(jìn)入調(diào)溫狀態(tài)
- {
- Beep_key();
- w = 1;
- }
- if (KEY_3 == 0 && w == 1) //調(diào)溫狀態(tài)選擇上下限調(diào)節(jié)
- {
- e++;
- if (e>1) e = 0;
- set_t(e);
- }
- }
- /*******************************************************/
- if (KEY_4 == 0) //調(diào)溫狀時(shí)退出調(diào)溫
- {
- Delay_1ms(15);
- if (KEY_4 == 0 && w == 1)
- {
- Beep_key();
- w = 0;
- }
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|