单片机DS18B20温度计MAX7219驱动数码管
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
sbit DIN=P0^1; //"MAX7219显示串行数据输入端"
sbit LOAD=P0^2; //"MAX7219显示数据锁存端"
sbit CLK=P0^3; //"MAX7219显示时钟输入端"
sbit DQ=P0^0; //"DS18B20数字信号输入、输出"
#define DecodeMode 0x09 //"译码模式"
#define Intensity 0x0a //"亮度"
#define ScanLimit 0x0b //"扫描界限"
#define ShutDown 0x0c //"掉电模式"
#define DisplayTest 0x0f //"显示测试"
uchar yes;
uchar data temp_data[2]={0x00,0x00}; //"存放温度高8位和低8位" uchar data disp_buf[5]={0x00,0x00,0x00,0x00,0x00};
uchar code bit_tab[]={0x01,0x02,0x03,0x04};
uchar code seg_data[]={0x7E,0x30,0x6D,0x79,0x33,
0x5B,0x5F,0x70,0x7F,0x7B}; //"0,1,2,3,4,5,6,7,8,9" void delay (uint a) //" 毫秒延时函数"
{
// uint i;
while( --a != 0)
{
// for(i = 0; i < 110; i++);
}
}
void write_max7219_byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(temp&0x80);
temp<<=1;
CLK=1;
}
}
void write_max7219(uchar address,uint dat)
{
LOAD=0;
write_max7219_byte(address);
write_max7219_byte(dat);
LOAD=1;
}
void Init_max7219 (void)
{
write_max7219(ScanLimit,0x07); //*"设置扫描界限"*/
write_max7219(DecodeMode,0xff); //*"设置译码模式"*/ write_max7219(Intensity,0x04); //*"设置亮度"*/
write_max7219(ShutDown,0x01); //*"设置电源工作模式"*/ write_max7219(DisplayTest,0x01);
delay(5);
write_max7219(DisplayTest,0x00);
}
void write_ds18b20_byte(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
Read_ds18b20_byte()
{
uchar i=0;
uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
Init_DS18B20() //"DS18B20初始化"
{
DQ=1;
delay(8);
DQ=0;
delay(90);
DQ=1;
delay(8);
yes=DQ; //"如果yes=0,初始化正常;yes=1则初始化失败"
delay(100);
DQ=1;
return(yes);
}
void display()
{
write_max7219(bit_tab[0],disp_buf[3]);
write_max7219(bit_tab[1],disp_buf[2]);
write_max7219(bit_tab[2],(disp_buf[1])|0x80);
write_max7219(bit_tab[3],disp_buf[0]);
}
void GetTemperture() //"读取温度值"
{
uchar i;
Init_DS18B20();
if(yes==0)
{
write_ds18b20_byte(0xcc); //"跳过读序号列号的操作"
write_ds18b20_byte(0x44); //"启动温度转换"
for(i=0;i<250;i++)
Init_DS18B20();
write_ds18b20_byte(0xcc); //"跳过读序号列号的操作"
write_ds18b20_byte(0xbe); //"读取温度寄存器"
temp_data[0]=Read_ds18b20_byte(); //"温度低8位"
temp_data[1]=Read_ds18b20_byte(); //"温度高8位"
}
}
void tempconv()
{
uchar temp;
temp=temp_data[0]&0x0f; //"取出低4位的小数"
disp_buf[0]=(temp*10/16); //"求出小数位的值"
temp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //"高4位与低4位组合成1个字节整"
disp_buf[3]=temp/100; //"分离出整数部分的百位"
temp=temp%100;
disp_buf[2]=temp/10; //"分离出整数部分的十位"
disp_buf[1]=temp%10; //"各位部分"
if(!disp_buf[3]) //"若百位为0.则不显示百位,seg_data[]"