找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

把一线大哥写18b20的程序下载到我的电脑上,为何就出错了?麻烦

[复制链接]
admin 发表于 2012-9-2 20:30:48 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
用keil进行下面的编译,却没有生成目标,显示的的错误如下:
RAMSIZE(256)
***FATAL ERROR L210 : I/0 ERROR ON INPUT FILE:
EXCEPTION 0021H:PATH OR FILE NOT FOUND
FILE: C:\KEIL\C51\LIB\C51FPS.LIB
目标没有产生

我把数码管dm,wm和12B20DQ和led的脚从新定义了(为了和我实验板上的接法一致)
程序:
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uint temp;
uchar tplsb,tpmsb; // 温度值低位、高位字节

sbit DQ = P2^2; // 数据通信线DQ
sbit dm=P2^6;
sbit wm=P2^7;
sbit led=P1^0;
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};

unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//带小数的段码表

/********************** 延时t毫秒***************** */
void delay(uint t)
{
uint i;
while(t--)
{
for (i=0;i<125;i++) // 对于11.0592M时钟,约延时1ms
{}
}
}

/*******************产生复位脉冲初始化DS18B20**************/
void reset(void)
{
uint i;
DQ = 0;
i = 100; //拉低约900us
while (i>0) i--;

DQ = 1; // 产生上升沿
i = 4;
while (i>0) i--;
}

/********************* 等待应答脉冲*********************/
void wait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while (i>0) i--;
}

/********************读取数据的一位,满足读时隙要求**************/
bit readbit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}

/******************* 读取数据的一个字节**************************/
uchar readbyte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = readbit();
b = (j<<7)|(b>>1);
}
return(b);
}

/******************写数据的一个字节,满足写1和写0的时隙要求************/
void writebyte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{

DQ = 0;
i++;i++; // 延时,使得15us以内拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整个写1时隙不低于60us
}
else
{

DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}

/************************* 启动温度转换********************/
void convert(void)
{
reset(); // 产生复位脉冲,初始化DS18B20
wait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
writebyte(0xcc); // skip rom 命令
writebyte(0x44); // convert T 命令
}

/********************* 读取温度值****************************/
uint readtemp(void)
{ float tt;
reset(); // 产生复位脉冲,初始化DS18B20
wait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
writebyte(0xcc); // skip rom 命令
writebyte(0xbe); // read scratchpad 命令
tplsb = readbyte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = readbyte(); // 高位值高位字节(其中高5位为符号位)
temp=tpmsb;
temp<<=8;
temp=temp|tplsb;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}

/**********************显示程序****************************/
void display(uint temp)
{
uchar A1,A2,A2t,A3;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
P0=0X01; //选通第一位数码管
wm=1;
wm=0;
P0=table[A1];//显示百位
dm=1;
dm=0;
delay(1);
P0=0xff;//关位码
dm=1;
dm=0;


P0=0x02;//选通第二位数码管
wm=1;
wm=0;
P0=table1[A2];//显示十位
dm=1;
dm=0;
delay(1);
P0=0xff;//关位码
dm=1;
dm=0;

P0=0x04;//选通第三位数码管
wm=1;
wm=0;
P0=table[A3];//显示个位
dm=1;
dm=0;
delay(1);
P0=0xff;//关位码
dm=1;
dm=0;
}
void main(void)
{
led=0;
delay(1); // 延时1ms
convert(); // 启动温度转换,需要750ms
delay(1000); // 延时1s
readtemp(); // 读取温度
while(1)
{

convert();

display(readtemp());

}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 09:45 , Processed in 0.053471 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表