接口实验指导书.docx
- 文档编号:6621649
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:21
- 大小:271.77KB
接口实验指导书.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;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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 接口 实验 指导书