叶伤 发表于 2013-8-2 07:44
6348=18CCH=0001 1000 1100 1100,怎么看都不像最高位判断,你到底是怎么读出来的,前面对数据进行了什么变 ...
网上好多这种程序,这个6348就是出自这些程序
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define Disdata P0 // 段码入口
sbit DQ=P3^7; // 温度输入口
uint temp; // variable of temperature 定义一个变量
uchar flag1; // 定义一个标志,标志温度是负还是正,1为负,0为正
sbit DIN=P0^7; // 小数点控制
#define discan P2 // 数码管位选扫描
uchar h; // 定义变量
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳数码管段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "灭" "-"
uchar data temp_data[2]={0x00,0x00};//读出温度暂放
uchar data Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数部分对应十进制 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字
/*******************************************************************
*函数名称:void delay(uint i) *
*函数功能:延时子程序 *
*形式参数:i *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
void delay(uint i) //delay
{
while(i--);
}
/*******************************************************************
*函数名称:void Init_DS18B20(void) *
*函数功能:初始化函数 *
*形式参数:无 *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
//初始化函数
void Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
/*******************************************************************
*函数名称:uchar ReadOneChar(void) *
*函数功能:读一个字节 *
*形式参数:无 *
*返回参数:dat *
*使用说明:无 *
*******************************************************************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ) dat|=0x80;
delay(4);
}
return(dat);
}
/*******************************************************************
*函数名称:void WriteOneChar(uchar dat) *
*函数功能:写一个字节 *
*形式参数:dat *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
/*******************************************************************
*函数名称:void tmpchange(void) *
*函数功能:发送温度转换命令 *
*形式参数:无 *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
void tmpchange(void) // DS18B20 begin change
{
Init_DS18B20(); // 初始化DS18B20
delay(200); // 延时
WriteOneChar(0xcc); // 跳过序列号命令
WriteOneChar(0x44); // 发送温度转换命令
}
/*******************************************************************
*函数名称:uint tmp() *
*函数功能:读出温度函数 *
*形式参数:无 *
*返回参数:temp *
*使用说明:无 *
*******************************************************************/
uint tmp() //get the temperature
{
// float tt;
Init_DS18B20(); // 初始化ds18b2子函数
delay(1);
WriteOneChar(0xcc); // 跳过ROM命令
WriteOneChar(0xbe); // 发送读取数据命令
temp_data[0]=ReadOneChar(); // 连续读两个字节数据
temp_data[1]=ReadOneChar();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
// tt=temp*0.0625; // 得到真实十进制温度值,因为DS18B20
// 可以精确到0.0625度,所以读回数据的最低位代表的是
// 0.0625度。
// temp=tt*10+0.5; // 放大十倍,这样做的目的将小数点后第一位
// 也转换为可显示数字,同时进行一个四舍五入操作。
return temp; // 返回温度值
}
/*******************************************************************
*函数名称:void tem_deal(uint tem) *
*函数功能: 温度数据显示处理函数 *
*形式参数:无 *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
void tem_deal(uint tem)
{
/*************温度数据处理*****************/
if(tem>6348) // 温度值正负判断
{
tem=65536-tem;
flag1=1;
} // 负温度求补码,标志位置1
Dis_play[4]=tem&0x0f; // 取小数部分的值
Dis_play[0]=ditab[Dis_play[4]]; // 存入小数部分显示值
Dis_play[4]=tem>>4; // 取中间八位,即整数部分的值
Dis_play[3]=Dis_play[4]/100; // 取百位数据暂存
Dis_play[1]=Dis_play[4]%100; // 取后两位数据暂存
Dis_play[2]=Dis_play[1]/10; // 取十位数据暂存
Dis_play[1]=Dis_play[1]%10; // 取个位数据暂存
if(!Dis_play[3]) // 最高位为0都不显示
{
Dis_play[3]=0x0a; // 先判断百位是否为0
if(!Dis_play[2])
{
Dis_play[2]=0x0a; // 再判断十位是否为0
}
}
if(flag1)
{
Dis_play[3]=0x0b; // 为负数时,最高位显示 "-"
}
}
/*******************************************************************
*函数名称: void display() *
*函数功能: 温度数据显示 *
*形式参数:无 *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
void display()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
Disdata=table[Dis_play[k]]; //数据显示
if (k==1)
DIN=0; //小数点显示
else
DIN=1;
discan=scan_con[3-k]; //位选
delay(90); //延时
discan=0xf;
}
}
/*******************************************************************
*函数名称:void main (void) *
*函数功能:主函数 *
*形式参数:无 *
*返回参数:无 *
*使用说明:无 *
*******************************************************************/
void main(void)
{
Disdata=0xff; //端口初始化
P2=0xff;
do
{
tmpchange(); //温度转换
tem_deal(tmp()); //显示温度值
//display();
// display();
display();
}
while(1);
} |