#include
#include
//变量声明
#define uchar unsigned char
#define uint unsigned int
uchar digit[]="0123456789ABCDEF";
//延时1 毫秒 程序
void delayms();
//延时 s 毫秒 程序
void delaynms(uint);
//初始化 LCD
void InitLCD();
//写LCD 指令
void WriteInstruction(uchar);
//写LCD 数据
void WriteData(uchar);
//写LCD 地址
void WriteAdd(uchar);
//读LCD 状态
uchar BusyTest();
//LCD 忙碌查询
sbit LCDbusy=P1^7;
//LCD 操作位 设置
sbit RS=P2^2;
sbit RW=P2^1;
sbit E=P2^0;
sbit BF=P1^7;
//----- DS1820 声明 变量 函数
sbit DQ=P3^0;
sbit led=P3^1; //信号指示
uchar TL,TH; //读取 DS1820 温度数据高位,低位
//DS1820 序列号
uchar dat[9];
//初始化 DS1820
bit InitDS1820();
//读取 DS1820 一个字节
uchar ReadOneChar();
//写入 DS1820 一个字节
WriteOneChar(uchar );
//读 ROM 序列号
void ReadRom();
//负温度 标志
uchar flag=0;
//main 程序
void main()
{
uchar i,tem,hi,lo;
uchar code str[]="Serial number is:";
//初始化LCD
InitLCD();
//写地址
WriteAdd(0x05);
//写数据
i=0;
while(str[i]!='\0')
{
WriteData(str[i]);
i++;
}
//读 DS1820 序列号
ReadRom();
//显示DS1820 序列号
WriteAdd(0x40);
//输出序列号,高位在前,低位在后
for(i=0;i<8;i++)
{
tem=dat[7-i];
hi=tem>>4;
tem=dat[7-i];
lo=tem&0x0f;
WriteData(digit[hi]);
WriteData(digit[lo]);
}
delaynms(1000);
}
//--- DS1820 程序 -----
//初始化 DS1820
bit InitDS1820()
{
uchar t;
bit flag;
DQ = 1;
_nop_();
DQ = 0;
//维持600us
for(t=0;t<200;t++) ;
//释放总线
DQ = 1;
//等待15~30us,DS1820输出应答信号,
//此处延时 45us
for(t=0;t<15;t++);
//采样应答信号
flag=DQ;
//应答信号维持60~240us
// 此处延时 300us ,
for(t=0;t<100;t++);
return (flag); //返回检测成功标志
}
//读取 DS1820 一个字符
//数据的读写都是 低位在前。例写数据,D7~D0,写入顺序D0~D7。
uchar ReadOneChar()
{
uchar i,t;
uchar dat;
//
for(i=0;i<8;i++)
{
//
dat>>=1;
//
//当i=0,此时 dat 的 D7位 对应 温度 TL(TH)的 D0 位 数据
//当i=1,此时 dat 的 D7位 对应 温度 TL(TH)的 D1 位 数据
//当i=2,此时 dat 的 D7位 对应 温度 TL(TH)的 D2 位 数据 .....
DQ=1; //c51 驱动
_nop_();
DQ=0; //c51 驱动
_nop_(); //延时1 us 释放总线
DQ=1; //c51 释放总线
//DS1820 准备数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
//采样
if(DQ==1) //c51 采样
dat|=0x80;
else
dat|=0x00;
//完成一个读周期需 60us ,此处延时60us.
//一个循环约 3us
for(t=0;t<20;t++);
}
return dat;
}
//写入 DS1820 一个字节
//数据的读写都是 低位在前。例写数据,D7~D0,写入顺序D0~D7。
WriteOneChar(uchar dat)
{
uchar i,t;
for(i=0;i<8;i++)
{
DQ=1; //c51 驱动
_nop_();
DQ=0; //c51 释放总线
//从低位开始第i 位数据,传送数据到总线
DQ=dat&0x01;
//DS1820在DQ=0 后15~60us 采样。
//所以 延时 60us,
for(t=0;t<20;t++);
//准备下一位数据 ,将数据位移动到D0位置
dat>>=1;
}
}
// 读 ROM 序列号
void ReadRom()
{
uchar i;
InitDS1820();
//忽略 DS1820 地址
WriteOneChar(0x33);
//序列号 低位字节在前,高位字节在后
for(i=0;i<8;i++)
{
//
dat[i]=ReadOneChar();
}
}
//------ LCD 程序 ----
//初始化 LCD
void InitLCD()
{
delaynms(15);
WriteInstruction(0x38);// 显示模式设置
delaynms(5);
WriteInstruction(0x38);
delaynms(5);
WriteInstruction(0x38);
delaynms(5);
WriteInstruction(0x0d);//显示模式设置: 开显示,不显示光标,闪烁光标
delaynms(5);
WriteInstruction(0x06);//显示模式设置: 光标右移,文字不移动。
delaynms(5);
}
//写 LCD 指令
void WriteInstruction(uchar instruction)
{
//LCD 忙碌,等待。
while(BusyTest()==1);
//写指令
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
_nop_();
//指令
P1=instruction;
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
E=0;
}
//写LCD 数据
void WriteData(uchar d)
{
//LCD 忙碌,等待。
while(BusyTest()==1);
//写数据
RS=1;
RW=0;
E=0;
_nop_();
_nop_();
_nop_();
//指令
P1=d;
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
E=0;
}
//写地址,属于写指令
void WriteAdd(uchar ad)
{
uchar addr=ad+0x80;
WriteInstruction(addr);
}
//读LCD 状态
uchar BusyTest()
{
bit result;
//读LCD 状态
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
//指令
result=BF;
_nop_();
_nop_();
_nop_();
E=0;
return result;
}
void delaynms(uint s)
{
uint tem;
for(tem=0;tem
{
delayms();
}
}
//延时 1ms
void delayms()
{
uchar i;
for(i=0;i<250;i++);
for(i=0;i<80;i++);
}
上一篇:c51:将16进制序列码,转换为16进制数组
下一篇:c51: DS1820
推荐阅读最新更新时间:2024-03-16 15:15