接口实验指导书Word文档下载推荐.docx
《接口实验指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《接口实验指导书Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
//函数名称:
delayus
//入口参数:
count
//函数功能:
延时子程序
voiddelayus(uintcount)
{
uinti;
while(count--)
{
for(i=0;
i<
125;
i++){}
}
}
Reset_18B20
无
voidReset_18B20(void)
TMDAT=0;
i=103;
while(i>
0)i--;
//大约900us
TMDAT=1;
i=4;
Wait_18B20
等待DS18B20应答
voidWait_18B20(void)
while(TMDAT);
while(~TMDAT);
Readbit_18B20
//返回值:
dat
在总线上读一位
bitReadbit_18B20(void)
uinti=0;
bitdat=0;
i++;
dat=TMDAT;
i=8;
return(dat);
Readbyte_18B20
读一个字节
unsignedcharReadbyte_18B20(void)
uchari=0,j=0,dat=0;
for(i=1;
=8;
i++)
j=Readbit_18B20();
dat=(j<
<
7)|(dat>
>
1);
Writebyte_18B20
dat
写命令
voidWritebyte_18B20(uchardat)
ucharj=0;
bittestb=0;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
if(testb)
//写1
i++;
while(i>
else
//写0
Start_Convert
开始转换
voidStart_Convert(void)
Reset_18B20();
Wait_18B20();
delayus
(1);
Writebyte_18B20(0xcc);
Writebyte_18B20(0x44);
读取温度值
voidGet_temp()
ucharH_18B20=0,L_18B20=0,y1=0,y2=0;
fg=0;
//初始化DS18B20
//跳过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<
Temp_Integer=H_18B20|L_18B20;
/*********************************************************************
*功能:
*说明:
形参delayusms=5000,时间延长大约为1s
*********************************************************************/
voidDelay(uintdelayusms)
ucharj;
delayusms;
for(j=0;
255;
j++);
//以下为max7219的代码,根据手册分析代码的作用
sbitSCK=P1^0;
sbitMOSI=P1^2;
sbitLOAD=P1^1;
voidWriteMax7219(unsignedcharaddr,unsignedchardat)
inti;
LOAD=0;
8;
SCK=0;
MOSI=(bit)(addr&
0x80);
SCK=1;
addr<
=1;
MOSI=(bit)(dat&
dat<
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接口实验
2.掌握IIC协议的软件模拟实现方法
IIC是2线接口,可用于最多127个外设的连接,总线具有仲裁功能,主机可以实现对总线上的器件单独读或者写操作。
读写速率为100k或400k。
设计一个电路并用软件实现驱动。
该电路使用iic接口芯片AT24C02,使用8051向存储器的0地址写入一个数0x55,通过查看存储器内容的变化验证数据操作的正确性。
使用的器件型号如下
和一个i2c协议分析器,
使用keilc51创建一个工程,命名为iic。
新建并添加主程序main.c到项目中。
#include<
intrins.h>
sbitSCL=P1^0;
sbitSDA=P1^1;
voidIICStart()
SCL=1;
_nop_();
SDA=1;
SDA=0;
voidIICStop()
SCL=0;
_nop_();
_nop_();
voidSlaveAck()
{unsignedchartime=255;
//释放SDA线
//SCL=0;
while(SDA)
{time--;
if(time==0)
return;
}
voidMasterAck()
SCL=0;
voidMasterNAck()
voidWriteByte(unsignedcharch)
chari;
i++){
SDA=(bit)(ch&
ch<
unsignedcharReadByte()
unsignedchardat=0;
{dat<
=1;
SCL=1;
//
dat|=SDA;
//
returndat;
//初始化
IICStart();
WriteByte(0xa0);
//写从器件地址0xa0
SlaveAck();
WriteByte
(1);
WriteByte(0x55);
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
发送数据
Label2
接收数据
Label3
你的姓名+串口实验
TextBox
TextSend
Text1
TextRecieve
Text2
CommandButton
Command1
发送
Command2
退出程序
窗口
Form1
MSComm
MSComm1
用于发送数据的串口
MSComm2
用于接收数据的串口
双击窗口任意位置,打开代码编辑窗口
PrivateSubCommand1_Click()
MSComm1.Output=TextSend.Text
EndSub
PrivateSubCommand2_Click()
End
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="
MSComm2.InputLen=0'
MSComm2.InBufferSize=1024'
MSComm2.OutBufferSize=512'
MSComm2.PortOpen=True'
MSComm2.SThreshold=0'
MSComm2.RThreshold=1'
MSComm2.InBufferCount=0'
MSComm2.OutBufferCount=0'
TextRecieve.Text="
清空接收文本框
PrivateSubMSComm2_OnCom