extern void Display(unsigned char Row,unsigned char Col,unsigned char *Character); //以下是DS18B20外部文件函数声明区 extern void DS18B20IO(unsigned char x); extern void delay1(unsigned int count); extern bool DS18B20init();
extern unsigned int DS18B20Read();
extern void DS18B20Write(unsigned char data); //以下是本文件函数声明区
int MatchingRom(unsigned char com); void ReadRom();
void delay1(unsigned int count); //以下是变量定义区 int putchar( int ch); int tp,x;
unsigned int f0, f1,f2,f3;
bool flag=1,fg1=1,fg2=1,fg3,fg4,a1=1,a2=1,a3=1,a4=1; unsigned char DS18B20Rom[8]={'0','0','0','0','0','0','0','0'};
unsigned char DS18B20Rom1[8]={0x28,0xFF,0xB2,0x1E,0xB5,0x16,0x03,0x84};//传感器1的ID unsigned char DS18B20Rom2[8]={0x28,0xFF,0xD2,0xCC,0x03,0x17,0x03,0x3A};//传感器2的ID unsigned char DS18B20Rom3[8]={0x28,0x2F,0x39,0x43,0x0A,0x00,0x00,0xF9};//传感器3的ID unsigned int rom; //主函数
void main( void ) {
init(); //初始化12864显示屏
CLK_CKDIVR=0x00; //HSI(内部RC震荡器)不分频16MHz LCDwrite(0x01,0); while(1) {
while(DS18B20init()) {
LCDwrite(0x80,0);printf(\无任何器件!\
if(fg4==1)LCDwrite(0x01,0),fg4=0;//如果没有任何器件,刷新一次清除显示屏残留字符
}fg4=1;
f1=MatchingRom(1);
if(f1==65535) //如果器件检测失败,得到的值都是1,所以这里判断65535 {
if(fg1==1)LCDwrite(0x01,0),fg1=0;//检测失败刷新一次显示器 printf(\传感器检测失败!\
} else {
if(fg1==0)LCDwrite(0x01,0),fg1=1;//从检测失败到正常刷新一次显示屏 printf(\温度A:\ f1=(f1&0x07FF)>>4;
if((f1>40) && (a1==1)) //+或-40度蜂鸣器报警,a1是控制蜂鸣器开启标记,避免BEEP寄存器被重复赋值造成声音不正常。 {
BEEP_CSR=(0x20|0x23),a1=0; //蜂鸣器输出约3.2KHz信号
printf(\ //如果该传感器报警在后显示一个感叹号。 }
if((f1<40)&&(a1==0)) {
BEEP_CSR=0x00; //低于温度阈值时关闭蜂鸣器 printf(\ \ //清除感叹号 a1=1; } }
f2=MatchingRom(2); if(f2==65535) {
if(fg2==1)LCDwrite(0x01,0),fg2=0;//检测失败刷新一次显示屏 printf(\传感器检测失败!\ } else {
if(fg2==0)LCDwrite(0x01,0),fg2=1;//从检测失败到正常刷新一次显示屏 printf(\温度B:\
f2=(f2&0x07FF)>>4;
if((f2>40) && (a2==1)) //+或-40度蜂鸣器报警,a2是控制蜂鸣器开启标记,避免BEEP寄存器被重复赋值造成声音不正常。 {
BEEP_CSR=(0x20|0x23),a2=0; //蜂鸣器输出约3.2KHz信号
printf(\ //如果该传感器报警在后显示一个感叹号。 }
if((f2<40)&&(a2==0)) {
BEEP_CSR=0x00; //低于温度阈值时关闭蜂鸣器 printf(\ \ //清除感叹号 a2=1; }
}
f3=MatchingRom(3);
if(f3==65535) {
if(fg3==0)LCDwrite(0x01,0),fg3=1;//检测失败刷新一次显示屏 printf(\传感器检测失败!\ } else {
if(fg3==1)LCDwrite(0x01,0),fg3=0;//从检测失败到正常刷新一次显示屏 printf(\温度C:\
f3=(f3&0x07FF)>>4; //如果负温度值转换成正温度温判断
if(f3>40 && a3==1) //+或-40度蜂鸣器报警,a3是控制蜂鸣器开启标记,避免BEEP寄存器被重复赋值造成声音不正常。 {
BEEP_CSR=(0x20|0x23),a3=0; //蜂鸣器输出约3.2KHz信号
printf(\ //如果该传感器报警在后显示一个感叹号。 }
if((f3<40)&&(a3==0)) {
BEEP_CSR=0x00; //低于温度阈值时关闭蜂鸣器 printf(\ \ //清除感叹号 a3=1; } } } }
void ReadRom() //读ROM系列号。 {
unsigned char i=0,j=0;
DS18B20init(); //初始化DS18B20
delay(100); //延时500毫秒等待稳定
DS18B20Write(0x33); //写ROM指令,读ROM系列号。 delay(100); for(i=0;i<4;i++) {
rom=DS18B20Read();
DS18B20Rom[j++]=(unsigned char)(rom&0x00FF);//读ROM系列号。 DS18B20Rom[j++]=(unsigned char)(rom>>8);//读ROM系列号。
} }
int MatchingRom(unsigned char com) {
unsigned char r; if(!DS18B20init()) {
DS18B20init(); //初始化DS18B20
delay(100); //延时500毫秒等待稳定
DS18B20Write(0xCC); //写ROM指令(跳过ROM) DS18B20Write(0x44); //写ROM指令,启动温度转换
delay(100); //延时500毫秒等待稳定 DS18B20init(); //初始化DS18B20 delay(100);
DS18B20Write(0x55); //写ROM指令(匹配ROM) switch(com) {
case 1: for(r=0;r<8;r++)DS18B20Write(DS18B20Rom1[r]),LCDwrite(0x80,0);break; case 2: for(r=0;r<8;r++)DS18B20Write(DS18B20Rom2[r]),LCDwrite(0x90,0);break; case 3: for(r=0;r<8;r++)DS18B20Write(DS18B20Rom3[r]),LCDwrite(0x88,0);break; default: break; }
DS18B20Write(0xBE); //写ROM指令(读暂存器)
tp=DS18B20Read(); //读取DS18B20函数一次性取回所有的16个位 } return tp; }
int putchar( int ch) //printf重定向到12864显示 {
LCDwrite((unsigned char)ch,1); return ch; }
12864.c
#include \#define RS PF_ODR_ODR0 #define RW PF_ODR_ODR3 #define EN PF_ODR_ODR4 #define PSB PF_ODR_ODR5 #define LCDdat PB_ODR
void delay(unsigned int count); void init();
void LCDwrite(unsigned char dat,unsigned char type);
void Display(unsigned char Row,unsigned char Col,unsigned char *Character);
void init()//端口初始化函数 {
PI_DDR_DDR0=1; PI_CR1_C10=1; PI_CR2_C20=1;
PF_DDR_DDR0=1; PF_CR1_C10=1; PF_CR2_C20=0;
PF_DDR_DDR3=1; PF_CR1_C13=1; PF_CR2_C23=0;
PF_DDR_DDR4=1; PF_CR1_C14=1; PF_CR2_C24=0;
PF_DDR_DDR5=1; PF_CR1_C15=1; PF_CR2_C25=0; PSB=1;
PB_DDR=0xFF; PB_CR1=0xFF; PB_CR2=0x00;
LCDwrite(0x30,0);//启动基本指令集 delay(100);
LCDwrite(0x0C,0);//显示开/关光标 }
void LCDwrite(unsigned char dat,unsigned char type)//形参type为1时写数据,为0写命令 {
RS=type; RW=0;