高人看看,单片机C程序,温度值读不进去怎么回事?
#include<reg51.h>
#include<absacc.h>
#define SEND_INIT XBYTE[0xf400]
#define SEND_DATA XBYTE[0xf500]
#define READ_BUSY XBYTE[0xf600] //
#define READ_DATA XBYTE[0xfF00] //读点地址
#define COM8155 XBYTE[0x8000]
#define PB XBYTE[0X8002]
#define PC XBYTE[0X8003]
#define DQ PA5
#define uchar unsigned char
#define uint unsigned int
#define comm 0//定义传送指令代码为0
#define dat 1
bit busy;
sbit DQ=P1^0; //ds18b20与单片机连接口
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2; //定义LCD忙标志位
void first();// 初始化
void wr_lcd (uchar dat_comm,uchar content); //写控制字与数据
void wr_str(unsigned char addr,unsigned char counts,const unsigned char *ps);//写字符串
void chk_busy (void);
void delay (uint us);
void init_lcd();
void clrram(void);
void loose();
void dshi();
void dge();
void Write_hms(uint add,uchar date) ;
uchar data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
uchar yu=0;
uint a=5,b;
uchar shi=0,ge=0,ai;//定义变量
uchar code TAB1A[]={"题目:时钟显示"};
uchar code TAB1B[]={"时间: 00: 00: 00"};
uchar code TAB1C[]={"摄氏温度: 0000"};
uchar code TAB1D[]={"华氏温度:00"};
//uchar code disdata[]={0,1,2,3};
uchar miao,fen,shi;
/******************************************************************************************
* 函数名称 :init_lcd
* 功能描述 :初始化LCD
******************************************************************************************/
void init_lcd()
{ wr_lcd(comm,0x30);//0011 0000 扩充功能设定——8位数据 基本指令操作
wr_lcd(comm,0x34); //扩展指令操作
wr_lcd(comm,0x01);//0000 0001 清屏——将DDRAM填满"20H",并且设定DDRAM的地址计数器为"00H"
wr_lcd(comm,0x06);//0000 0110 进入点设定——指定在数据的读取与写入时,设定游标的移动方向
wr_lcd(comm,0x0c);//0000 1100 游标或显示移位控制——开显 //开显示,关光标,不闪烁
}
/******************************************************************************************
* 函数名称 :clrram
* 功能描述 :将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
******************************************************************************************/
void clrram(void)
{
wr_lcd(comm,0x30);
delay(10);
wr_lcd(comm,0x01);
delay(10);
}
/*********写字符串**************************************/
void wr_str(unsigned char addr,unsigned char counts,const unsigned char *ps)
{
int i;
wr_lcd(comm,addr);
delay(1);
for(i=counts;i>0;i--) //循环counts次
{
wr_lcd(dat,*ps); //查表取数并调用显示一个字节数据函数送显示
delay(1); //延长一定时间,确保能看到数据一个个的显示出来
ps++; //取下一个数据
}
}
/******************************************************************************************
* 函数名称 :wr_lcd
* 功能描述 :当dat_comm=0时,写入指令,dat_comm=1时,写入数据
******************************************************************************************/
void wr_lcd(uchar dat_comm,uchar content)
{
chk_busy ();
if(dat_comm)
SEND_DATA=content; //写数据
else
SEND_INIT=content; //写指令
}
/******************************************************************************************
* 函数名称 :chk_busy
* 功能描述 :检测LCD忙信号
******************************************************************************************/
void chk_busy(void)
{ uchar temp;
busy=1; //先置位繁忙标志
READ_BUSY=0xFF;
while(busy)
{
temp=READ_BUSY;
if (temp&0x80==1)
busy=1;
else
{
busy=0;
break;
}
}
}
/******************************************************************************************
* 函数名称 :delay
* 功能描述 :延时函数
******************************************************************************************/
void delay(uint us) //delay time
{
while(us--);
}
/******************************************************************************************
* 函数名称 :delay1
* 功能描述 :延时函数 1ms
******************************************************************************************/
void delay1(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
delay(1);
}
/*****************************************************************************
写分秒
******************************************************************************/
void Write_hms(uint add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
wr_lcd(comm,add);
delay(1);
wr_lcd(dat,0x30+shi);
delay(1);
wr_lcd(dat,0x30+ge);
delay(1);
}
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
/*****ds1820复位******/
void ds1820rst()
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char datb = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
datb>>=1;
DQ = 1; //给脉冲信号
if(DQ)
datb|=0x80;
delay_18B20(10);
}
return(datb);
}
/*************************************************************************************
/DS18B20写字节函数
*************************************************************************************/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*************************************************************************************
/DS18B20读字节函数
*************************************************************************************/
read_temp()
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0x44); //*启动温度转换*/
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0xbe); //*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*************************************************************************************
/DS18B20读温度函数
*************************************************************************************/
/*void ds1820disp() //温度值显示
{
disdata[0]=tvalue/1000+0x30; //百位数
disdata[1]=tvalue%1000/100+0x30; //十位数
disdata[2]=tvalue%100/10+0x30; //个位数
disdata[3]=tvalue%10+0x30; //小数位
/*wr_com(0xc0);
wr_dat(flagdat); //显示符号位
wr_com(0xc1);
wr_dat(disdata[0]); //显示百位
wr_com(0xc2);
wr_dat(disdata[1]); //显示十位
wr_com(0xc3);
wr_dat(disdata[2]); //显示个位
wr_com(0xc4);
wr_dat(0x2e); //显示小数点
wr_com(0xc5);
wr_dat(disdata[3]); //显示小数位
}*/
/*****************************************************************************
写温度
******************************************************************************/
void Write_wendu(uint add,tvalue)
{
uchar bai1,shi1,ge1,xiao1;
bai1=tvalue/1000;
shi1=tvalue%1000/100;
ge1=tvalue%100/10;
xiao1=tvalue%10;
wr_lcd(comm,add);
delay(1);
wr_lcd(dat,0x30+bai1);
delay(1);
wr_lcd(dat,0x30+shi1);
delay(1);
wr_lcd(dat,0x30+ge1);
delay(1);
wr_lcd(dat,0x30+xiao1);
delay(1);
}
/******************************************************************************************
* 函数名称 :main
* 功能描述 :主函数
******************************************************************************************/
void main()
{
SP=0x60;
COM8155=0X02;
IT0=1;
EX0=1;
EA=1;
ds1820rst();
ds1820rd();
delay(100);
init_lcd();
clrram();
delay(100);
wr_str(0x80,14,TAB1A);
delay1(10);
wr_str(0x90,16,TAB1B);
delay1(10);
wr_str(0x88,14,TAB1C);
delay1(10);
wr_str(0x98,14,TAB1D);
do
{
read_temp(); //读取温度
Write_wendu(0x8d,tvalue);
delay1(2100);
Write_hms(0x97,miao);
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
Write_hms(0x93,shi);
delay(1);
}
Write_hms(0x95,fen);
delay(1);
}
}
while(1);
}
[解决办法]
哪个函数不对?太多了吧。
[解决办法]
DS18B20温度值不能在12864上显示啊,请主要看看18B20部分程序好么?小弟先谢过啊。。
[解决办法]
语句能看懂,但是整体流程不明白,也看不出来原因。
[解决办法]
网上找找吧,这个程序蛮多的,你是用实物硬件来的?
建议:装个Proteus(小虽小,但够用了),搭个简单的原理图,然后分模块测试你的软件代码即可,
比如你现在可以搭个简单的DS18B20电路,然后显示的话用个1602就行了,一般这样测过之后,
实物运行起来是不会有多大问题的。
ds18b20那器件记得毕业设计那会弄得都要吐了,呵呵,现在全忘了……