接口实验指导书.docx

上传人:b****6 文档编号:6621649 上传时间:2023-01-08 格式:DOCX 页数:21 大小:271.77KB
下载 相关 举报
接口实验指导书.docx_第1页
第1页 / 共21页
接口实验指导书.docx_第2页
第2页 / 共21页
接口实验指导书.docx_第3页
第3页 / 共21页
接口实验指导书.docx_第4页
第4页 / 共21页
接口实验指导书.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

接口实验指导书.docx

《接口实验指导书.docx》由会员分享,可在线阅读,更多相关《接口实验指导书.docx(21页珍藏版)》请在冰豆网上搜索。

接口实验指导书.docx

接口实验指导书

计算机接口与通信

 

实验指导书

机电工程学院电子信息工程教研室:

李明

实验一1-Wire和SPI总线接口实验

[实验目的]

1.熟悉KeilC51软件的基本使用方法

2.单总线协议和spi三线协议的软件模拟实现方法

3.掌握Proteus软件仿真8051硬件的基本操作方法

[实验仪器]

1.Proteus软件中的51单片机和相应的器件库。

2.软件:

PC机操作系统Win98、Win2000或WinXP,KeilC51集成开发环境。

[实验原理]

DS18b20是单总线的温度采集器,通过18b20可以获取温度数值,经过相应的数值变换后在SPI总线驱动的Max7219及数码管上进行显示。

[实验内容]

设计一个用ds18b20温度采集器的控制的和用max7219驱动的8段数码管显示电路系统。

主控制器采用8051单片机。

当18b20温度值发生变化时候能将温度值实时显示在数码管上。

[实验步骤]

使用proteus设计如下硬件电路

器件型号分别为:

使用keil创建一个C51工程,命名为wendu。

注:

处理器使用ATMEL公司的AT89C51。

添加主程序(具体步骤若不熟悉,可以咨询老师或同学,因嵌入式实验中用到这些步骤,故此处省略)

//以下代码为DS18b20的相关代码,同学们根据手册认真分析代码的功能

sbitTMDAT=P1^7;//控制线兼数据线

unsignedcharTemp_Integer=0;//温度整数部分

unsignedcharTemp_Decimal=0;//温度小数部分

unsignedcharfg=0;//温度正负标志

//-------------------------------------------------------------------------------------

//函数名称:

delayus

//入口参数:

count

//函数功能:

延时子程序

//-------------------------------------------------------------------------------------

voiddelayus(uintcount)

{

uinti;

while(count--)

{

for(i=0;i<125;i++){}

}

}

//-------------------------------------------------------------------------------------

//函数名称:

Reset_18B20

//入口参数:

//函数功能:

//-------------------------------------------------------------------------------------

voidReset_18B20(void)

{

uinti;

TMDAT=0;

i=103;

while(i>0)i--;//大约900us

TMDAT=1;

i=4;

while(i>0)i--;

}

//-------------------------------------------------------------------------------------

//函数名称:

Wait_18B20

//入口参数:

//函数功能:

等待DS18B20应答

//-------------------------------------------------------------------------------------

voidWait_18B20(void)

{

uinti;

while(TMDAT);

while(~TMDAT);

i=4;

while(i>0)i--;

}

//-------------------------------------------------------------------------------------

//函数名称:

Readbit_18B20

//入口参数:

//返回值:

dat

//函数功能:

在总线上读一位

//-------------------------------------------------------------------------------------

bitReadbit_18B20(void)

{

uinti=0;

bitdat=0;

TMDAT=0;i++;

TMDAT=1;i++;i++;

dat=TMDAT;

i=8;

while(i>0)i--;

return(dat);

}

//-------------------------------------------------------------------------------------

//函数名称:

Readbyte_18B20

//入口参数:

//返回值:

dat

//函数功能:

读一个字节

//-------------------------------------------------------------------------------------

unsignedcharReadbyte_18B20(void)

{

uchari=0,j=0,dat=0;

for(i=1;i<=8;i++)

{

j=Readbit_18B20();

dat=(j<<7)|(dat>>1);

}

return(dat);

}

