我是一个新手,现在在做毕设,写程序老出问题(编译没问题,运行结果总不理想),但是总检查不出来。肯请各位大虾帮哈忙啊?
想在1602的第一排显示4个温度值,第二排显示4个(同时显示正负号)。但是我的结果是第一排总为0。第二排的温度值是正确的,但是符号位总为+。为什么呢,我检查了想应的地方没什么问题啊?
因为能显示部分温度,所以DS18B20和1602的驱动应该是没问题的,所以下面的程序省略了这些。
#include<reg52.h>
#include <Intrins.h>
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
const uchar code ROMData0[8]={0x28,0x30,0xC5,0xB8,0x00,0x00,0x00,0xD7};
const uchar code ROMData1[8]={0x28,0x31,0xC5,0xB8,0x00,0x00,0x00,0x8E};
const uchar code ROMData2[8]={0x28,0x32,0xC5,0xB8,0x00,0x00,0x00,0xB9};
const uchar code ROMData3[8]={0x28,0x33,0xC5,0xB8,0x00,0x00,0x00,0xE0};
const uchar code ROMData4[8]={0x28,0x34,0xC5,0xB8,0x00,0x00,0x00,0x52};
const uchar code ROMData5[8]={0x28,0x35,0xC5,0xB8,0x00,0x00,0x00,0x65};
const uchar code ROMData6[8]={0x28,0x36,0xC5,0xB8,0x00,0x00,0x00,0x3C};
const uchar code ROMData7[8]={0x28,0x37,0xC5,0xB8,0x00,0x00,0x00,0x0B};
int table1[8]; //用于装每层楼1号温度值
//int table2[4]; //用于装每层楼2号温度值
bit Mark; //温度正负号标志位
uchar tempL,tempH; //设置温度值高位和低位
sbit RS=P2^0; //数据命令选择端
sbit RW=P2^1; //读写选择端
sbit EN=P2^2; //使能端
sbit DQ=P2^3;
void MatchROM(const uchar *pMatchData) // 匹配ROM子程序
{
int i;
Init18b20();
WriteByte(0x55);
for(i=0;i<8;i++)
{
WriteByte(*pMatchData);
pMatchData++;
Delay16us();
}
}
void ReadTemperature()
{
float t;
int temperature,temp,i; //存放温度数值
Init18b20();
WriteByte(0xcc); //跳过读ROM
WriteByte(0x44); //温度转换
Delay16us();
Init18b20();
for(i=0;i<8;i++)
{
switch(i) //匹配ROM
{
case 0: MatchROM(ROMData0);break;
case 1: MatchROM(ROMData1);break;
case 2: MatchROM(ROMData2);break;
case 3: MatchROM(ROMData3);break;
case 4: MatchROM(ROMData4);break;
case 5: MatchROM(ROMData5);break;
case 6: MatchROM(ROMData6);break;
case 7: MatchROM(ROMData7);break;
}
WriteByte(0xbe); //读温度寄存器(头两个值分别是温度低位和温度高位)
tempL=ReadByte(); //读出温度低位值
tempH=ReadByte(); //读出温度高位值
temp=tempH; //char是8位的,所以要将其转成int型
temp<<=8;
temp|=tempL;
if(temp<0) //如果是负数,求其原码
{
temp=~temp;
temp++;
Mark=1;
}
else Mark=0;
t=temp * 0.0625; //算出温度值
temperature=t*10+(t>0?0.5:-0.5); //将值扩大10倍,同时四舍五入
table1[i]=temperature;
}
}
void display() //每一个温度值的液晶显示
{
int i;
uchar wendu[4]={0,0,0,0};
uint num;
Write_com(0x80);
for(i=0;i<4;i++) //显示前四个传感器的温度
{
if(Mark==1)wendu[0]=0x2d; //显示温度负号
if(Mark==0)wendu[0]=0x2b; //显示温度正号
wendu[1]=table1[i]%1000/100+0x30; //温度值十位
wendu[2]=table1[i]%100/10+0x30; //温度个位
wendu[3]=' ';
for(num=0;num<4;num++) //显示温度值
{
Write_data(wendu[num]);
delay(5);
}
}
Write_com(0x80+0x40);
for(i=4;i<8;i++)
{
if(Mark==1)wendu[0]=0x2d; //显示温度负号
if(Mark==0)wendu[0]=0x2b; //显示温度正号
wendu[1]=table1[i]%1000/100+0x30; //温度值十位
wendu[2]=table1[i]%100/10+0x30; //温度个位
wendu[3]=' ';
for(num=0;num<4;num++) //显示温度值
{
Write_data(wendu[num]);
delay(5);
}
}
}
void main()
{
init(); //液晶初始化
Init18b20(); //DQ1初始化
while(1)
{
ReadTemperature(); //读所有点的温度,并存储
display(); //显示每层楼的温度
delay(5);
}
}
左边4个DS18B20的值在1602的第一排显示,右边的4个在第二排显示
一周热门 更多>