main.c
#include <stc15f2k60s2.h>
#include <intrins.h>
#include "onewire.h"
void xianshi();
void Timer0Init();
unsigned char display[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int wendu;
extern unsigned int temp;
void main()
{
Timer0Init();EA=1;ET0=1;
P2=0XA0;P0=0X00;
while(1)
{
wendu=readtemp();
xianshi();
}
}
void xianshi()
{
display[0]=shuzu[wendu%10000/1000];
display[1]=shuzu[wendu%1000/100]&0x7f;
display[2]=shuzu[wendu%100/10];
display[3]=shuzu[wendu%10/1];
display[4]=0xc6;
display[5]=0xff;
display[6]=0xff;
display[7]=0xff;
}
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void shuma() interrupt 1
{
unsigned char i;
P2=0XE0;
P0=0XFF;
P2=0X1F;
P2=0XC0;
P0=1<<i;
P2=0X1F;
P2=0XE0;
P0=display[i];
P2=0X1F;
i++;
if(i>=8)i=0;
}
onewire.c
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日 期: 2011-8-9
*/
#include "reg52.h"
unsigned int temp;
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
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;
}
unsigned int readtemp()
{
float tp;
unsigned char th,tl;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
tl=Read_DS18B20();
th=Read_DS18B20();
temp=th;
temp<<=8;
temp|=tl;
if(temp<0)
{
temp=~temp;
temp=temp-1;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
tp=temp;
temp=tp*0.0625*100+0.5;
}
return temp;
}
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
unsigned char rd_temperature(void); //; ;
unsigned int readtemp();
#endif
本文介绍了一款使用STC15F2K60S2单片机实现的嵌入式系统,通过Onewire接口连接DS18B20温度传感器,实现实时温度测量并显示。主函数中调用Timer0Init进行定时,xianshi函数负责数据的显示。同时,详细展示了单总线通信的驱动程序和DS18B20的读写操作。
3724

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



