使用DS18B20測溫度,8個LED數碼管顯示,前兩個數碼管顯示當前溫度,,后兩個數碼管顯示設定溫度
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (14.59 KB, 下載次數: 45)
下載附件
2017-11-19 06:06 上傳
0.png (15.78 KB, 下載次數: 38)
下載附件
2017-11-19 06:06 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit din=P1^0; //MAX7219數據串行輸入端
- sbit cs=P1^1; //MAX7219數據輸入允許端
- sbit clk=P1^2; //MAX7219時鐘信號
- sbit DQ=P1^5; //DS18B20端口DQ
- sbit sb=P0^0;
- sbit sq=P0^1;
- sbit led=P2^0;
- uchar dig;
- sbit DIN=P0^7; //小數點
- bit list_flag=0; //顯示開關標志
- uchar code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,
- 0x70,0x7f,0x7b,0x4E,0x63,0x01,0x00}; //表示不譯方式0~9;0x4E為C;0x63為.;0x01為—;0x00不顯示
- uchar data temp_data[2]={0x00,0x00};
- unsigned char data display[]={0x00,0x00,0x00,0x00,0x00,0x00};
- unsigned char code ditab[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
- unsigned char x=56;
- void Delay(uint ms) //延時函數
- {
- while(ms--);
- }
- uchar Init_DS18B20(void) //初始化DS18B20
- {
- uchar status;
- DQ=1; //DQ復位
- Delay(8); //延時片刻
- DQ=0; //單片機將DQ拉低
- Delay(90); //精確延時,大于480us
- DQ=1; //拉低總線
- Delay(8);
- status=DQ; //如果為0,則初始化成功;為1,則初始化失敗
- Delay(100);
- DQ=1;
- return(status);
- }
- uchar ReadOneByte(void) //讀一個字節
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0; //給脈沖信號
- dat>>= 1;
- DQ=1; //給脈沖信號
- _nop_();
- _nop_();
- if(DQ)
- {
- dat|=0x80;
- }
- Delay(4);
- DQ=1;
- }
- return(dat);
- }
- void WriteOneByte(uchar dat) //寫一個字節
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- Delay(5);
- DQ=1;
- dat>>=1;
- }
- }
- void Read_Temperature(void) //讀取溫度
- {
- if(Init_DS18B20()==1)
- {
- list_flag=1; //DS18B20不正常
- }
- else
- {
- list_flag=0;
- WriteOneByte(0xCC); //跳過讀序號列號的操作
- WriteOneByte(0x44); //啟動溫度轉換
- Init_DS18B20();
- WriteOneByte(0xCC); //跳過讀序號列號的操作
- WriteOneByte(0xBE); //讀取溫度寄存器
- temp_data[0]=ReadOneByte(); //溫度低8位
- temp_data[1]=ReadOneByte(); //溫度高8位
- }
- }
- void Temperature_trans() //溫度處理
- {
- uchar ng=0;
- if((temp_data[1]&0xF8)==0xF8)
- {
- temp_data[1]=~temp_data[1];
- temp_data[0]=~temp_data[0]+1;
- if( temp_data[0]==0x00)
- {
- temp_data[1]++;
- }
- ng=1;
- }
- display[4]=temp_data[0]&0x0f;
- display[0]=ditab[display[4]]; //查表得小數位的值
- display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
- display[3]=display[4]/100;
- display[1]=display[4]%100;
- display[2]=display[1]/10;
- display[1]=display[1]%10;
- display[4]=temp_data[0]&0x0f;
- if(ng==1) //溫度為0度以下時
- {
- display[5]=12; //顯示-
- }
- else
- {
- display[5]=13; //不顯示-
- }
- if(!display[3]) //高位為0,不顯示
- {
- display[3]=13;
- if(!display[2]) //次高位為0,不顯示
- display[2]=13;
- }
- }
- void write_7219(uchar add,uchar date) //add為接受MA7219;date為要寫的數據
- {
- uchar i;
- cs=0;
- for(i=0;i<8;i++)
- {
- clk=0;
- din=add&0x80; //按照高位在前,低位在后的順序發送
- add<<=1; //先發送地址
- clk=1;
- }
- for (i=0;i<8;i++) //時鐘上升沿寫入一位
- {
- clk=0;
- din=date&0x80;
- date<<=1; //再發送數據
- clk=1;
- }
- cs=1;
- }
- void init_7219()
- {
- write_7219(0x0c,0x01); //0x0c為關斷模式寄存器;0x01表示顯示器處于工作狀態
- write_7219(0x0a,0x0f); //0x0a為亮度調節寄存器;0x0f表示使數碼管顯示亮度為最亮
- write_7219(0x09,0x00); //0x09為譯碼模式選擇寄存器;0x00表示非譯碼方式
- write_7219(0x0b,0x07); //0x0b為掃描限制寄存器;0x07表示8個LED數碼管
- }
- void disp_Max7219(uchar dig, uchar date) //指定位,顯示某一數
- {
- write_7219(dig,date);
- }
- void main()
- { EA=1;ET0=1;
- TMOD=0X01;
- TH0=0X3C;
- TL0=0XB0;
- TR0=1;
- init_7219();
- while(1)
- {
- Temperature_trans();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
溫度.zip
(108.47 KB, 下載次數: 84)
2017-11-18 13:28 上傳
點擊文件名下載附件
DS18B20 下載積分: 黑幣 -5
|