要求基本上是實現的。
溫度測控顯示系統 設計功能要求: (1) DS18B20為溫度傳感器,實時采樣溫度;溫度測量精度:±0.1℃。 (2) 4位LED數碼管主要用于顯示溫度。 (3) 無任何鍵按下,4位LED數碼管顯示時分,初值顯示09:09。 (4)按鍵K1按下,數碼管顯示本機測量的溫度值。
希望可以得到采納!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (32.32 KB, 下載次數: 36)
下載附件
2019-7-5 00:34 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
- uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含小數點共陽段碼 0-9
- char displayData[4];
- uint shi,fen=9,miao=9,T50ms,tt;//時,分,秒,50ms
- uchar bai,sh,ge,a,b,t;
- sbit a0=P2^0;//連接P2.0
- sbit a1=P2^1;//連接P2.1
- sbit a2=P2^2;//連接P2.2
- sbit a3=P2^3;//連接P2.3
- sbit DQ=P3^7;//連接P3.7
- /*void delay(uchar n)//延時5微秒函數
- {
- do{
- _nop_();
- _nop_();
- _nop_();
- n--;
- }
- while(n);
- }*/
- void delay(uint n)
- {
- while(n--);
- }
- void init() //初始化子程序
- {
- TMOD=0x01;//定時器T0為方式1
- TH0=(65536-50000)/256;//采用方式1,并設置定時器初值,50ms
- TL0=(65536-50000)%256;
- ET0=1;//啟動T0中斷允許
- EA=1;//總中斷允許
- TR0=1;//啟動T0
- EX0=1;//允許外部中斷0中斷
- //PX0=1;//外部中斷0高優先級中斷
- //PT0=1;//定時器T0中斷高優先級中斷
- }
- void scan()//掃描
- {
- displayData[0] = tab[miao%10];
- displayData[1] = tab[(miao/10)%10];
- displayData[2] = tab[fen%10]|0x80;
- displayData[3] = tab[(fen/10)%10];
- }
- void display() //顯示位數
- {
- char i;
- for(i=0;i<=3;i++)
- {
- switch(i)
- {
- case 0:a0=0;a1=0;a2=0;a3=1;break;//顯示第0位
- case 1:a0=0;a1=0;a2=1;a3=0;break;//顯示第1位
- case 2:a0=0;a1=1;a2=0;a3=0;break;//顯示第2位
- case 3:a0=1;a1=0;a2=0;a3=0;break;//顯示第3位
- }
- if(i==2){
- P0=(displayData[i]&0x7f);//加小數點
- }else
- P0=displayData[i];//發送數據
- delay(200); //間隔一段時間掃描
- P0=0xff;//高電位清零
- }
- }
- int_DS18b20()//對18b20初始化函數
- {
- uchar x=0;
- DQ = 1; //DQ復位
- delay(8);
- DQ=0; //釋放DQ
- delay(80); //DS18B20收到信號后延時
- DQ=1; //讀取DQ
- delay(10);
- x=DQ;
- delay(20);
- return x;
- }
- void write_byte(uchar dat)//寫時序
- {
- uchar i=0;
- for(i=8;i>0;i--){
- DQ=0;
- DQ=dat&0x01;//寫1,在15微秒內拉低
- delay(5);//寫0,拉低60微秒
- DQ=1;
- dat>>=1;//右移1位,原數值除以2
- }
- delay(4);
- }
- read_byte()//讀時序
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--){
- DQ=0;//拉低ds18b20單總線
- dat>>=1;
- DQ=1;//15微秒內拉釋放總線,等待ds18b20的存在脈沖
- if(DQ)
- dat|=0x80;
- delay(4);
- }
- return (dat);
- }
-
- void int_()
- {
- while(int_DS18b20());
- write_byte(0xcc);//發Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
- write_byte(0x44);//啟動溫度轉換
- }
- void ReadTemperature()//讀取溫度的函數
- {
- uchar a=0;
- unsigned b=0;
- unsigned t=0;
- int_();
- delay(5);//延時,必要
- int_DS18b20();
- write_byte(0xCC);//跳過讀寫序列號
- write_byte(0xBE);//讀溫度寄存器
- delay(5);
- a=read_byte();//讀取溫度
- b=read_byte();
- t=b<<4;//取高八位的后三位
- t+=(a&0xf0)>>4;//低八位的高四位加上高八位中后三位的值
- tt=a&0x0f;//小數位
- sh=((b*256+a)>>4);//實際溫度
- ge=tt*0.0625*10;
- }
- void wenduxianshi()//溫度顯示的函數
- {
- a0=1;
- P0=tab[sh/10];//百
- delay(100);
- a0=0;
-
- a1=1;
- P0=tab[sh%10]+0x80;//十位,+0x80可以顯示小數點后一位
- delay(100);
- a1=0;
-
- a2=1;
- P0=tab[ge%10];//個位
- delay(100);
- a2=0;
-
- a3=1;
- P0=0xc6;// C
- delay(100);
- a3=0;
- }
- void main()//主函數
- {
- init();//初始化程序
- while(1){
- scan();//掃描
- display();//顯示
- }
- }
- void timer0() interrupt 1//timer0中斷服務子程序定是時間為50ms
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- T50ms++;
- if(T50ms==20)//仿分鐘
- {
- T50ms=0;
- miao++;
- if(miao>=60)
- {
- miao=miao-60;
- fen++;
- if(fen>=60)
- {
- fen=fen-60;
- shi++;
- }
- }
- }
- }
- void timer1() interrupt 0//外部中斷0
- {
- uint count=0;
- while(1)
- {
- count++;
- ReadTemperature();
- wenduxianshi();
- wenduxianshi();
- if(count==250)//隔一段時間返回時鐘
- {
- miao=miao+4;
- break;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
溫度.rar
(23.68 KB, 下載次數: 128)
2019-7-3 09:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|