基于51單片機的數字溫度計設計附件里有仿真電路和程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (16.85 KB, 下載次數: 64)
下載附件
2019-12-10 00:45 上傳
單片機源程序如下:
- //數字溫度計設計
- //實時讀取并且顯示溫度
- #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};//共陽極數碼管數顯編碼
- uchar cp1,cp2;
- uint aa;
- uint temp_num,temp_num1,temp_dot,temp; //temp_num、temp_num1為溫度整數部分,temp_dot小數部分,中間變量temp
- void timer0_init(void) //中斷服務函數
- {
- TMOD = 0x01;
- TH0 = (65536 - 2000) / 256;
- TL0 = (65536 - 2000) % 256;
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- }
- void timer0_isr(void) interrupt 1 //中斷服務函數
- {
- TH0 = (65536 - 2000) / 256;
- TL0 = (65536 - 2000) % 256;
- cp1++;
- if(cp1 >= 250) //1秒
- {
- cp1 = 0;
- temp_num = Read_Temperature(); //得到溫度整數
- temp_dot = c * 0.625; //得到溫度小數
- if((temp_num & 0x80) == 0x80) //如果溫度為負值
- {
- temp_dot = (0x0f - c) * 0.625; //補碼轉換原碼,小數處理
- temp_num1 = 0xff - temp_num; //補碼轉換原碼,整數處理
- }
- else temp_num1 = temp_num; //小數轉換為十進制
- }
- 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; //小數部分顯示
- case 1: P0 = 0xff;
- P3_0 = 0;P0 = 0x02;P3_0 = 1;P3_0 = 0;
- P0 = 0x7f & seven_seg[temp_num1 % 10%10]; break;//整數部分各位顯示
- 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度,且為負值,十位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; //如果溫度為負值,且十位不為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; //如果溫度為負值,且十位不為0,百位顯示"-"
- }
- }
- }
- cp2++;
- if(cp2 >= 5)
- cp2=0;
- }
- void main(void)
- {
- timer0_init();
- write_temprom(50,40); //向18B20的暫存器存入溫度上下限
- Write_OneChar(0x48); //向18B20的EEROM中寫數據
- temp = read_temprom;
- while(1);
- }
復制代碼
所有資料51hei提供下載:
數字溫度計設計.rar
(56.05 KB, 下載次數: 60)
2019-12-8 14:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|