18b20程序 在51上好使 在stc15上相对应改了延时无法运行

2019-07-15 17:00发布

#include<stc15f2k60s2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^2;//定义1602液晶RS端
sbit lcden=P3^3;//定义1602液晶LCDEN端
sbit 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);
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。