高级会员
- 积分
- 782
- 威望
- 427
- 贡献
- 261
- 兑换币
- 228
- 注册时间
- 2012-10-29
- 在线时间
- 47 小时
- 毕业学校
- 浙江万里学院
|
本人初学飞思卡尔MC9S12XS128芯片,用DS18B20温度传感器用液晶显示温度的程序为啥显示不出正确的温度啊?求大神指教!!!
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define uchar unsigned char
#define uint unsigned int
#define LCD_RS PORTK_PK0
#define LCD_RW PORTK_PK1
#define LCD_EN PORTK_PK2
#define LCD_PSB PORTK_PK3
#define ds PORTA_PA2
uchar a[6]={"室温:"};
uchar b[]="0123456789";
uint temp;
float f_temp;
void delayus(uint xus) //延时
{
unsigned int i;
for(i=xus;i>0;i--);
}
void delay(uint xms) //延时
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_cmd(uchar z) //写地址
{
LCD_RS=0;
LCD_RW=0;
delay(5);
PORTB=z;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
void write_dat(uchar s) //写数据
{
LCD_RS=1;
LCD_RW=0;
delay(5);
PORTB=s;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶初始化
void chushi(void)
{
LCD_PSB=1;
write_cmd(0x30);
delay(5);
write_cmd(0x0c);
delay(5);
write_cmd(0x01);
delay(5);
}
uint dsreset(void) // ds18b20复位,初始化函数
{
uint i;
DDRA_DDRA2=1;
ds=1;
delayus(1);
ds=0;
delayus(650);
ds=1;
delayus(30);
DDRA_DDRA2=0; //定义A2为输入
delayus(30);
i=ds;
DDRA_DDRA2=1;
delayus(600);
ds=1;
return i;
}
uchar tempread(void)//读一个字节数据函数
{
uint i;
uchar dat;
for(i=0;i<8;i++)
{ ds=1;
delayus(1);
ds=0;
delayus(2);
ds=1;
dat>>=1;
DDRA_DDRA2=0;
if(ds)
dat|=0x80;
delayus(30);
DDRA_DDRA2=1;
ds= 1;
delayus(8);
}
return(dat);
}
void tempwritebyte(uchar dat) //向传感器写一个字节函数
{
uchar j;
ds=1;
for(j=1;j<=8;j++)
{ ds=0;
ds=dat&0x01;
delayus(45);
ds=1;
dat=dat>>1;
}
ds=1;
}
void tempchange(void) //开始获取温度并转换
{
dsreset();
//delay(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
uint get_temp() //读取温度
{
uint a,b;
dsreset();
//delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
//f_temp=f_temp+0.05;
return temp; //temp是整型
}
void dis_temp(uint t) //数据显示程序
{
uint bai,shi,ge;
write_cmd(0x90);
delay(50);
bai=t/100%10;
write_dat(b[bai]);
shi=t%100/10;
write_dat(b[shi]);
ge=t%10;
write_dat(b[ge]);
}
void main(void) {
uchar i;
DDRB=0xff;
DDRK=0xff;
chushi();
for(;;)
{
tempchange();
dis_temp(get_temp());
write_cmd(0x80);
for(i=0;i<5;i++)
{
write_dat(a[i]);
delay(10);
}
}
}
|
|