#include
#include
#define uchar unsigned char
#define uint unsigned int
***it lcdrs=P3^2;//定义1602液晶RS端
***it lcden=P3^3;//定义1602液晶LCDEN端
***it ds=P3^7;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
void delay1us() //@11.0592MHz
{
_nop_();
_nop_();
_nop_();
}
void delayms(uint t) //@11.0592MHz
{
unsigned char i, j;
while(t--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
/**********************
*复位,初始化函数*****/
void ds_reset()
{
uchar j;
P3M0|=0x80;
ds=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ds=0;
j=3000;
while(--j);//延时600us
ds=1;
j=3000;
while(--j);//延时500us
ds=1;
}
bit ds_read_bit()//读一位数据函数
{
bit dat;
uchar j;
P3M0|=0x80;
ds=1;
j=10;//延时2us
while(--j);
ds=0;
j=30;//延时6us
while(--j);
ds=1;
j=20;//延时4us
while(--j);
P3M0&=~0x80;
dat=ds;
j=150;//延时30us
while(--j);
return(dat);
}
uchar ds_read_byte()//读一个字节数据函数
{
uchar i,j,k;
for(i=0;i<8;i++)
{
j=ds_read_bit();
k=(j<<7)|(k>>1);
}
return(k);
}
void ds_write_byte(uchar dat)//写一个字节数据函数
{
uchar i,j;
P3M0|=0x80;
for(i=0;i<8;i++)
{
ds=0;
j=75;//延时15us
while(--j);
ds=dat&0x01;
j=225;//延时45 us
while(--j);
ds=1;
dat=dat>>1;
}
}
uint read_temperature()//18b20 开始获取温度并转换
{
uint a,b,temp1;
ds_reset();
ds_write_byte(0xcc);//写跳过读ROM指令
ds_write_byte(0x44);//写温度转换指令
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0xbe);//读温度暂存器命令
a=ds_read_byte();//读低八位
b=ds_read_byte();//读高八位
temp1=b;
temp1=temp1<<8;
temp1=temp1|a;
temp1=temp1*0.0625*10+0.5;
return (temp1);
}
void write_com(uchar com) //些命令,RS=0
{
P2=com;
lcdrs=0;
lcden=0;
delay1us();
lcden=1;
delay1us();
lcden=0;
}
void write_data(uchar dat) //写数据,RS=1
{
P2=dat;
lcdrs=1;
lcden=0;
delay1us();
lcden=1;
delay1us();
lcden=0;
}
void init()
{
write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delayms(20);
write_com(0x0f); //显示模式设置
delayms(20);
write_com(0x06); //显示模式设置:光标右移,字符不移
delayms(20);
write_com(0x01); //清屏幕指令,将以前的显示内容清除
delayms(20);
}
void display()
{
uint temp;
uchar bai1,shi1,ge1;
temp=read_temperature();
bai1=temp/100;
shi1=temp%100/10;
ge1=temp%100%10;
write_data(table[bai1]);
delayms(10);
write_data(table[shi1]);
delayms(10);
write_data('.');
delayms(10);
write_data(table[ge1]);
delayms(10);
write_data(' ');
delayms(10);
}
void main()
{
init();
while(1)
{
write_com(0x80);
delayms(20);
display();
delayms(20);
}
}
2015-7-17 14:34:56
18B20的重点就是延时啊,用示波器看看,还有IO口方向要变化的哈
18B20的重点就是延时啊,用示波器看看,还有IO口方向要变化的哈
举报
2016-8-25 14:33:04
来学习的呵呵!!
嵌入式培训 www.arm8.net
来学习的呵呵!!嵌入式培训 www.arm8.net
举报