接口实验指导书.docx
《接口实验指导书.docx》由会员分享,可在线阅读,更多相关《接口实验指导书.docx(21页珍藏版)》请在冰豆网上搜索。
接口实验指导书
计算机接口与通信
实验指导书
机电工程学院电子信息工程教研室:
李明
实验一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;ifor(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