|
你的程序沒有大毛病。可能是時(shí)序有點(diǎn)問題,另外把讀溫度程序放在時(shí)標(biāo) if(y==1)內(nèi)為佳。修改后功能正常。
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit du26=P2^6;//數(shù)碼管段選
- sbit we27=P2^7;//數(shù)碼管位選
- sbit DS=P2^2;//溫度傳感器
- sbit led1=P3^7;//led
- uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9數(shù)碼管段表
- uchar code smgwei[]={0xfe,0xfd,0xfb,0xf7}; //1~4數(shù)碼管位表
- uchar TempData[4];//顯示值緩存
- //uint sum,wendu;
- //uint tt;
- bit y;
- void delay_us(uchar us)//約2us延時(shí)函數(shù)
- {
- while(--us);
- }
- void delay(uchar z)//約1ms延時(shí)函數(shù)
- {
- while(z--)
- {
- delay_us(245);
- delay_us(245);
- }
- }
- void we(uchar z) //位選
- {
- // we27=0;
- P0=z;
- we27=1;
- we27=0;
- }
- void du(uchar z) //段選
- {
- // du26=0;
- P0=z;
- du26=1;
- du26=0;
- }
- void display() //4個(gè)數(shù)碼管顯示
- {
- static uchar wei;
- du(0x00); //消隱
- we(smgwei[wei]); //送位碼
- du(TempData[wei]);//送段碼
- wei++;
- wei%=4;
- }
- //讀一個(gè)字節(jié)
- uchar read_byte()
- {
- uchar i,dat;
- for(i=0;i<8;i++)
- {
- DS=0;
- dat>>=1;
- DS=1;
- if(DS)
- dat|=0x80;
- delay_us(25);
- }
- return (dat);
- }
- //寫一個(gè)字節(jié)
- void write_byte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DS=0;
- DS=dat&0x01;
- delay_us(25);//延時(shí)
- DS=1;//釋放總線準(zhǔn)備下一次數(shù)據(jù)的寫入
- dat>>=1;
- }
- }
- //單總線初始化時(shí)序
- bit ds_init()
- {
- bit i;
- DS=1;
- delay_us(5);
- DS=0;
- delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會(huì)被全部復(fù)位
- delay_us(200);
- DS=1;//釋放總線
- delay_us(50);//延時(shí)37.95us,等待溫度傳感器發(fā)回存在信號(hào)
- i=DS;
- delay_us(25);//延時(shí)141.95us,讀取溫度傳感器存在的時(shí)間
- return (i);
- }
- uint ReadTemperature()
- {
- uint H,i;
- uchar L;
- ds_init();//初始化溫度傳感器
- write_byte(0xcc);//發(fā)送跳躍ROM指令
- write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
- delay(10);
- ds_init();//初始化溫度傳感器
- write_byte(0xcc);//發(fā)送跳躍ROM指令
- write_byte(0xbe);//讀取溫度傳感器暫存器的值
- L=read_byte();
- H=read_byte();
- H<<=8;
- i=L+H;
- return(i);
- }
- void Timer0Init() //2毫秒@12.000MHz
- {
- TMOD= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x30; //設(shè)置定時(shí)初值
- TH0 = 0xF8; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- EA=1;
- ET0=1;
- }
- void main()
- {
- uint temp;
- uchar TempH,TempL;
- bit negative;//負(fù)數(shù)標(biāo)志
- Timer0Init();
- while(1)
- {
- if(y==1)
- {
- y=0;
- temp=ReadTemperature();//讀取溫度
- if(temp&0x8000)
- {
- negative=1; //負(fù)號(hào)標(biāo)志
- temp=~temp; //取反加1
- temp +=1;
- }
- else negative=0; //正數(shù)
- TempH=temp>>4; //分解為整數(shù)
- TempL=temp&0x0F; //分解為小數(shù)
- TempL=TempL*6/10; //保留一位小數(shù)
- if(negative==1)
- TempData[0]=0x40;//顯示負(fù)號(hào)
- else if(TempH/100==0)//小于100
- TempData[0]=0; //百位消隱
- else
- TempData[0]=smgdu[TempH/100]; //顯示百位溫度
-
- if((TempH/100==0)&&((TempH%100)/10==0))
- TempData[1]=0; //十位消隱
- else
- TempData[1]=smgdu[(TempH%100)/10]; //顯示十位溫度
- TempData[2]=smgdu[(TempH%100)%10]|0x80;//顯示個(gè)位溫度,帶小數(shù)點(diǎn)
- TempData[3]=smgdu[TempL]; //顯示小數(shù)溫度1位
- }
- if(TempH>=60) //溫度超過60度,LED燈亮
- led1=0;
- else led1=1;
- }
- }
- void timer0int() interrupt 1 //定時(shí)器,定時(shí)2ms
- {
- static uchar num;
- TL0 = 0x30; //設(shè)置定時(shí)初值
- TH0 = 0xF8; //設(shè)置定時(shí)初值
- display();
- num++;
- if(num>=250) //延時(shí)500ms顯示溫度數(shù)值
- {
- num=0;
- y=1;
- }
- }
復(fù)制代碼
|
|