单片机DS18B20温度计MAX7219驱动数码管

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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[]"

相关文档
最新文档