计算机接口与通信
实验指导
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
机电工程学院电子信息工程教研室:李明
实验一 1-Wire和SPI总线接口实验
[实验目的]
1.熟悉Keil C51软件的基本使用
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
2.单总线协议和spi三线协议的软件模拟实现方法
3.掌握Proteus软件仿真8051硬件的基本操作方法
[实验仪器]
1.Proteus软件中的51单片机和相应的器件库。
2.软件:PC机操作系统Win98、Win2000或WinXP,Keil C51集成开发环境。
[实验原理]
DS18b20是单总线的温度采集器,通过18b20可以获取温度数值,经过相应的数值变换后在SPI总线驱动的Max7219及数码管上进行显示。
[实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
]
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
一个用ds18b20温度采集器的控制的和用max7219驱动的8段数码管显示电路系统。主控制器采用8051单片机。当18b20温度值发生变化时候能将温度值实时显示在数码管上。
[实验步骤]
使用proteus设计如下硬件电路
器件型号分别为:
使用keil 创建一个C51工程,命名为wendu。注:处理器使用ATMEL公司的AT89C51。
添加主程序(具体步骤若不熟悉,可以咨询老师或同学,因嵌入式实验中用到这些步骤,故此处省略)
//以下代码为DS18b20的相关代码,同学们根据手册认真分析代码的功能
sbit TMDAT=P1^7;
//控制线兼数据线
unsigned char Temp_Integer=0; //温度整数部分
unsigned char Temp_Decimal=0; //温度小数部分
unsigned char fg=0; //温度正负标志
//-------------------------------------------------------------------------------------
//函数名称:delayus
//入口参数:count
//函数功能:延时子程序
//-------------------------------------------------------------------------------------
void delayus(uint count)
{
uint i;
while(count--)
{
for(i=0;i<125;i++){}
}
}
//-------------------------------------------------------------------------------------
//函数名称:Reset_18B20
//入口参数:无
//函数功能:
//-------------------------------------------------------------------------------------
void Reset_18B20(void)
{
uint i;
TMDAT=0;
i=103;
while(i>0) i--; //大约900us
TMDAT=1;
i=4;
while(i>0) i--;
}
//-------------------------------------------------------------------------------------
//函数名称:Wait_18B20
//入口参数:无
//函数功能:等待DS18B20应答
//-------------------------------------------------------------------------------------
void Wait_18B20(void)
{
uint i;
while(TMDAT);
while(~TMDAT);
i=4;
while(i>0) i--;
}
//-------------------------------------------------------------------------------------
//函数名称:Readbit_18B20
//入口参数:无
//返回值: dat
//函数功能:在总线上读一位
//-------------------------------------------------------------------------------------
bit Readbit_18B20(void)
{
uint i=0;
bit dat=0;
TMDAT=0;i++;
TMDAT=1;i++;i++;
dat=TMDAT;
i=8;
while(i>0) i--;
return(dat);
}
//-------------------------------------------------------------------------------------
//函数名称:Readbyte_18B20
//入口参数:无
//返回值: dat
//函数功能:读一个字节
//-------------------------------------------------------------------------------------
unsigned char Readbyte_18B20(void)
{
uchar i=0,j=0,dat=0;
for(i=1;i<=8;i++)
{
j=Readbit_18B20();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
//-------------------------------------------------------------------------------------
//函数名称:Writebyte_18B20
//入口参数:dat
//函数功能:写命令
//-------------------------------------------------------------------------------------
void Writebyte_18B20(uchar dat)
{
uint i=0;
uchar j=0;
bit testb=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
//入口参数:无
//函数功能:开始转换
//-------------------------------------------------------------------------------------
void Start_Convert(void)
{
Reset_18B20();
Wait_18B20();
delayus(1);
Writebyte_18B20(0xcc);
Writebyte_18B20(0x44);
}
//-------------------------------------------------------------------------------------
//函数名称:Readbyte_18B20
//入口参数:无
//函数功能:读取温度值
//-------------------------------------------------------------------------------------
void Get_temp()
{
uchar H_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
*********************************************************************/
void Delay(uint delayusms)
{
uchar j;
uint i;
for(i=0;i
sbit SCL = P1^0;
sbit SDA = P1^1;
void IICStart()
{
SCL = 1; _nop_();
SDA = 1; _nop_();
_nop_();
SDA = 0; _nop_();
}
void IICStop()
{
SCL = 0; _nop_();
SDA = 0; _nop_();
SCL = 1;_nop_();
SDA = 0; _nop_();
_nop_();
SDA = 1; _nop_();
}
void SlaveAck()
{ unsigned char time=255;
SCL = 0; _nop_();
SDA = 1;_nop_(); //释放SDA线
SCL = 1; _nop_();
//
SCL = 0;
while(SDA)
{ time -- ;
if(time == 0)
return ;
}
_nop_();
SCL = 0;_nop_();
}
void MasterAck()
{
SCL = 0;_nop_();
SDA = 0;_nop_(); //释放SDA线
SCL = 1;_nop_();
SCL = 0;_nop_();
}
void MasterNAck()
{
SCL = 0;_nop_();
SDA = 1;_nop_(); //释放SDA线
SCL = 1;_nop_();
SCL = 0;_nop_();
}
void WriteByte(unsigned char ch)
{
char i;
SCL = 0;
for(i=0;i<8;i++){
SDA =(bit)(ch&0x80);
ch <<= 1;
SCL = 1;_nop_();_nop_(); //
SCL = 0;_nop_();
}
}
unsigned char ReadByte()
{
char i;
unsigned char dat=0;
SCL = 0;
for(i=0;i<8;i++)
{
dat <<=1;
SCL = 1; _nop_();_nop_();//
dat |= SDA ;
SCL = 0; _nop_();_nop_();//
}
return dat;
}
void main()
{
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,Visual Basic 6.0集成开发环境。
[实验原理]
PC通常在数据传输中充当上位机,可以通过串口实现和其他串口设备的通信。VB通过MSCOMM控件可以对串口各种参数进行设置,并通过事件机制实现对串口数据的收发。
[实验内容]
使用Visual Basic 6.0 软件设计一个对话框界面,分别设置两个编辑框,一个作为发送数据端,一个作为接收数据端。实现数据的串口通信。
[实验步骤]
1.检查一下电脑系统中是否有mscomm32.ocx文件,在系统C:\WINDOWS\system32目录下,如果没有安装之(通过双击MSCOMM32压缩包里面的Setup.bat,运行前先解压)
2.安装虚拟串口软件,在电脑上虚拟出两个相互连接在一起的串口,实验中一个用于发送,另一个接收。
安装过程:解压VSPD(虚拟串口).zip到当前目录,找到vspd.exe,双击运行,一直点next,直到Finish为止。最后会出现提示注册的窗口,点击cancel。然后用刚才解压目录下的两个文件覆盖C:\Program Files\Eltima Software\Virtual Serial Port Driver 6.9目录下的相应的文件,然后点击桌面上的Configure Virtual Serial Port Driver快捷方式启动虚拟串口,见下图
然后点击添加端口按钮,界面变为如下图:
这时候系统就已经虚拟了两个串口,分别是串口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
用于接收数据的串口
双击窗口任意位置,打开代码编辑窗口
Private Sub Command1_Click()
MSComm1.Output = TextSend.Text
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Form_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 = "" '清空接收文本框
End Sub
Private Sub MSComm2_OnComm()
Select Case MSComm2.CommEvent '检验串口事件
Case comEvReceive '接收缓冲区内有数据
TextRecieve.Text = MSComm2.Input '从接收队列中读入字符串
End Select
End Sub
保存并编译运行改程序,记录运行结果。
[思考与练习]
1.完善本程序的辅助功能,如:在接收框中设置显示多次接收的结果,即,如果发送两次a,则接收端显示两个a;设置一些控件,使串口、波特率、传输时候的参数可以由用户灵活设置。
2.借助于单片机技术和proteus,使用commpim器件将单片机的串口和VB串口连接起来,互发互收数据。