下位机报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
温度测量系统报告
(下位机单片机阶段性报告)
实习器材:
硬件:PC机一台、51学习板、电源线、串口线、DS18B20温度传感器
软件: KEIL C51编程软件、proteus、串口小助手、虚拟串口驱动
实习目的:
1、熟知51单片机的硬件结构及工作原理;
2、了解DS18B20的工作特性;
3、掌握KEIL C51的使用方法;
4、掌握运用51单片机实际开发能力;
实习地点:信息中心
实习内容:
用51单片机和DS18B20温度传感器以及数码管实现温度显示,再把温度发送到上位机。
一、程序设计部分
主要是对ds18b20的读写操作,通过ds18b20的读数据,然后进行温度值转换,可通过数码管辅助显示当前温度值,然后吧采集到的温度值送给单片机中的SBUF进行发送数据,以此达到下位机与上位机的信息交流。
附:C51程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dp=P1^0;
uchar flag;
uint temp10;
uint templ,temph;
uchar ck[6];
uchar code disptab[ ]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff,0xbf};
uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7};
void udelay(uint n)
{
while(n--);
}
void mdelay(uint n)
{
uint m;
for(;n>0;n--)
for(m=124;m>0;m--);
}
void reset()
{
dp=1;
_nop_();
dp=0;
udelay(80);
dp=1;
udelay(8);
flag=dp;
udelay(40);
}
void write_bit(bit flg) {
dp=1;
_nop_();
_nop_();
dp=0;
_nop_();
_nop_();
if(flg==1)
dp=1;
udelay(10);
dp=1;
}
void write_byte(uchar dat) {
uchar i;
for(i=0;i<8;i++)
{
if((dat&0x01)==0) write_bit(0);
else
write_bit(1);
dat>>=1;
}
}
uchar read_bit()
{
bit dat;
dp=1;
_nop_();
dp=0;
_nop_();
dp=1;
_nop_();
_nop_();
dat=dp;
udelay(11);
return dat;
}
uchar read_byte()
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp>>=1;
if(read_bit())
temp|=0x80;
}
return temp;
}
uint read_temper()
{
uint temp;
reset();
write_byte(0xcc);
write_byte(0xbe);
templ=read_byte();
temph=read_byte();
temp=temph;
temp=(temp<<8)|templ;
temph=temp>>4;
templ=(temp&0x0f)*6/10;
reset();
write_byte(0xcc);
write_byte(0x44);
return temp;
}
void disp(uint temper)
{
uchar dispbuf[4],i;
uint temp16;
temp16=temper;
if((temp16&0x8000)!=0)
{
dispbuf[0]=11;
temp16=(~temp16)+1;
}
else
dispbuf[0]=0;
temp16=temp16*5/8;
if(dispbuf[0]!=11)
dispbuf[0]=temp16/1000;
dispbuf[1]=(temp16%1000)/100;
dispbuf[2]=(temp16%100)/10;
dispbuf[3]=temp16%10;
if(dispbuf[0]==0)
dispbuf[0]=10;
if((dispbuf[0]==10)&&(dispbuf[1]==0)) dispbuf[1]=10;
if((dispbuf[0]==11)&&(dispbuf[1]==0)) {
dispbuf[0]=10;
dispbuf[1]=11;
}
for(i=0;i<4;i++)
{
P2=dispbit[i];
if(i==2)
P0=disptab[dispbuf[i]]&0x7f;
else
P0=disptab[dispbuf[i]];
mdelay(1);
P0=0xff;
}
}
void sent(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void main()
{
unsigned char i;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
temp10=read_temper();
mdelay(1);
for(i=255;i>0;i--)
disp(temp10);
ck[0]=((temph%100)/10+0x30);
ck[1]=((temph%100)%10+0x30);
ck[2]=0x2e;
ck[3]=(templ+0x30);
}
}
void int_4() interrupt 4
{ uint i;
RI=0;
ES=0;
disp(temp10);
for(i=0;i<6;i++)
{
sent(ck[i]);
}
ES=1;
}
附硬件电路图:
总结:
通过这一个星期的下位机编程学习,是自己学到了很多知识,尤其是在学习ds18b20的时候,在根据时序图进行读写编程的时候,遇到了许多问题,但是通过和同学交流,自己反复的试验,
总算解决了。
这次学习是自己对于单片机的一些器件芯片有了更加的了解。