已經添加附件,大家各取所需.51單片機控制的溫控儀設計資料
0.png (50.32 KB, 下載次數: 35)
下載附件
2018-1-28 03:35 上傳
溫控儀電路原理圖:
0.jpg (80.47 KB, 下載次數: 44)
下載附件
2018-1-28 03:37 上傳
pcb工程文件:
0.jpg (113.36 KB, 下載次數: 34)
下載附件
2018-1-28 03:38 上傳
溫控儀單片機源程序如下:
- #include<reg52.h>
- #include"eeprom.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit wei1 = P1^3; //數碼管位選
- sbit wei2 = P1^2;
- sbit wei3 = P1^1;
- sbit wei4 = P1^0;
- sbit DQ = P3^2; //溫度
- sbit k1=P3^7; //功能按鍵
- sbit k2=P3^6; // 增加鍵
- sbit k3=P3^5; //減少鍵
- uchar TL,TH,TN,TD;
- sbit beep=P1^6;
- uchar count,num,m,s1num=0; //溫度值
- uchar htemp=33,ltemp=15; //溫度上下線初始化
- float f_temp;
- int key_delay=0;
- const int key_count=200;
- bit yyp=1,halarm=0,lalarm=0;
- uchar code TAB[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
- uchar code TAB1[]={0xbf,0x89,0xc7,0xC6}; //三個依次是 - H L 后面兩個是溫度符號大寫的C
- /****毫秒級延時函數*****/
- void delay(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay1(uchar i)
- {
- uchar j=100;
- for(i;i>0;i--)
- for(j;j>0;j--)
- {;}
- }
- void di()
- {
- beep=0;
- delay(100);
- beep=1;
- }
- /***********ds18b20延遲子函數(晶振12MHz )*******/
- ///////////////////////////////////////////////////
- void delay_18B20(unsigned int i)
- {
- while(i--);
- }
- ///////////////////////////////////////////////////
- /**********ds18b20初始化函數**********************/
- ////////////////////////////////////////////////////
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復位
- delay_18B20(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- delay_18B20(80); //精確延時 大于 480us
- DQ = 1; //拉高總線
- delay_18B20(14);
- x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- delay_18B20(20);
- }
- ////////////////////////////////////////////
- /***********ds18b20讀一個字節**************/
- ///////////////////////////////////////////
- unsigned char ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- delay_18B20(4);
- }
- return(dat);
- }
- //////////////////////////////////////////////////
- /*************ds18b20寫一個字節****************/
- //////////////////////////////////////////////////
- void WriteOneChar(uchar dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- delay_18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /**************讀取ds18b20當前溫度************/
- //////////////////////////////////////////////
- void ReadTemp()
- {
-
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- Init_DS18B20();
- delay(1);
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
- TL=ReadOneChar(); //先讀的是溫度值低位
- TH=ReadOneChar(); //接著讀的是溫度值高位
- TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
- //這樣得出的是溫度的整數部分,小數部分被丟棄了
-
- TD=(TL%16)*10/16; //計算溫度的小數部分,將余數乘以10再除以16取整,
- //這樣得到的是溫度小數部分的第一位數字(保留1位小數)
- }
- ////////////////////////////////////////////////
- void get_wendu(uchar m)
- {
- uchar ws,wg;
- ws=m/10;
- wg=m%10;
- wei1=0; //讀取溫度的十位和個位
- P0=TAB[ws];
- delay(2);
- wei1=1;
- P0=0xff;
- wei2=0;
- P0=TAB[wg]& 0x7f;
- delay(2);
- wei2=1;
- P0=0xff;
-
- }
- void get_wendu2(uchar m)
- {
- wei3=0;
- P0=TAB[m];
- delay(2);
- wei3=1;
- P0=0xff;
-
- wei4=0;
- P0=TAB1[3];
- delay(2);
- wei4=1;
- P0=0xff;
-
-
- }
- /////////調最高溫度調用的函數//////
- void hdisplay(uchar dat)
- {
- uchar fs,fg;
- wei1=0; //讀取最高溫度符號“H-”
- P0=TAB1[1];
- delay(5);
- wei1=1;
- P0=0xff;
-
- wei2=0;
- P0=TAB1[0];
- delay(5);
- wei2=1;
- P0=0xff;
-
- fs=dat/10;
- fg=dat%10;
- wei3=0;
- P0=TAB[fs];
- delay(5);
- wei3=1;
- P0=0xff;
- wei4=0;
- P0=TAB[fg];
- delay(5);
- wei4=1;
- P0=0xff;
- }
- /////////調最低溫度調用的函數//////
- void ldisplay(uchar dat)
- {
- uchar fs,fg;
- wei1=0; //讀取最低溫度符號“L=”
- P0=TAB1[2];
- delay(2);
- wei1=1;
- P0=0xff;
-
- wei2=0;
- P0=TAB1[0];
- delay(2);
- wei2=1;
- P0=0xff;
-
- fs=dat/10;
- fg=dat%10;
- wei3=0;
- P0=TAB[fs];
- delay(2);
- wei3=1;
- P0=0xff;
- wei4=0;
- P0=TAB[fg];
- delay(2);
- wei4=1;
- P0=0xff;
- }
- /****按鍵掃描******/
- void keyscan()
- {
- if(k1==0)
- {
- delay(10);
- if(k1==0)
- {
- yyp=0;
- s1num++;
- while(!k1); //等待按鍵釋放
- di();
- htemp=byte_read(0x2200);
- ltemp=byte_read(0x2000);
- switch(s1num)
- {
- case 1:break;
- case 2:break;
- case 3:if(s1num==3)s1num=0;yyp=1;
- break;
- }
-
-
- }
- }
- if(s1num!=0)
- {
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- do
- {
- delay1(10);
- }
- while((!k2)&(key_delay++<key_count)); ///等待按鍵釋放
- di();
- switch(s1num)
- {
- case 1: htemp++;
- if(htemp==99)htemp=0;
- hdisplay(htemp);
- SectorErase(0x2200);//擦除扇區
- byte_write(0x2200,htemp);//重新寫入數據
- break;
- case 2: ltemp++;
- if(ltemp==99)ltemp=0;
- ldisplay(ltemp);
- SectorErase(0x2000);//擦除扇區
- byte_write(0x2000,ltemp);//重新寫入數據
- break;
- }
- }
- }
- if(k3==0)
- {
- delay(10);
- if(k3==0)
- {
- do
- {
- delay1(10);
- }
- while((!k3)&(key_delay++<key_count)); //等待按鍵釋放
- di();
- switch(s1num)
- {
- case 1: htemp--;
- if(htemp==0)htemp=99;
- hdisplay(htemp);
- SectorErase(0x2200);//擦除扇區
- byte_write(0x2200,htemp);//重新寫入數據
- break;
- case 2: ltemp--;
- if(ltemp==0)ltemp=99;
- ldisplay(ltemp);
- SectorErase(0x2000);//擦除扇區
- byte_write(0x2000,ltemp);//重新寫入數據
- break;
- }
- }
- }
- }
- }
- ///////////////////////////////////////////////////////////
- void baojing()
- {
- if((TN>=htemp)||(TN<=ltemp)) //溫度高于設置最大溫度
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
溫控資料.zip
(12.91 MB, 下載次數: 41)
2018-1-27 19:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|