Snaker
51单片机问题求职

手上有一个STC90c510rd+和好几个AT89s52单片机,我写了一个用DS18b20测温,四位共阳极数码管显示的程序,可是STC的单片机可以运行,AT的不能,求大神们帮帮忙

番茄星人
两个单片机的延时函数应该不同的
展开Biu

两个单片机的延时函数应该不同的,对应AT单片机的主频修改一下延时函数

[查看全文]
Snaker
程序如下
展开Biu

程序如下:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit DQ=P1^3;//ds18b20 端口

unsigned char code table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};// 显示段码值0~9

unsigned char code table2[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x0,0x10};// 显示段码值0~9带点

unsigned char code table3[]={0x08,0x04,0x02,0x01};//分别对应相应的数码管点亮,即位码

unsigned char TempData[4]; //存储显示值的全局变量

//延时程序

void DelayUs2x(unsigned char t)

{

while(--t);

}

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

void ys(uint tt)

{

uint xx,yy;

for(xx=tt;xx>0;xx--)

for(yy=110;yy>0;yy--);

}

//延时程序结束

//DS18B20温度读取函数

bit Init_DS18B20(void)

{

bit dat=0;

DQ = 1; //DQ复位

DelayUs2x(5); //稍做延时

DQ = 0; //单片机将DQ拉低

DelayUs2x(200); //精确延时 大于 480us 小于960us

DelayUs2x(200);

DQ = 1; //拉高总线

DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲

dat=DQ; //如果x=0则初始化成功, x=1则初始化失败

DelayUs2x(25); //稍作延时返回

return dat;

}

/*------------------------------------------------

读取一个字节

------------------------------------------------*/

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

DelayUs2x(25);

}

return(dat);

}

/*------------------------------------------------

写入一个字节

------------------------------------------------*/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

DelayUs2x(25);

DQ = 1;

dat>>=1;

}

DelayUs2x(25);

}

/*------------------------------------------------

读取温度

------------------------------------------------*/

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

DelayMs(10);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b<<=8;

t=a+b;

return(t);

}

//DS18B20温度读取函数结束

void Display()

{

unsigned int TempH,TempL,temp;

temp=ReadTemperature();

if(temp&0x8000)

{

TempData[0]=0xbf;//负号标志

temp=~temp; // 取反加1

temp +=1;

TempH=temp>>4;

TempL=temp&0x0F;

TempL=TempL*6/10;//小数近似处理

if((TempH/100==0)&&((TempH%100)/10==0))//消隐

TempData[1]=0xff;

else

TempData[1]=table[(TempH%100)/10]; //十位温度

TempData[2]=table2[(TempH%100)%10]; //个位温度,带小数点

TempData[3]=table[TempL];

}

else

{

TempH=temp>>4;

TempL=temp&0x0F;

TempL=TempL*6/10;//小数近似处理

if(TempH/100==0)

TempData[0]=0xff;

else

TempData[0]=table[TempH/100]; //十位温度

if((TempH/100==0)&&((TempH%100)/10==0))//消隐

TempData[1]=0xff;

else

TempData[1]=table[(TempH%100)/10]; //十位温度

TempData[2]=table2[(TempH%100)%10]; //个位温度,带小数点

TempData[3]=table[TempL];

}

}

void main()

{

uint aa;

while(1)

{

Display();

for(aa=0;aa<4;aa++)

{

P2=table3[aa];

P0=TempData[aa];

ys(4);

P0=0XFF;

}

}

}

[查看全文]
Snaker
图片看不了
展开Biu

绯色の胖子 发表于 2015-12-23 13:55

图片看不了 不要用百度外链

你可以直接上传

哦,好吧

[查看全文]
Snaker
本帖最后由
展开Biu

本帖最后由 Snaker 于 2015-12-23 14:53 编辑

这个是AT单片机运行的结果

[查看全文]
Snaker
本帖最后由
展开Biu

本帖最后由 Snaker 于 2015-12-23 14:55 编辑

这是STC单片机运行的

[查看全文]