|
程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
sbit din=P1^0; //MAX7219數(shù)據(jù)串行輸入端
sbit cs=P1^1; //MAX7219數(shù)據(jù)輸入允許端
sbit clk=P1^2; //MAX7219時(shí)鐘信號
sbit DQ=P1^5; //DS18B20端口DQ
uchar dig;
sbit DIN = P0^7; //小數(shù)點(diǎn)
bit list_flag=0; //顯示開關(guān)標(biāo)志
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};
void Delay(unit ms) //延時(shí)函數(shù)
{
while(ms--);
}
uchar Init_DS18B20(void) //初始化DS18B20
{
uchar status;
DQ = 1; //DQ復(fù)位
Delay(8); //延時(shí)片刻
DQ = 0; //單片機(jī)將DQ拉低
Delay(90); //精確延時(shí) 大于 480us
DQ = 1; //拉高總線
Delay(8);
status=DQ; //如果為0,則初始化成功;如果為1,則初始化失敗
Delay(100);
DQ = 1;
return(status);
}
uchar ReadOneByte(void) //讀一個(gè)字節(jié)
{
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) //寫一個(gè)字節(jié)
{
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); //啟動(dòng)溫度轉(zhuǎn)換
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]]; //查表得小數(shù)位的值
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;
if(ng==1) //溫度為零度以下時(shí)
{
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為接受MAX7219地址:data為要寫的數(shù)據(jù)
{
uchar i;
cs=0;
for(i=0;i<8;i++)
{
clk=0;
din=add&0x80; //按照高位在前,低位在后的順序發(fā)送
add<<=1; //先發(fā)送地址
clk=1;
}
for(i=0;i<8;i++) //時(shí)鐘上升沿寫入一位
{
clk=0;
din=date&0x80;
date<<=1; //再發(fā)送數(shù)據(jù)
clk=1;
}
cs=1;
}
void int_7219()
{
write_7219(0x0c,0x01); //0x0c 為關(guān)斷模式寄存器;0x01 表示顯示器處于工作狀態(tài)
write_7219(0x0a,0x0f); //0x0a 為亮度調(diào)節(jié)寄存器;0x0f 使數(shù)碼管顯示亮度為最亮
write_7219(0x09,0x00); //oxo9 為譯碼模式選擇寄存器;0x00為非譯碼方式
write_7219(0x0b,0x07); //0x0b 為掃描限制寄存器;0x07 表示可將8個(gè)LED數(shù)碼管
}
void disp_Max7219(uchar dig,uchar date) //指定位,顯示某一數(shù)
{
write_7219(dig,date);
}
void main()
{
init_7219();
while(1)
{
Temperature_trans();
Read_Temperature();
if(list_flag==0)
{
disp_Max7219(1,tab[display[5]]);
disp_Max7219(2,tab[display[3]]);
disp_Max7219(3,tab[display[2]]);
disp_Max7219(4,tab[display[1]]|0x80); //|0x80為帶上小數(shù)點(diǎn)
disp_Max7219(5,tab[display[0]]);
disp_Max7219(7,tab[11]);
disp_Max7219(8,tab[10]);
}
}
}
|
|