|
我前几天做了一个ds18b20,显示乱码。我是看着时序写的,我用的是atmega8515晶振为8mhz,烧录熔丝位设置为8mhz。程序如下
**************8mhz*****************/
#include<iom8515v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define rs_clr PORTC&=~BIT(6)
#define rs_set PORTC|=BIT(6)
#define rs_out DDRC|=BIT(6)
#define rw_clr PORTC&=~BIT(5)
#define rw_set PORTC|=BIT(5)
#define rw_out DDRC|=BIT(5)
#define en_clr PORTC&=~BIT(7)
#define en_set PORTC|=BIT(7)
#define en_out DDRC|=BIT(7)
#define dq_clr PORTC&=~BIT(2)
#define dq_set PORTC|=BIT(2)
#define dq_in DDRC&=~BIT(2)
#define dq_out DDRC|=BIT(2)
#define dq_r PINC&BIT(2)
uchar table []={"welcome temp:"};
uchar table_num []={"0123456789"};
uchar disp[3]={0,0,0};
/************函数申明**********/
void write_com(uchar com);
//void delay_ms(uint ms );
void delay_ms(uint ms )
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1000;j++)//1ms
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
}
/*
void delay_us(uint us )
{
uint i;
for(i=0;i<us;i++)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
*/
void delay_us(int time)
{
do
{
time--;
}
while (time>1);
}
void init_1602(void)
{
DDRA=0xff;//设置为输出
PORTA=0;
rs_out;
rw_out;
en_out;
delay_ms(15);
write_com(0x38); //设置16x2显示,5x7点阵,8位数据口
write_com(0x08); // 显示关闭
write_com(0x01); //显示清屏,数据指针以及所有显示清零
write_com(0x06); //读写数据,光标及数据指针加一
write_com(0x0C); //开显示,光标不显示
}
void write_com(uchar com)//写命令
{
rs_set ;
rw_set;
en_clr ;
rs_clr ;
rw_clr;
PORTA=com;
delay_ms(1);
en_set;
delay_ms(1);
en_clr;
}
void write_data(uchar dat)//写数据
{
rs_clr ;
rw_set;
en_clr ;
rs_set ;
rw_clr;
PORTA=dat;
delay_ms(1);
en_set;
delay_ms(1);
en_clr;
}
void dipaly_1602(void)//显示函数
{
char i;
write_com(0x80);
for(i=0;i<7;i++)
write_data(table[i]);
write_com(0x80+0x42);
for(i=0;i<5;i++)
write_data(table[i+8]);
for(i=0;i<2;i++)
{
write_data(table_num[disp[i]]);
delay_ms(10);
}
write_data(0xdf);//温度符号
write_data(0x43);
}
/****************ds18b20**************/
void ds18b20_init(void)//初始化函数
{
uchar n;
dq_out;//设置为输出
//dq_set;//先拉高
//delay_us(8);
dq_clr;
delay_us(500);//至少要480uS
dq_set;
delay_us(15);//至少要15us+60us
dq_in;//设置为输入
n=dq_r;
delay_us(100);//等待释放总线
}
void write_byte_ds18b20(uchar dat) //写一个字节
{
uchar i;
dq_out;//设置为输出
for(i=0;i<8;i++)
{
//delay_us(10);//延时10us
dq_clr;
delay_us(10);//延时10us
if(dat&0x01)//如果写入的是1
delay_us(4);
dq_set;
delay_us(50);
dat>>=1;
}
delay_us(4);
}
uchar read_byte_ds18b20(void )//读一个字节
{
char i;
uchar value;
dq_out;
for(i=0;i<8;i++)
{
dq_clr;
value>>=1;
delay_us(15);
dq_set;
dq_in;//设置为输入
if(dq_r)
value|=0x80;
delay_us(45);//延时至少要45us
}
return value;
}
uchar read_temp(void)//读温度
{
uchar temp_h,temp_l;
ds18b20_init();
write_byte_ds18b20(0xcc);//跳过检测rom
write_byte_ds18b20(0x44);//启动温度转化
delay_us(500);//延时至少需要480us
ds18b20_init();
write_byte_ds18b20(0xcc);//跳过检测rom
write_byte_ds18b20(0xbe);//读取温度
temp_l=read_byte_ds18b20();//读低八位
temp_h=read_byte_ds18b20();//读高八位
temp_h<<=4;
temp_h+=(temp_l&0xf0)>>4;
return temp_h;
}
void main(void)
{
uchar temp;
init_1602();
ds18b20_init();
while(1)
{
temp=read_temp();
disp[0]=temp/10;
disp[1]=temp%10;
dipaly_1602();
}
}
1602显示正常就是温度显示不出来 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|