|
是我从系统摘下来的一部分,算是个独立的小程序。只有1片ds18b20检测温度的,我把hex文件加载到开发板中可以实现,但加载到protues仿真中却失败了!我百度了许多仿真图,不明白失败的地方。。。。。。。。求指教!
下面是我的程序,hex文件,protues图,还有开发板的原理图!
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
sbit DQ=P2^2;
sbit lcd_rs_port=P3^5;
sbit lcd_rw_port=P3^6;
sbit lcd_en_port=P3^4;
#define lcd_data_port P0
/////////////////////////////
sbit wela=P2^7;
/*void delay1(void)
{
int k;
for(k=0;k<1000;k++);
} */
/////////////////////////////
void lcd_delay(uchar ms)
{
uchar j;
while(ms--)
{
for(j=0;j<250;j--);
}
}
void lcd_busy_wait()
{
lcd_rs_port=0;
lcd_rw_port=1;
lcd_en_port=1;
lcd_data_port=0xff;
while(lcd_data_port&0x80);
lcd_en_port=0;
}
void lcd_command_write(uchar command)
{
lcd_busy_wait();
lcd_rs_port=0;
lcd_rw_port=0;
lcd_en_port=0;
lcd_data_port=command;
lcd_en_port=1;
lcd_delay(5);
lcd_en_port=0;
}
void lcd_system_reset()
{
lcd_delay(20);
lcd_command_write(0x38);
lcd_delay(100);
lcd_command_write(0x38);
lcd_delay(50);
lcd_command_write(0x38);
lcd_delay(10);
lcd_command_write(0x08);//ke yi bu yong
lcd_command_write(0x01);
lcd_command_write(0x06);
lcd_command_write(0x0c);
}
void lcd_char_write(uchar x_pos,y_pos,lcd_dat)
{
x_pos &= 0x0f;
y_pos &= 0x01;
if(y_pos==1)
x_pos += 0x40;
x_pos += 0x80;
lcd_command_write(x_pos);
lcd_busy_wait();
lcd_rs_port = 1;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = lcd_dat;
lcd_en_port = 1;
lcd_delay(5);
lcd_en_port = 0;
}
void lcd_bad_check()
{
char i,j;
for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
lcd_char_write(j,i,0xff);
}
}
lcd_delay(200);
lcd_delay(200);
lcd_delay(200);
lcd_delay(100);
lcd_delay(200);
lcd_command_write(0x01);// qing pin
}
/////////////////////////////////////////////
void delay(uint i)
{
while(i--);
}
void init_dsl8b20()
{
uchar x;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
read_one_char(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ) dat|=0x80; //?|=
delay(4);
}
return(dat);
}
write_one_char(uchar dat) //zai keil zhong bujin tiao jie
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
return(dat);
}
ReadTemperature()
{
uchar a,b,t;
float tt=0;
init_dsl8b20();
write_one_char(0xCC);
write_one_char(0x44);
init_dsl8b20();
write_one_char(0xCC);
write_one_char(0xBE);
a=read_one_char();
b=read_one_char();
t=b;
t<<=8;
tt=t|a;
tt=tt*0.0625;
t=tt*10+0.5;
return(t);
}
/////////////////////////////////////////
unsigned char mun_char_table[]={"0123456789abcdef"};
unsigned char temp_table[] ={"Temp: . 'C"};
unsigned char temp_high_low[]={"H: . L: . "};
void delay_1ms(uchar x)
{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
main()
{
uint i;
uint temp_high,temp_low;
ReadTemperature();
lcd_system_reset();
P0=0xff;
delay_1ms(5);
wela=1;
delay_1ms(5);
wela=0;
lcd_bad_check();
for (i=0;i<12;i++) lcd_char_write(i,0,temp_table[i]);
for (i=0;i<16;i++) lcd_char_write(i,1,temp_high_low[i]);
i=ReadTemperature(); /*读取当前温度*/
temp_high = i;
temp_low = i;
while(1){
i=ReadTemperature(); //读取当前温度
if(temp_high<i) temp_high=i;
if(temp_low>i) temp_low=i;
lcd_char_write(6,0,mun_char_table[i/100]); /*把温度显示出来*/
lcd_char_write(7,0,mun_char_table[i%100/10]);
lcd_char_write(9,0,mun_char_table[i%10]);
lcd_char_write(2,1,mun_char_table[temp_high/100]); /*显示最高温度*/
lcd_char_write(3,1,mun_char_table[temp_high%100/10]);
lcd_char_write(5,1,mun_char_table[temp_high%10]);
lcd_char_write(10,1,mun_char_table[temp_low/100]); /*显示最低温度*/
lcd_char_write(11,1,mun_char_table[temp_low%100/10]);
lcd_char_write(13,1,mun_char_table[temp_low%10]);
delay_1ms(100);
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|