标题1: 实验现象
标题2:代码实例
标题3:实验总结
实验现象:一开始显示室温,用手触摸温度传感器,数码管显示有变化。
代码实例:
主函数:
#include <STC15F2K60S2.H>
#include "onewire.h"
code unsigned char tab[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
unsigned char buf[8]={10,10,10,10,10,10,10,10}; //定义段选
unsigned char Proc_flag; //读取温度标志
void display();
//关闭蜂鸣器
void cls_buzz()
{
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2&=0x1f;
}
//关闭led
void cls_led()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
}
//定时器初始化+开启中断服务函数
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
//主函数
void main()
{
unsigned char tem; //温度
cls_buzz();
cls_led();
Timer0Init();
while(1)
{
if(Proc_flag)
{
Proc_flag=0;
tem=rd_temperature();
}
(tem>=10)?(buf[6]=tem/10):(buf[6]=10);
buf[7]=tem%10;
}
}
//中断服务函数
void Timer0_Proc() interrupt 1
{
static unsigned char ms;
if(++ms==50)
{
ms=0;
Proc_flag=1;
}
display();
}
//数码管显示
void display()
{
static unsigned char com;
//消影
P2=(P2&0x1f)|0xe0;
P0=0xff;
P2&=0x1f;
//位选
P2=(P2&0x1f)|0xc0;
P0=(1<<com);
P2&=0x1f;
//段选
P2=(P2&0x1f)|0xe0;
P0=tab[buf[com]];
P2&=0x1f;
//刷新
if(++com==8)
com=0;
}
onewire.c:
#include "reg52.h"
sbit DQ = P1^4;
单总线延时函数
void Delay_OneWire(unsigned int t)
{
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); // 延时大于480us
DQ = 1;
Delay_OneWire(10); // 14
initflag = DQ; // initflag等于1初始化失败
Delay_OneWire(5);
return initflag;
}
//DS18B20温度采集程序:整数
unsigned char rd_temperature(void)
{
unsigned char 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(); //高字节
temp = high<<4; //只取了整数部分和符号位
temp |= (low>>4);
return temp;
}
onewire.h:
#ifndef _ONEWIRE_H
#define _ONEWIRE_H
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe
//گ˽ʹķ
unsigned char rd_temperature(void);
#endif
实验总结:
对于外界传入内部定时扫描接受基本形成一种基本代码框架,灵活使用flag、定时器以及语句组成的代码块,可以快速实现信号接收发。