|
基于51單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)附件里有仿真電路和程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (16.85 KB, 下載次數(shù): 64)
下載附件
2019-12-10 00:45 上傳
單片機(jī)源程序如下:
- //數(shù)字溫度計(jì)設(shè)計(jì)
- //實(shí)時(shí)讀取并且顯示溫度
- #include<reg51.h>
- #include<ds18b20.c>
- sbit P3_0 = P3^0;
- code uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90};//共陽(yáng)極數(shù)碼管數(shù)顯編碼
- uchar cp1,cp2;
- uint aa;
- uint temp_num,temp_num1,temp_dot,temp; //temp_num、temp_num1為溫度整數(shù)部分,temp_dot小數(shù)部分,中間變量temp
- void timer0_init(void) //中斷服務(wù)函數(shù)
- {
- TMOD = 0x01;
- TH0 = (65536 - 2000) / 256;
- TL0 = (65536 - 2000) % 256;
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- }
- void timer0_isr(void) interrupt 1 //中斷服務(wù)函數(shù)
- {
- TH0 = (65536 - 2000) / 256;
- TL0 = (65536 - 2000) % 256;
- cp1++;
- if(cp1 >= 250) //1秒
- {
- cp1 = 0;
- temp_num = Read_Temperature(); //得到溫度整數(shù)
- temp_dot = c * 0.625; //得到溫度小數(shù)
- if((temp_num & 0x80) == 0x80) //如果溫度為負(fù)值
- {
- temp_dot = (0x0f - c) * 0.625; //補(bǔ)碼轉(zhuǎn)換原碼,小數(shù)處理
- temp_num1 = 0xff - temp_num; //補(bǔ)碼轉(zhuǎn)換原碼,整數(shù)處理
- }
- else temp_num1 = temp_num; //小數(shù)轉(zhuǎn)換為十進(jìn)制
- }
- P0 = 0xff;
- switch(cp2)
- {
- case 0: P0 = 0xff; //消隱
- P3_0 = 0;P0 = 0x01;P3_0 = 1;P3_0 = 0;
- P0 = seven_seg[temp_dot]; break; //小數(shù)部分顯示
- case 1: P0 = 0xff;
- P3_0 = 0;P0 = 0x02;P3_0 = 1;P3_0 = 0;
- P0 = 0x7f & seven_seg[temp_num1 % 10%10]; break;//整數(shù)部分各位顯示
- case 2:
- {
- if(temp_num < 10)
- {
- P0 = 0xff;
- P3_0 = 0;P0 = 0x04;P3_0 = 1;P3_0 = 0;
- P0 = 0xff; break;
- } //如果溫度小于10度,且為正值,十位0不顯示
- if((temp_num > 0x80) && ( temp_num1 < 10))
- {
- P0 = 0xff;
- P3_0 = 0;P0 = 0x04;P3_0 = 1;P3_0 = 0;
- P0 = 0xbf; break;
- } //如果溫度小于10度,且為負(fù)值,十位0不顯示,只顯示"-"
- P0 = 0xff;
- P3_0 = 0;P0 = 0x04;P3_0 = 1;P3_0 = 0;
- P0 = seven_seg[temp_num1 / 10%10]; break;//如果溫度大于10度,10位正常顯示
- }
- case 3:
- {
- if((temp_num < 0x80) && (temp_num1 >= 100))
- {
- P0 = 0xff;
- P3_0 = 0;P0 = 0x08;P3_0 = 1;P3_0 = 0;
- P0 = seven_seg[temp_num1 / 100]; break; //如果溫度為負(fù)值,且十位不為0,百位顯示"-"
- }
-
- }
- case 4:
- {
- if((temp_num > 0x80) && ((temp_num1 / 10) > 0))
- {
- P0 = 0xff;
- P3_0 = 0;P0 = 0x08;P3_0 = 1;P3_0 = 0;
- P0 = 0xbf; break; //如果溫度為負(fù)值,且十位不為0,百位顯示"-"
- }
- }
- }
- cp2++;
- if(cp2 >= 5)
- cp2=0;
- }
- void main(void)
- {
- timer0_init();
- write_temprom(50,40); //向18B20的暫存器存入溫度上下限
- Write_OneChar(0x48); //向18B20的EEROM中寫數(shù)據(jù)
- temp = read_temprom;
- while(1);
- }
復(fù)制代碼
所有資料51hei提供下載:
數(shù)字溫度計(jì)設(shè)計(jì).rar
(56.05 KB, 下載次數(shù): 60)
2019-12-8 14:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|