無標題.jpg (258.47 KB, 下載次數: 39)
下載附件
2020-1-3 15:24 上傳
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit DS =P3^7;
- sbit moto=P1^0;
- u8 num=0;
- u8 DisplayData[8];
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- bit flag=0;
- void delay_us(uchar us)//約2us延時函數
- {
- while(--us);
- }
- void delay(uchar z)//約1ms延時函數
- {
- while(z--)
- {
- delay_us(245);
- delay_us(245);
- }
- }
- //讀一個字節
- 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);
- }
- //寫一個字節
- void write_byte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DS=0;
- DS=dat&0x01;
- delay_us(25);//延時
- DS=1;//釋放總線準備下一次數據的寫入
- dat>>=1;
- }
- }
- //單總線初始化時序
- bit ds_init()
- {
- bit i;
- DS=1;
- delay_us(5);
- DS=0;
- delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會被全部復位
- delay_us(200);
- DS=1;//釋放總線
- delay_us(50);//延時37.95us,等待溫度傳感器發回存在信號
- i=DS;
- delay_us(25);//延時141.95us,讀取溫度傳感器存在的時間
- return (i);
- }
- uint ReadTemperature()
- {
- uint H,i;
- uchar L;
- ds_init();//初始化溫度傳感器
- write_byte(0xcc);//發送跳躍ROM指令
- write_byte(0x44);//發送溫度轉換指令
- delay(10);
- ds_init();//初始化溫度傳感器
- write_byte(0xcc);//發送跳躍ROM指令
- write_byte(0xbe);//讀取溫度傳感器暫存器的值
- L=read_byte();
- H=read_byte();
- H<<=8;
- i=L+H;
- return(i);
- }
- /*******************************************************************************
- * 函數名 :DigDisplay()
- * 函數功能 :數碼管顯示函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void DigDisplay()
- {
- static u8 i;
- P0=0x00;//消隱
- switch(i) //位選,選擇點亮的數碼管,
- {
- case(0):
- LSA=1;LSB=1;LSC=1; break;//顯示第0位
- case(1):
- LSA=0;LSB=1;LSC=1; break;//顯示第1位
- case(2):
- LSA=1;LSB=0;LSC=1; break;//顯示第2位
- case(3):
- LSA=0;LSB=0;LSC=1; break;//顯示第3位
- case(4):
- LSA=1;LSB=1;LSC=0; break;//顯示第4位
- /* case(5):
- LSA=0;LSB=1;LSC=0; break;//顯示第5位
- */
- }
- P0=DisplayData[i];//發送數據
- i++;
- i%=5;
- // delay(100); //間隔一段時間掃描
- }
- void Timer0Init() //2毫秒@12.000MHz
- {
- TMOD= 0x01; //設置定時器模式
- TL0 = 0x30; //設置定時初值
- TH0 = 0xF8; //設置定時初值
- TR0 = 1; //定時器0開始計時
- EA=1;
- ET0=1;
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- bit negative; //負數標志
- u8 TempH,TempL;
- u16 temp;
- Timer0Init();
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- temp=ReadTemperature();//讀取溫度
- if(temp&0x8000)
- {
- negative=1; //負號標志
- temp=~temp; //取反加1
- temp +=1;
- }
- else negative=0; //正數
- TempH=temp>>4; //分解為整數
- TempL=temp&0x0F; //分解為小數
- TempL=(TempL*6+5)/10;//四舍五入保留一位小數
- if(negative==1)
- DisplayData[0]=0x40;//顯示負號
- else if(TempH/100==0)//小于100
- DisplayData[0]=0; //百位消隱
- else
- DisplayData[0]=smgduan[TempH/100]; //顯示百位溫度
-
- if((TempH/100==0)&&((TempH%100)/10==0))
- DisplayData[1]=0; //十位消隱
- else
- DisplayData[1]=smgduan[(TempH%100)/10]; //顯示十位溫度
- DisplayData[2]=smgduan[(TempH%100)%10]|0x80;//顯示個位溫度,帶小數點
- DisplayData[3]=smgduan[TempL]; //顯示小數溫度1位
- DisplayData[4]=0x39;
- }
- if(TempH>23)
- moto=1;
- else moto=0;
- }
- }
- void timer0int() interrupt 1 //定時器,定時2ms
- {
- static uchar num;
- TL0 = 0x30; //設置定時初值
- TH0 = 0xF8; //設置定時初值
- DigDisplay();
- num++;
- if(num>=250) //延時500ms顯示溫度數值
- {
- num=0;
- flag=1;
- }
- }
復制代碼
|