当前位置:首页 > CC2530控18B20,C++程序
18B20测温度C++程序
#include
uchar Error[]={\说明没有检测到DS18B20 uchar Temp3[]={\说明显示的是温度 #define DQ P2_3;
uchar time; //设置全局变量,专门用于严格延时 void mainreadtemp(void); uchar Init_DS18B20(void); uchar ReadOneChar(void);
uchar WriteOneChar(uchar dat); void display_error(void);
uchar Init_DS18B20(void) {
P2SEL=0xF0; P2DIR=0xFF ; uchar flag; P2_3=1;
delay_us(6); //略微延时约6 微秒 P2_3=0;
delay_us(600); //略微延时约600 微秒
//以向DS18B20 发出一持续480~960us 的低电平复位脉冲 P2_3=1; //释放数据线(将数据线拉高)
delay_us(30);//延时约30us(释放总线后需等待15~60us 让DS18B20 输出存在脉冲) flag=P2_3; //让单片机检测是否输出了存在脉冲(DQ=0 表示存在) delay_us(800);//延时足够长时间,等待存在脉冲输出完毕 return (flag); //返回检测成功标志1 }
uchar ReadOneChar(void) {
P2DIR=0xFF ; uchar i=0;
uchar dat=0; //储存读出的一个字节数据
for (i=0;i<8;i++) {
P2_3 =1; // 先将数据线拉高 //delay_us(1);
//asm(\等待一个机器周期
P2_3 = 0; //单片机从DS18B20 读书据时,将数据线从高拉低即启动读时序 dat>>=1;
//delay_us(3);
asm(\等待一个机器周期
P2_3 = 1; //将数据线\人为\拉高,为单片机检测DS18B20 的输出电平作准备 delay_us(6); //延时约6us,使主机在15us 内采样 if(P2_3==1)
dat|=0x80; //如果读到的数据是1,则将1 存入dat else
dat|=0x00;//如果读到的数据是0,则将0 存入dat
delay_us(3); //延时3us,两个读时序之间必须有大于1us 的恢复期 }
return(dat); //返回读出的十进制数据 }
uchar WriteOneChar(uchar dat) {
P2DIR=0xFF ; uchar i=0;
for (i=0; i<8; i++) {
P2_3 = 1; // 先将数据线拉高 asm(\等待一个机器周期 asm(\
P2_3= 0; //将数据线从高拉低时即启动写时序
P2_3= dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20 采样
delay_us(30);//延时约30us,DS18B20 在拉低后的约15~60us 期间从数据线上采样 P2_3=1; //释放数据线
delay_us(3);//延时3us,两个写时序间至少需要1us 的恢复期 dat>>=1; //将dat 中的各二进制位数据右移1位 }
delay_ms(1); //延时1ms 给硬件一点反应时间 return 0;//返回 }
/*******
void display_temp1(unsigned char x) {
uchar temp[6]={0,0,0,0,0}; temp[0]=x/100+'0'; temp[1]=x0/10+48;
temp[2]=x0+'0'; temp[3]='.';
//temp[4]=(10*x)0/10+'0'; temp[5]='\\0'; asm (\ uchar *pstr=temp;
Print8(2,1,\
Print8(2,2,pstr);//将百位数字的字符常量写入LCD Print8(3,2,pstr); //将十位数字的字符常量写入LCD Print8(4,2,pstr);//将个位数字的字符常量写入LCD delay_ms(1); //延时1ms 给硬件一点反应时间 }
**********/
//函数功能:显示温度的小数数部分入口参数:x
void ReadyReadTemp(void) {
P2DIR=0xFF ;
Init_DS18B20(); //将DS18B20 初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换
delay_ms(100);
Init_DS18B20(); //将DS18B20 初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 delay_ms(100); }
void DisplayConvert(unsigned int Data) {
xxaa[0]=Data/10000+48; Data%=10000;
xxaa[1]=Data/1000+'0';//'0'等同48 Data%=1000;
xxaa[2]=Data/100+48; Data%=100; xxaa[3]='.';
xxaa[4]=Data/10+48; Data%=10;
xxaa[5]=Data+48;
xxaa[6]=0; }
void main(void) {
unsigned int mmm; unsigned int kkk; P0DIR = 0XFF; P1DIR = 0x13; P2DIR=0xFF ; ResetLCD(); initLCDM();
delay_ms(5); //延时5ms 给硬件一点反应时间 ClearRAM();
if(Init_DS18B20)
Print8(0,3,\ Print8(0,4,\
for(;;) //不断检测并显示温度, 等同while(1) {
ReadyReadTemp(); //读温度准备
kkk=ReadOneChar(); //先读的是温度值低位
kkk+=ReadOneChar()<<8; //接着读的是温度值高位 mmm=kkk*6.25;
DisplayConvert(mmm); Print8(0,1,temperature(C)); Print8(0,3,\ Print8(16,3,xxaa); P2_3=1;
delay_ms(10); } }
/*******************************************************
void main() { uchar temp[6]={0,0,0,0,0}; uchar a,b=0; uchar c=0; a=0x0A; b=0x0e; c=a+b;
共分享92篇相关文档