angelcoffee 发表于 2012-9-16 13:06:45

DA18B20开发板可以成功但protues仿真失败

               是我从系统摘下来的一部分,算是个独立的小程序。只有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);
        for (i=0;i<16;i++) lcd_char_write(i,1,temp_high_low);
        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);/*把温度显示出来*/
                lcd_char_write(7,0,mun_char_table);
                lcd_char_write(9,0,mun_char_table);

                lcd_char_write(2,1,mun_char_table);/*显示最高温度*/
                lcd_char_write(3,1,mun_char_table);
                lcd_char_write(5,1,mun_char_table);

                lcd_char_write(10,1,mun_char_table);/*显示最低温度*/
                lcd_char_write(11,1,mun_char_table);
                lcd_char_write(13,1,mun_char_table);
                delay_1ms(100);
                }
}

angelcoffee 发表于 2012-9-16 13:07:41

这是我protues的原理图
页: [1]
查看完整版本: DA18B20开发板可以成功但protues仿真失败