//-------------------------------------------------------------------------------------

//函数名称:

Writebyte_18B20

//入口参数:

dat

//函数功能:

写命令

//-------------------------------------------------------------------------------------

voidWritebyte_18B20(uchardat)

{

uinti=0;

ucharj=0;

bittestb=0;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb)

{

TMDAT=0;//写1

i++;i++;

TMDAT=1;

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

}

else

{

TMDAT=0;//写0

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

TMDAT=1;

i++;i++;

}

}

}

//-------------------------------------------------------------------------------------

//函数名称:

Start_Convert

//入口参数:

//函数功能:

开始转换

//-------------------------------------------------------------------------------------

voidStart_Convert(void)

{

Reset_18B20();

Wait_18B20();

delayus

(1);

Writebyte_18B20(0xcc);

Writebyte_18B20(0x44);

}

//-------------------------------------------------------------------------------------

//函数名称:

Readbyte_18B20

//入口参数:

//函数功能:

读取温度值

//-------------------------------------------------------------------------------------

voidGet_temp()

{

ucharH_18B20=0,L_18B20=0,y1=0,y2=0;

fg=0;

Reset_18B20();//初始化DS18B20

Wait_18B20();

delayus

(1);

Writebyte_18B20(0xcc);//跳过ROM命令

Writebyte_18B20(0xbe);//发送读取数据命令

L_18B20=Readbyte_18B20();//读取温度低八位数据

H_18B20=Readbyte_18B20();//读取温度高八位数据

if(H_18B20>0x7f)//最高位为1时温度是负

{

L_18B20=~L_18B20+1;//补码转换,取反加一

H_18B20=~H_18B20;

fg=1;//读取温度为负时fg=1

}

//温度小数部分

Temp_Decimal=L_18B20&0x0f;

//温度整数部分

L_18B20=L_18B20>>4;

H_18B20=H_18B20<<4;

Temp_Integer=H_18B20|L_18B20;

}

/*********************************************************************

*功能:

延时子程序

*说明:

形参delayusms=5000,时间延长大约为1s

*********************************************************************/

voidDelay(uintdelayusms)

{

ucharj;

uinti;

for(i=0;i

for(j=0;j<255;j++);

}

//以下为max7219的代码,根据手册分析代码的作用

sbitSCK=P1^0;

sbitMOSI=P1^2;

sbitLOAD=P1^1;

voidWriteMax7219(unsignedcharaddr,unsignedchardat)

{

inti;

LOAD=0;

for(i=0;i<8;i++)

{

SCK=0;

MOSI=(bit)(addr&0x80);

SCK=1;

addr<<=1;

}

for(i=0;i<8;i++)

{

SCK=0;

MOSI=(bit)(dat&0x80);

SCK=1;

dat<<=1;

}

LOAD=1;

}

voidInitMax7219()

{

LOAD=1;

SCK=0;

WriteMax7219(0xc,0x1);//关闭掉电模式

WriteMax7219(0xb,0x7);//8个数码管都显示

WriteMax7219(0xa,0xf);//亮度设置,0xf最亮

WriteMax7219(0x9,0xff);//所有数码管译码显示

WriteMax7219(0x1,1);//

WriteMax7219(0x2,2);//

WriteMax7219(0x3,3);//

WriteMax7219(0x4,4);//

WriteMax7219(0x5,5);//

WriteMax7219(0x6,6);//

WriteMax7219(0x7,7);//

WriteMax7219(0x8,8);//

}

voidDisValue(longval)

{

WriteMax7219(0x1,val/10000000%10);//

WriteMax7219(0x2,val/1000000%10);//

WriteMax7219(0x3,val/100000%10);//

WriteMax7219(0x4,val/10000%10);//

WriteMax7219(0x5,val/1000%10);//

WriteMax7219(0x6,val/100%10);//

WriteMax7219(0x7,val/10%10);//

WriteMax7219(0x8,val%10);//

}

//在以下的主函数中将两部分代码协调调用,使满足本次实验要求

voidmain()

{

//内容自己编写

}

记录实验结果,并写到实验报告上。

[思考与分析]

1.使用DS2413单总线芯片实现led的闪烁驱动,

Ds2413的控制方式参考其手册。

2.将本实验中再接入一个温度传感器tc72,并将tc72采样的温度值送到max7219进行显示。

Tc72的操作参照它的datasheet。

实验二IIC接口实验

[实验目的]

1.熟悉KeilC51软件的基本使用方法

2.掌握IIC协议的软件模拟实现方法

[实验仪器]

1.Proteus软件中的51单片机和相应的器件库。

2.软件:

PC机操作系统Win98、Win2000或WinXP,KeilC51集成开发环境。

[实验原理]

IIC是2线接口,可用于最多127个外设的连接,总线具有仲裁功能,主机可以实现对总线上的器件单独读或者写操作。

读写速率为100k或400k。

[实验内容]

设计一个电路并用软件实现驱动。

该电路使用iic接口芯片AT24C02,使用8051向存储器的0地址写入一个数0x55,通过查看存储器内容的变化验证数据操作的正确性。

[实验步骤]

使用proteus设计如下硬件电路

使用的器件型号如下

和一个i2c协议分析器,

使用keilc51创建一个工程,命名为iic。

新建并添加主程序main.c到项目中。

#include

sbitSCL=P1^0;

sbitSDA=P1^1;

voidIICStart()

{

SCL=1;_nop_();

SDA=1;_nop_();

_nop_();

SDA=0;_nop_();

}

voidIICStop()

{

SCL=0;_nop_();

SDA=0;_nop_();

SCL=1;_nop_();

SDA=0;_nop_();

_nop_();

SDA=1;_nop_();

}

voidSlaveAck()

{unsignedchartime=255;

SCL=0;_nop_();

SDA=1;_nop_();//释放SDA线

SCL=1;_nop_();

//SCL=0;

while(SDA)

{time--;

if(time==0)

return;

}

_nop_();

SCL=0;_nop_();

}

voidMasterAck()

{

SCL=0;_nop_();

SDA=0;_nop_();//释放SDA线

SCL=1;_nop_();

SCL=0;_nop_();

}

voidMasterNAck()

{

SCL=0;_nop_();

SDA=1;_nop_();//释放SDA线

SCL=1;_nop_();

SCL=0;_nop_();

}

voidWriteByte(unsignedcharch)

{

chari;

SCL=0;

for(i=0;i<8;i++){

SDA=(bit)(ch&0x80);

ch<<=1;

SCL=1;_nop_();_nop_();//

SCL=0;_nop_();

}

}

unsignedcharReadByte()

{

chari;

unsignedchardat=0;

SCL=0;

for(i=0;i<8;i++)

{dat<<=1;

SCL=1;_nop_();_nop_();//

dat|=SDA;

SCL=0;_nop_();_nop_();//

}

returndat;

}

voidmain()

{

SCL=1;//初始化

SDA=1;

IICStart();

WriteByte(0xa0);//写从器件地址0xa0

SlaveAck();

WriteByte

(1);//

SlaveAck();

WriteByte(0x55);//

SlaveAck();

IICStop();

while

(1);

}

运行生成的hex文件,分析协议分析器的内容及含义,通过暂停proteus,用菜单

查看存储器中内容的变化,记录实验结果。

【思考与分析】

1.若要连续的向存储器中的0x20~0x35地址中写入15个数,如何实现,根据协议分析器分析实现的过程。

2.根据at24c02的手册,编写一段代码实现从存储器的0x0地址读取一个数,试着用代码实现并验证结果。

实验三上位机串口收发实验

[实验目的]

1.掌握串行口的工作原理

2.掌握串行口的上位机编程方法

3.了解虚拟串口软件的使用

[实验仪器]

PC机操作系统WinXP,VisualBasic6.0集成开发环境。

[实验原理]

PC通常在数据传输中充当上位机,可以通过串口实现和其他串口设备的通信。

VB通过MSCOMM控件可以对串口各种参数进行设置,并通过事件机制实现对串口数据的收发。

[实验内容]

使用VisualBasic6.0软件设计一个对话框界面,分别设置两个编辑框,一个作为发送数据端,一个作为接收数据端。

实现数据的串口通信。

[实验步骤]

1.检查一下电脑系统中是否有mscomm32.ocx文件,在系统C:

\WINDOWS\system32目录下,如果没有安装之(通过双击MSCOMM32压缩包里面的Setup.bat,运行前先解压)

2.安装虚拟串口软件,在电脑上虚拟出两个相互连接在一起的串口,实验中一个用于发送,另一个接收。

安装过程:

解压VSPD(虚拟串口).zip到当前目录,找到vspd.exe,双击运行,一直点next,直到Finish为止。

最后会出现提示注册的窗口,点击cancel。

然后用刚才解压目录下的两个文件覆盖C:

\ProgramFiles\EltimaSoftware\VirtualSerialPortDriver6.9目录下的相应的文件,然后点击桌面上的ConfigureVirtualSerialPortDriver快捷方式启动虚拟串口,见下图

然后点击添加端口按钮,界面变为如下图:

这时候系统就已经虚拟了两个串口,分别是串口2和串口3(注:

不同机器上串口号可能不一样),它们是交叉连接在一起的。

3,安装VB6精简版,一路next即可。

4.打开vb,见下图

点击打开,在左侧的工具栏上右击,见下图

选择部件,弹出窗口,按下图勾选

然后点击应用,这是VB的控件栏多了一个“电话”图标,这就是mscomm控件。

接下来向界面中添加控件,见下图

控件及其属性的设置见下表

控件类型

控件名称

控件的caption

Text属性

备注

Label

Label1

发送数据

Label

Label2

接收数据

Label

Label3

你的姓名+串口实验

TextBox

TextSend

Text1

TextBox

TextRecieve

Text2

CommandButton

Command1

发送

CommandButton

Command2

退出程序

窗口

Form1

MSComm

MSComm1

用于发送数据的串口

MSComm

MSComm2

用于接收数据的串口

双击窗口任意位置,打开代码编辑窗口

PrivateSubCommand1_Click()

MSComm1.Output=TextSend.Text

EndSub

PrivateSubCommand2_Click()

End

EndSub

PrivateSubForm_Load()

'当窗口加载时,初始化相关的控件

MSComm1.CommPort=2'设置串口2

MSComm1.Settings="9600,N,8,1"'波特率9600bps,无校验,8位数据,1位停止位

MSComm1.InputLen=0'读取接收缓冲区的所有字符

MSComm1.InBufferSize=1024'设置接收缓冲区为1024字节

MSComm1.OutBufferSize=512'设置发送缓冲区为512字节

MSComm1.PortOpen=True'打开串口

MSComm1.SThreshold=0'不触发发送事件

MSComm1.RThreshold=1'每一个字符到接收缓冲区都触发接收事件

MSComm1.InBufferCount=0'清除发送缓冲区数据

MSComm1.OutBufferCount=0'清除接收缓冲区数据

TextSend.Text=""'清空发送文本框

MSComm2.CommPort=3'设置串口3

MSComm2.Settings="9600,N,8,1"'波特率9600bps,无校验,8位数据,1位停止位

MSComm2.InputLen=0'读取接收缓冲区的所有字符

MSComm2.InBufferSize=1024'设置接收缓冲区为1024字节

MSComm2.OutBufferSize=512'设置发送缓冲区为512字节

MSComm2.PortOpen=True'打开串口

MSComm2.SThreshold=0'不触发发送事件

MSComm2.RThreshold=1'每一个字符到接收缓冲区都触发接收事件

MSComm2.InBufferCount=0'清除发送缓冲区数据

MSComm2.OutBufferCount=0'清除接收缓冲区数据

TextRecieve.Text=""'清空接收文本框

EndSub

PrivateSubMSComm2_OnCom

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1