DS18B20在STM8S208MB中的应用 - 图文(3)

2019-02-15 15:52

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;


DS18B20在STM8S208MB中的应用 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018年小学语文春季学期期末检测模拟试卷(五年级)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: