main.c
#include "reg52.h"
#include "onewire.h"
#define uchar unsigned char
#define uint unsigned int
sfr AUXR = 0x8E;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xbf};
/*共阳*/
uchar code weitab[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar disPalyBuy[] = {0,1,2,3,4,5,6,7};
uint dspcom = 0;//段码
uint Timer1_flag = 0;
void display(void);
void Timer1Init(void);
void main()
{
int wendu_num = 0;
Timer1Init();
ET1 = 1;
EA = 1;
while(1)
{
wendu_num = wendu()*100;
disPalyBuy[3] = wendu_num/10000;
disPalyBuy[4] = wendu_num%10000/1000;
disPalyBuy[5] = wendu_num%1000/100 + 10;
disPalyBuy[6] = wendu_num%100/10;
disPalyBuy[7] = wendu_num%10;
// display();
}
}
void display(void)
{
P0 = 0xff;
P2 = ((P2&0x1f)|0xE0);
P2 &= 0x1f;
P0 = weitab[dspcom];
P2 = (P2&0x1f)|0xc0;
P2 = P2&0x1f;
P0 = tab[disPalyBuy[dspcom]];
P2 = (P2&0x1f)|0xe0;
P2 = P2&0x1f;
if(++dspcom==8)
{
dspcom = 0;
}
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x91; //设置定时初值
TH1 = 0xFF; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
void Timer1(void) interrupt 3
{
if(Timer1_flag>20)
{
display();
Timer1_flag = 0;
}
Timer1_flag++;
}
onewire.c
#include "reg52.h"
sbit DQ = P1^4; //单总线接口
#define uchar unsigned char
#define uint unsigned int
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC //12Mhz
{
unsigned char i;
while(t--)
{
for(i = 0;i<12;i++);
}
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
int wendu(void)
{
uchar low,high;
char temp;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44); //启动温度转换
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE); //读取寄存器
low = Read_DS18B20(); //低字节
high = Read_DS18B20(); //高字节
/** 精度为1摄氏度 */
temp = high<<4;
temp |= (low>>4);
return temp;
}
本文详细介绍了如何在蓝桥杯竞赛中使用单片机自写DS18B20温度测量模块,涵盖了main.c和onewire.c两个关键文件的实现过程,为参赛者提供了实用的技术指导。
2347

被折叠的 条评论
为什么被折叠?



