聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> 西华大学测控仪器设计实验报1

西华大学测控仪器设计实验报1

时间:    下载该word文档

西华大学实验报告

西华大学实验报告(理工类)

开课学院及实验室:机械学院机械工程专业实验中心实验时间2014515
学生所在学院实验项目名称
李尚霖

312011080602203


机械工程与自动化学院
测控仪器设计温度测量实验邓成中
年级/专业/2011级自动化2
6003579

一、实验目的
1、掌握一线温度传感器芯片DS18B20的使用方法,编程技巧。
二、实验要求
利用DS18B20,编写相关程序,将温度值在单片机实验装置LCD显示出来。
三、实验设备、仪器及材料
单片机实验温度测量单元、PC电脑一台
实验内容



1

西华大学实验报告

五、实验程序
#includeT89X52.h>//调用51单片机的头文件#include
//---------------------------------------//1602液晶相关I/O设置
sbitE=P2^3;//1602液晶的E脚接在P2.3口上sbitRW=P2^4;//1602液晶的RW脚接在P2.4口上sbitRS=P2^5;//1602液晶的RS脚接在P2.5口上//---------------------------------------sbitds18b20=P3^7;
2

西华大学实验报告
//---------------------------------------//1602液晶寄存器设置
unsignedcharDISbuf;//设置8位的unsigendchar型寄存器用来暂存1602要显示的内容//---------------------------------------unsignedchartemp1;unsignedchartemp2;
unsignedcharcodetable[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};
//---------------------------------------//延时函数
//---------------------------------------voidDelay(unsignedintnTimeDelay{
unsignedinti;while(nTimeDelay--for(i=0;i<125;i++;}
//---------------------------------------//复位DS18B20函数
//---------------------------------------bitReset(void{
unsignedinti;

bitk;
ds18b20=0;i=200;



//拉低DQ总线开始复位

//保持DQ低大约870uS,符合不低于48US的要求
while(i>0i--;ds18b20=1;

//保持DQ低大约870uS,符合不低于48US的要求//保持DQ低大约870uS,符合不低于48US的要求//拉高准备接收数据

3


西华大学实验报告
i=18;

//大约80uS//大约80uS//大约80uS//读出数据并保存
//维持约400US,符合总读时隙不低于480US的要求
while(i>0i--;k=ds18b20;i=91;





while(i>0i--;
//维持约400US,符合总读时隙不低于480US的要求//维持约400US,符合总读时隙不低于480US的要求
returnk;//k=0为复位成功,k=1为复位失败}
//---------------------------------------unsignedcharReadByte(void{
unsignedinti;
unsignedcharj,buf=0;for(j=0;j<8;j++{

buf=buf>>1;ds18b20=0;


//接收前,想将接收缓冲区右移//拉低

//接收8次还原一个字节数据
_nop_(;_nop_(;_nop_(;
_nop_(;

//维持2US,符合大于1US小于15US的规范//维持2US,符合大于1US小于15US的规范//维持2US,符合大于1US小于15US的规范
//维持2US,符合大于1US小于15US的规范
//拉高,为读数据做准备
ds18b20=1;

_nop_(;//维持6US,符合大于1US小于15US的规范
_nop_(;_nop_(;
_nop_(;
//维持6US,符合大于1US小于15US的规范//维持6US,符合大于1US小于15US的规范
//维持6US,符合大于1US小于15US的规范//维持6US,符合大于1US小于15US的规范
_nop_(;
_nop_(;

//维持6US,符合大于1US小于15US的规范

4

西华大学实验报告
_nop_(;
_nop_(;
//维持6US,符合大于1US小于15US的规范
//维持6US,符合大于1US小于15US的规范//维持6US,符合大于1US小于15US的规范
_nop_(;
_nop_(;_nop_(;
_nop_(;
//维持6US,符合大于1US小于15US的规范//维持6US,符合大于1US小于15US的规范
//维持6US,符合大于1US小于15US的规范
if(ds18b20==1buf|=0x80;//读出1位数据保存于bufi=12;



//维持约52US,符合总读时隙不低于60US的要求
while(i>0i--;
}
//维持约52US,符合总读时隙不低于60US的要求
//维持约52US,符合总读时隙不低于60US的要求
returnbuf;//退出的同时将接收缓冲区参数返回}
//---------------------------------------voidWriteByte(unsignedchardat{
unsignedinti;
unsignedcharj;for(j=0;j<8;j++{

if(dat&0x01

//如果写1
{
ds18b20=0;

//拉低
_nop_(;//维持2US,符合大于1US小于15US的规范_nop_(;//维持2US,符合大于1US小于15US的规范_nop_(;//维持2US,符合大于1US小于15US的规范

_nop_(;//维持2US,符合大于1US小于15US的规范

5

西华大学实验报告
ds18b20=1;i=14;


//拉高
//维持约63US,符合不低于60US的要求
while(i>0

}



i--;
//维持约63US,符合不低于60US的要求//维持约63US,符合不低于60US的要求
else//如果写0
{


ds18b20=0;




//拉低
//维持约63US,符合不低于60US的要求
i=14;
while(i>0
//维持约63US,符合不低于60US的要求//维持约63US,符合不低于60US的要求//拉高

i--;
ds18b20=1;
_nop_(;//维持2US,符合大于1US的规范_nop_(;//维持2US,符合大于1US的规范_nop_(;//维持2US,符合大于1US的规范

_nop_(;//维持2US,符合大于1US的规范
}}
//---------------------------------------bitConvert(void{
if(Reset(==0//复位DS18B20{


//写入跳过序列号命令字SkipRom//写入温度转换命令字ConvertT

6
}
dat=dat>>1;//写入字节右移1
WriteByte(0xcc;

WriteByte(0x44;


西华大学实验报告
}
return1;//启动温度转换成功}else{

return0;//启动温度转换失败}
//---------------------------------------voidReadFlash(void{
unsignedcharLsb,Msb;
if(Reset(==0//复位DS18B20
{
//写入跳过序列号命令字SkipRom
//写入读取数据令字ReadScratchpad
WriteByte(0xcc;WriteByte(0xbe;Lsb=ReadByte(;Msb=ReadByte(;
//读出第一个字节暂存于LSB
//读出第二个字节暂存于MSB//temp1内装温度参数的小数部分
temp1=Lsb&0x0f;
temp2=(Lsb>>4|(Msb<<4;//temp2内装温度参数的整数部分
}else{
temp1=0;



//如果复位失败,温度参数清零//如果复位失败,温度参数清零

temp2=0;}

}
7

西华大学实验报告
//---------------------------------------voidLCD1602_busy(void{
P0_7=1;//P0.71,为读状态做准备
RS=0;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入RW=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入E=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入while(P0_7==1;//P0.7读入1,表示1602液晶忙,需要等待E=0;//读完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_com(unsignedcharcombuf{
RS=0;//选择指令寄存器RW=0;//选择写状态
P0=combuf;//将命令字通过P0口送至DBE=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_com_busy(unsignedcharcombuf{
LCD1602_busy(;//调用忙检测函数LCD1602_Write_com(combuf;//调用忙检测函数}


8

西华大学实验报告

//---------------------------------------
voidLCD1602_Write_data_busy(unsignedchardatabuf{
LCD1602_busy(;//调用忙检测函数RS=1;//选择数据寄存器RW=0;//选择写状态
P0=databuf;//将命令字通过P0口送至DBE=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_address(unsignedcharx,unsignedchary{
x&=0x0f;//列地址限制在0-15y&=0x01;//行地址限制在0-1if(y==0//如果是第一行
LCD1602_Write_com_busy(x|0x80;//将列地址写入else//如果是第二行
LCD1602_Write_com_busy((x+0x40|0x80;//将列地址写入}
//---------------------------------------voidLCD1602_init(void{


9

西华大学实验报告
Delay(150;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay(50;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay(50;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08;//显示功能关,无光标LCD1602_Write_com_busy(0x01;//清屏
LCD1602_Write_com_busy(0x06;//写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C;//显示功能开,无光标}
//---------------------------------------
voidLCD1602_Disp(unsignedcharx,unsignedchary,unsignedcharbuf{
LCD1602_Write_address(x,y;//先将地址信息写入LCD1602_Write_data_busy(buf;//再写入要显示的数据}
//---------------------------------------//主函数
//---------------------------------------
voidmain(void//主函数,单片机开机后就是从这个函数开始运行{
LCD1602_init(;//调用1602液晶初始化函数
while(1//死循环,单片机初始化后,将一直运行这个死循环{


10

西华大学实验报告
if(Convert(==1

{

//启动转换
ReadFlash(;


//读取温度



if(temp2>99temp2=99;


if(temp1>15temp1=0;



LCD1602_Disp(0,0,temp2/10+'0';//温度整数部分十位
LCD1602_Disp(1,0,temp2%10+'0';//温度整数部分个位
LCD1602_Disp(2,0,'.';//.

LCD1602_Disp(3,0,table[temp1]+'0';//温度小数部分LCD1602_Disp(4,0,0xdf;//.LCD1602_Disp(5,0,0x43;//C







}
}}
六、结果分析




11

西华大学实验报告

西华大学实验报告(理工类)

开课学院及实验室:机械学院机械工程专业实验中心实验时间2014522
学生所在学院实验项目名称
李尚霖

312011080602203

机械工程与自动化学院
测控仪器设计
PC机与单片机串行通讯实验(1
邓成中
年级/专业/2011级自动化2
6003579

一、实验目的
掌握MCS51串行通讯的编程方法。
二、实验要求
熟悉MCS-51单片机串行口的各种功能。掌握串行通信的重要指标:字符帧和波特率的设定方法。会编
写单片机串行通信的程序。
三、实验内容
利用提供的PC机与MCS51串口通讯的程序,编写调MCS51程序,达到以下要求:
1在串口调试程序界面的发送数据栏中填写0009数字后,运行后,可以在单片机实验板上看见LCD上显示相同值的一位数字;
2同时,MCS51单片机将接受的数字发送给PC机,使串口通讯程序界面的接受区栏中出现与发送数据相同的数。
12

西华大学实验报告



13

西华大学实验报告
四、实验设备、仪器及材料
单片机实验板串口通讯单元、PC电脑一台
五、实验程序
#includeT89X52.h>//调用51单片机的头文件
//---------------------------------------//1602液晶相关I/O设置
sbitE=P2^3;//1602液晶的E脚接在P2.3口上sbitRW=P2^4;//1602液晶的RW脚接在P2.4口上sbitRS=P2^5;//1602液晶的RS脚接在P2.5口上//---------------------------------------
//---------------------------------------//串口接收寄存器设置
unsignedcharUSARTbuf;//设置8位的unsigendchar型寄存器用来暂存串口接收内容//---------------------------------------
//---------------------------------------//1602液晶寄存器设置
unsignedcharDISbuf;//设置8位的unsigendchar型寄存器用来暂存1602要显示的内容unsignedcharj;//设置8位的unsigendchar型寄存器用来暂存转换数据//---------------------------------------
//---------------------------------------//串口中断服务程序
//---------------------------------------voidUART_SER(voidinterrupt4{
if(RI==1//如果接收标志位为1,说明有数据接收完毕{//RCIF在寄存器被读出后自动清零
USARTbuf=SBUF;//将接收缓冲区内容转至USARTbuf寄存器中RI=0;//清除接收标志位
SBUF=USARTbuf;//将接收到的内容后发送出去while(!TI;//一直等到数据发送完毕}
if(TITI=0;//如果是发送引起的中断,清零}
//---------------------------------------//1602液晶用延时函数
//---------------------------------------voidDelay1602(unsignedintt{


14

西华大学实验报告
unsignedintk;//定义一个16位寄存器用来做延时用for(k=0;k//延时}
//---------------------------------------
voidLCD1602_busy(void{
P0_7=1;//P0.71,为读状态做准备
RS=0;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入RW=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入E=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入while(P0_7==1;//P0.7读入1,表示1602液晶忙,需要等待E=0;//读完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_com(unsignedcharcombuf{
RS=0;//选择指令寄存器RW=0;//选择写状态
P0=combuf;//将命令字通过P0口送至DB
E=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_com_busy(unsignedcharcombuf{
LCD1602_busy(;//调用忙检测函数LCD1602_Write_com(combuf;//调用忙检测函数}
//---------------------------------------
voidLCD1602_Write_data_busy(unsignedchardatabuf{
LCD1602_busy(;//调用忙检测函数RS=1;//选择数据寄存器RW=0;//选择写状态
P0=databuf;//将命令字通过P0口送至DB
E=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平


15

西华大学实验报告
}
//---------------------------------------
voidLCD1602_Write_address(unsignedcharx,unsignedchary{
x&=0x0f;//列地址限制在0-15y&=0x01;//行地址限制在0-1if(y==0//如果是第一行
LCD1602_Write_com_busy(x|0x80;//将列地址写入else//如果是第二行
LCD1602_Write_com_busy((x+0x40|0x80;//将列地址写入}
//---------------------------------------voidLCD1602_init(void{
Delay1602(1500;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay1602(500;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay1602(500;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08;//显示功能关,无光标LCD1602_Write_com_busy(0x01;//清屏
LCD1602_Write_com_busy(0x06;//写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C;//显示功能开,无光标}
//---------------------------------------
voidLCD1602_Disp(unsignedcharx,unsignedchary,unsignedcharbuf{
LCD1602_Write_address(x,y;//先将地址信息写入LCD1602_Write_data_busy(buf;//再写入要显示的数据}
//---------------------------------------
voidmain(void//主函数,单片机开机后就是从这个函数开始运行{
LCD1602_init(;//调用1602液晶初始化函数


16

西华大学实验报告
//*****USART串口初始化*****
TMOD&=0x0F;//TMOD4位清0
TMOD|=0x20;//TMODM1位置1,设置成自动装入的8位定时器TH1=0xFA;//设置波特率为9600TL1=0xFA;//设置波特率为9600
TR1=1;//启动定时器T1,作为串口波特率发生器
SCON=0x50;//10位异步收发,波特率由定时器控制,允许串口接收ES=1;//允许串口中断//**************************
//***开全局中断设置****
//串口接口UART设置了中断允许,此处要开全局中断EA=1;//开全局中断//*********************
while(1//死循环,单片机初始化后,将一直运行这个死循环{
//**1602显示寄存器赋值(0x00-0xFF**DISbuf=USARTbuf;////***********************************
//***1602液晶显示0x00-0xFF***
LCD1602_Disp(0,0,'0';//在第1行的第1列显示0LCD1602_Disp(1,0,'x';//在第1行的第2列显示x
j=DISbuf>>4;//把要显示内容的高4位移到低4位上
if(j<10//0-FASCII码中并不连续,所以要分开处理{
j+='0';//0-9的数据以0为基点进行偏移即可}else{
j=j-10+'A';//A-F的数据以A为基点进行偏移即可}
LCD1602_Disp(2,0,j;//在第1行的第3列显示高4位的十六进制数字j=DISbuf&0x0F;//把要显示内容的高4位屏蔽掉,保留低4if(j<10//0-FASCII码中并不连续,所以要分开处理{
j+='0';//0-9的数据以0为基点进行偏移即可}else{
j=j-10+'A';//A-F的数据以A为基点进行偏移即可}


17

西华大学实验报告
LCD1602_Disp(3,0,j;//在第1行的第4列显示低4位的十六进制数字//***********************
}}

六、结果分析



18

西华大学实验报告

西华大学实验报告(理工类)

开课学院及实验室:机械学院机械工程专业实验中心实验时间2014527
学生所在学院实验项目名称
李尚霖

312011080602203


机械工程与自动化学院
测控仪器设计
PC机与单片机串行通讯实验(2
邓成中
年级/专业/2011级自动化2
6003579

一、实验目的
掌握MCS51串行通讯的编程方法。
二、实验要求
VB(或其它高级语言编写上位机通讯界面与程序完成按键输入状态与LED灯显示控制

三、实验内容
利用提供的PC机与MCS51串口通讯的程序,编写调MCS51程序,用VS编写VB.NET串口通信程序达到以下要求:
1VB程序界面的发送数据栏中填写00FF16进制数字后,运行后,可以在单片机实验板上看LCD上显示相同值的数字;
2同时,MCS51单片机将接受的数字发送给PC机,使串口通讯程序界面的接受区栏中在灯12点亮的条件下出现与发送数据相同的数。


19

西华大学实验报告

四、实验设备、仪器及材料
单片机实验板串口通讯单元、PC电脑一台

五、实验程序
//c51程序
#include//调用51单片机的头文件
//---------------------------------------//1602液晶相关I/O设置
sbitE=P2^3;//1602液晶的E脚接在P2.3口上sbitRW=P2^4;//1602液晶的RW脚接在P2.4口上sbitRS=P2^5;//1602液晶的RS脚接在P2.5口上//---------------------------------------sbitLIGHT1=P3^1;sbitLIGHT2=P3^2;sbitBUZZER=P3^7;
//---------------------------------------//串口接收寄存器设置
unsignedcharUSARTbuf;//设置8位的unsigendchar型寄存器用来暂存串口接收内容//---------------------------------------
//---------------------------------------//1602液晶寄存器设置
unsignedcharDISbuf;//设置8位的unsigendchar型寄存器用来暂存1602要显示的内容
20

西华大学实验报告
unsignedcharj;//设置8位的unsigendchar型寄存器用来暂存转换数据//---------------------------------------
//---------------------------------------//串口中断服务程序
//---------------------------------------voidUART_SER(voidinterrupt4{
if(SBUF=='A'{
LIGHT1=1;BUZZER=0;}
if(SBUF=='B'{
LIGHT1=0;BUZZER=1;}
if(SBUF=='C'{
LIGHT2=1;BUZZER=0;}
if(SBUF=='D'{
LIGHT2=0;BUZZER=1;}
if(RI==1//如果接收标志位为1,说明有数据接收完毕{//RCIF在寄存器被读出后自动清零
USARTbuf=SBUF;//将接收缓冲区内容转至USARTbuf寄存器中RI=0;//清除接收标志位
SBUF=USARTbuf;//将接收到的内容后发送出去while(!TI;//一直等到数据发送完毕}
if(TITI=0;//如果是发送引起的中断,清零}
//---------------------------------------//1602延时函数
//---------------------------------------voidDelay1602(unsignedintt{
21

西华大学实验报告
unsignedintk;//定义一个16位寄存器用来做延时用for(k=0;k延时}
//---------------------------------------
voidLCD1602_busy(void{
P0_7=1;//P0.71,为读状态做准备
RS=0;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入RW=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入E=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入while(P0_7==1;//P0.7读入1,表示1602液晶忙,需要等待E=0;//读完以后,恢复E的电平}
//---------------------------------------voidLCD1602_Write_com(unsignedcharcombuf{
RS=0;//选择指令寄存器RW=0;//选择写状态
P0=combuf;//将命令字通过P0口送至DB
E=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_com_busy(unsignedcharcombuf{
LCD1602_busy(;//调用忙检测函数LCD1602_Write_com(combuf;//调用忙检测函数}
//---------------------------------------
voidLCD1602_Write_data_busy(unsignedchardatabuf{
LCD1602_busy(;//调用忙检测函数RS=1;//选择数据寄存器RW=0;//选择写状态
P0=databuf;//将命令字通过P0口送至DB
E=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------
voidLCD1602_Write_address(unsignedcharx,unsignedchary
22

西华大学实验报告
{
x&=0x0f;//列地址限制在0-15y&=0x01;//行地址限制在0-1if(y==0//如果是第一行
LCD1602_Write_com_busy(x|0x80;//将列地址写入else//如果是第二行
LCD1602_Write_com_busy((x+0x40|0x80;//将列地址写入}
//---------------------------------------voidLCD1602_init(void{
Delay1602(1500;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay1602(500;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay1602(500;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08;//显示功能关,无光标LCD1602_Write_com_busy(0x01;//清屏
LCD1602_Write_com_busy(0x06;//写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C;//显示功能开,无光标}
//---------------------------------------
voidLCD1602_Disp(unsignedcharx,unsignedchary,unsignedcharbuf{
LCD1602_Write_address(x,y;//先将地址信息写入LCD1602_Write_data_busy(buf;//再写入要显示的数据}
//---------------------------------------
voidmain(void//主函数,单片机开机后就是从这个函数开始运行{
LIGHT1=0;LIGHT2=0;BUZZER=1;
LCD1602_init(;//调用1602液晶初始化函数
//*****USART串口初始化*****
TMOD&=0x0F;//TMOD4位清0
TMOD|=0x20;//TMODM1位置1,设置成自动装入的8位定时器TH1=0xFA;//设置波特率为9600
23

西华大学实验报告
TL1=0xFA;//设置波特率为9600
TR1=1;//启动定时器T1,作为串口波特率发生器
SCON=0x50;//10位异步收发,波特率由定时器控制,允许串口接收ES=1;//允许串口中断//**************************
//***开全局中断设置****
//串口接口UART设置了中断允许,此处要开全局中断EA=1;//开全局中断//*********************
while(1//死循环,单片机初始化后,将一直运行这个死循环{
//**1602显示寄存器赋值(0x00-0x0F**DISbuf=USARTbuf;////***********************************
//***1602液晶显示0x00-0xFF***
LCD1602_Disp(0,0,'0';//在第1行的第1列显示0LCD1602_Disp(1,0,'x';//在第1行的第2列显示x
j=DISbuf>>4;//把要显示内容的高4位移到低4位上
if(j<10//0-FASCII码中并不连续,所以要分开处理{
j+='0';//0-9的数据以0为基点进行偏移即可}else{
j=j-10+'A';//A-F的数据以A为基点进行偏移即可}
LCD1602_Disp(2,0,j;//在第1行的第3列显示高4位的十六进制数字j=DISbuf&0x0F;//把要显示内容的高4位屏蔽掉,保留低4if(j<10//0-FASCII码中并不连续,所以要分开处理{
j+='0';//0-9的数据以0为基点进行偏移即可}else{
j=j-10+'A';//A-F的数据以A为基点进行偏移即可}
LCD1602_Disp(3,0,j;//在第1行的第4列显示低4位的十六进制数字//***********************
}}
24

西华大学实验报告
VB程序
OptionStrictOffOptionExplicitOn
ImportsVB=Microsoft.VisualBasicFriendClassmainFormInheritsSystem.Windows.Forms.Form'将数字(0,123...255,转换为16进制)传给单片机,单片机收到后回传这个数字,PC机接收到回传数据后显示出来,'若发送和接收的数据相同,显示通信正常,否则通信不正常'发送以00开始,以FF结束'定义变量
DimchoiseAsShort'选择指示灯号Dimdata,data1AsObject'串口初始化'在窗体的Load事件中加入下列代码对串口进行初始化:PrivateSubmainForm_Load(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesMyBase.Load
AxMSComm1.CommPort=2AxMSComm1.InputMode=1AxMSComm1.RThreshold=1AxMSComm1.SThreshold=1
AxMSComm1.Settings="9600,N,8,1"AxMSComm1.PortOpen=Truesenddata.Text="00"choise=1EndSub
'单击清空文本框
PrivateSubsenddata_Click(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlessenddata.Clicksenddata.Text=""
Cmdsend.Enabled=TrueEndSub
PrivateSubsenddata_TextChanged(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlessenddata.TextChangedsenddata.Text=UCase(senddata.TextEndSub
PrivateSubsenddata_KeyPress(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.Windows.Forms.KeyPressEventArgsHandlessenddata.KeyPressDimKeyAsciiAsShort=Asc(eventArgs.KeyChar
If(KeyAscii>=Asc("a"AndKeyAscii<=Asc("f"ThenKeyAscii=KeyAscii-32EndIf
eventArgs.KeyChar=Chr(KeyAsciiIfKeyAscii=0Then
eventArgs.Handled=True


25

西华大学实验报告
EndIfEndSub
'向单片机发送数据
PrivateSubCmdsend_Click(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesCmdsend.ClickDimbAsObjectDimaAsObjectDimcAsObject
IfLen(senddata.Text<>2Then
MsgBox("请输入216进制数!"ExitSubEndIf
c=senddata.Text
a=VB.Left(c,1'截取senddata左边字符b=VB.Right(c,1'截取senddata右边字符
data1="&H"&senddata.Text'data1没有将senddata中的字符拆开
data=Chr(CInt("&H"&a&Chr(CInt("&H"&b'senddata中的字符拆开存入data,这样就会解决例如A1接收不正确的问题AxMSComm1.Output=dataEndSub
'每发送一次指令,触发下面事件,返回数据串
PrivateSubAxMSComm1_OnComm(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesAxMSComm1.OnCommDimiAsObject
DimInbyte(AsByteDimbufferAsObject'读取仪表返回数据串
SelectCaseAxMSComm1.CommEvent
CaseMSCommLib.OnCommConstants.comEvReceiveInbyte=AxMSComm1.Input
Fori=LBound(InbyteToUBound(Inbytebuffer=buffer+Hex(Inbyte(iNexti
CaseMSCommLib.OnCommConstants.comEvSendEndSelect
IfLen(Trim(buffer=1Then
returndata.Text=Str(CDbl("0"&bufferElse
returndata.Text=bufferEndIf
If"&H"&buffer=data1Then
Label1.ForeColor=System.Drawing.ColorTranslator.FromOle(QBColor(13Label1.Text="通信正常!"


26

西华大学实验报告
EndIf
If"&H"&buffer<>data1Then
Label1.ForeColor=System.Drawing.ColorTranslator.FromOle(QBColor(12Label1.Text="通信不正常!"Label1.Text="未接收到数据"EndIf
IfTrim(buffer="FF"Then
Label1.ForeColor=System.Drawing.ColorTranslator.FromOle(QBColor(12Label1.Text="输入00重新开始!"EndIfEndSub'选择1号灯
PrivateSubOption1_CheckedChanged(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesOption1.CheckedChangedIfeventSender.CheckedThenchoise=1EndIfEndSub'选择2号灯
PrivateSubOption2_CheckedChanged(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesOption2.CheckedChangedIfeventSender.CheckedThenchoise=2EndIfEndSub'打开指示灯
PrivateSubCmdClose_Click(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesCmdOpen.ClickIfchoise=1Then
AxMSComm1.Output="B"Else
AxMSComm1.Output="D"EndIfEndSub'关闭指示灯
PrivateSubCmdOpen_Click(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesCmdClose.ClickIfchoise=1Then
AxMSComm1.Output="A"Else
AxMSComm1.Output="C"EndIfEndSub


27

西华大学实验报告
'当退出程序时,关闭串行口
PrivateSubCmdquit_Click(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesCmdquit.ClickMe.Close(EndSub
PrivateSubmainForm_FormClosing(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.Windows.Forms.FormClosingEventArgsHandlesMe.FormClosingDimCancelAsBoolean=eventArgs.Cancel
DimUnloadModeAsSystem.Windows.Forms.CloseReason=eventArgs.CloseReasonAxMSComm1.PortOpen=False'关闭串口eventArgs.Cancel=CancelEndSubEndClass
六、结果分析




28

西华大学实验报告

西华大学实验报告(理工类)

开课学院及实验室:机械学院机械工程专业实验中心实验时间201465
学生所在学院实验项目名称
李尚霖

312011080602203


机械工程与自动化学院
测控仪器设计
PC机与单片机串行通讯实验(3
邓成中
年级/专业/2011级自动化2
6003579

一、实验目的
掌握MCS51串行通讯的编程方法,会用VB编写通信程序。
二、实验要求
VB(或其它高级语言编写上位机通讯界面与程序完成实验板上温度传感器DS18B20的温度显示。

三、实验内容
利用DS18B20,编写相关程序,将温度值在单片机实验装置LCD显示出来。
利用提供的PC机与MCS51串口通讯的程序,编写调MCS51程序,用VS编写VB.NET串口通信程序,达到以下要求:
1程序运行后,可以在单片机实验板上看见LCD上显示传感器所测量的温度数值;
2同时,PC机通过串口通讯程序界面显示温度的当前值,平均值,最小、最大值,并绘出相应的温度变化曲线。



29

西华大学实验报告
四、实验设备、仪器及材料
单片机实验板串口通讯单元、PC电脑一台
五、实验程序//51c语言程序
#include#include
//1602液晶相关I/O设置
sbitE=P2^3;//1602液晶的E脚接在P2.3口上sbitRW=P2^4;//1602液晶的RW脚接在P2.4口上sbitRS=P2^5;//1602液晶的RS脚接在P2.5口上sbitDQ=P3^7;//DS18B20数据接口sbitkey=P1^0;
//1602液晶寄存器设置
unsignedcharDISbuf;//设置8位的unsigendchar型寄存器用来暂存1602要显示的内容//---------------------------------------unsignedchartemp1;unsignedchartemp2;
unsignedcharcodetable[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};voidDelay_ms(unsignedinti{
unsignedintj;for(;i>0;i--
for(j=0;j<333;j++{;}}
voidLCD1602_busy(void{
P0_7=1;//P0.71,为读状态做准备
RS=0;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入RW=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入E=1;//RS=0RW=1E=1时,忙信号输出到DB7,由P0.7读入while(P0_7==1;//P0.7读入1,表示1602液晶忙,需要等待E=0;//读完以后,恢复E的电平}
//---------------------------------------//1600写命令函数
//---------------------------------------
voidLCD1602_Write_com(unsignedcharcombuf{
RS=0;//选择指令寄存器


30

西华大学实验报告
RW=0;//选择写状态
P0=combuf;//将命令字通过P0口送至DB
E=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------//1602写命令函数(带忙检测//---------------------------------------
voidLCD1602_Write_com_busy(unsignedcharcombuf{
LCD1602_busy(;//调用忙检测函数LCD1602_Write_com(combuf;//调用忙检测函数}
//---------------------------------------//1602写数据函数(带忙检测//---------------------------------------
voidLCD1602_Write_data_busy(unsignedchardatabuf{
LCD1602_busy(;//调用忙检测函数RS=1;//选择数据寄存器RW=0;//选择写状态
P0=databuf;//将命令字通过P0口送至DB
E=1;//E高电平将命令字写入1602液晶E=0;//写完以后,恢复E的电平}
//---------------------------------------//1602液晶显示地址写函数//---------------------------------------
voidLCD1602_Write_address(unsignedcharx,unsignedchary{
x&=0x0f;//列地址限制在0-15y&=0x01;//行地址限制在0-1if(y==0//如果是第一行
LCD1602_Write_com_busy(x|0x80;//将列地址写入else//如果是第二行
LCD1602_Write_com_busy((x+0x40|0x80;//将列地址写入}
//---------------------------------------//1602液晶初始化函数
//---------------------------------------


31

西华大学实验报告
voidLCD1602_init(void{
Delay_ms(15;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay_ms(5;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示Delay_ms(5;//调用延时函数
LCD1602_Write_com(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38;//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08;//显示功能关,无光标LCD1602_Write_com_busy(0x01;//清屏
LCD1602_Write_com_busy(0x06;//写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C;//显示功能开,无光标}
voidLCD1602_Disp(unsignedcharx,unsignedchary,unsignedcharbuf{
LCD1602_Write_address(x,y;//先将地址信息写入LCD1602_Write_data_busy(buf;//再写入要显示的数据}voiddelay(unsignedint;//延时函数
voidDS18B20_init(void;//DS18B20初始化unsignedintget_temper(void;//读取温度程序voidDS18B20_write(unsignedcharin_data;//DS18B20写数据函数unsignedcharDS18B20_read(void;////读取数据程序unsignedinthtd(unsignedinta;//进制转换函数voiddisplay(unsignedinta;//显示函数floattemp;//温度寄存器bitDS18B20;//18B20存在标志,1---存在0---不存在voidmain(void{unsignedinta,temp;LCD1602_init(;
TMOD=0x20;//定时器1--方式2//PCON=0x80;//电源控制19200TL1=0xfd;
TH1=0xfd;//11.0592MHZ晶振,波特率为9600SCON=0x50;//方式1TR1=1;//启动定时


32

西华大学实验报告
temp=get_temper(;//这段程序用于避开刚上电时显示85的问题for(a=0;a<200;a++delay(500;while(1{temp=get_temper(;//测量温度for(a=0;a<100;a++//显示,兼有延时的作用if(temp2>99temp2=99;if(temp1>15temp1=0;LCD1602_Disp(0,0,temp2/10+'0';//温度整数部分十位LCD1602_Disp(1,0,temp2%10+'0';//温度整数部分个位LCD1602_Disp(2,0,'.';//.LCD1602_Disp(3,0,table[temp1]+'0';//温度小数部分LCD1602_Disp(4,0,0xdf;//.LCD1602_Disp(5,0,0x43;//CSBUF=(unsignedchar(temp>>8;//将温度发送给PCwhile(TI!=1;TI=0;//Delay_ms(5000;SBUF=(unsignedchartemp;while(TI!=1;TI=0;}}
/****************************DS18B20读取温度函数**************************//*函数原型:voidget_temper(void/*函数功能:DS18B20读取温度
/**********************************************************************/unsignedintget_temper(void{unsignedchark,T_sign,T_L,T_H,Lsb,Msb;DS18B20_init(;//DS18B20初始化if(DS18B20//判断DS1820是否存在?DS18B20不存在则返回{
DS18B20_write(0xcc;//跳过ROM匹配DS18B20_write(0x44;//发出温度转换命令DS18B20_init(;//DS18B20初始化if(DS18B20//判断DS1820是否存在?DS18B20不存在则返回{
DS18B20_write(0xcc;//跳过ROM匹配DS18B20_write(0xbe;//发出读温度命令


33

西华大学实验报告
T_L=DS18B20_read(;//数据读出T_H=DS18B20_read(;Lsb=T_L;Msb=T_H;temp1=Lsb&0x0f;//temp1内装温度参数的小数部分temp2=(Lsb>>4|(Msb<<4;//temp2内装温度参数的整数部分k=T_H&0xf8;if(k==0xf8
T_sign=1;//温度是负数else
T_sign=0;//温度是正数
T_H=T_H&0x07;
temp=(T_H*256+T_L*10*0.0625;//温度转换常数乘以10是因为要保留1位小数return(temp;}}}
/****************************DS18B20写数据函数**************************//*函数原型:voidDS18B20_write(ucharin_data/*函数功能:DS18B20写数据/*输入参数:要发送写入的数据/*输出参数:
/*调用模块:_cror_(
/**********************************************************************/
voidDS18B20_write(unsignedcharin_data//DS18B20的子程序(有具体的时序要求{
unsignedchari,out_data,k;out_data=in_data;
for(i=1;i<9;i++//串行发送数据{
DQ=0;DQ=1;_nop_(;_nop_(;
k=out_data&0x01;if(k==0x01//判断数据1{DQ=1;}else//0{DQ=0;


34

西华大学实验报告
}delay(4;//延时62usDQ=1;
out_data=_cror_(out_data,1;//循环左移1}}
/**************************DS18B20读函数**************************//*函数原型:voidDS18B20_read(/*函数功能:DS18B20读数据/*调用模块:delay(
/******************************************************************/unsignedcharDS18B20_read({
unsignedchari,in_data,k;in_data=0;
for(i=1;i<9;i++//串行发送数据{
DQ=0;DQ=1;_nop_(;_nop_(;
k=DQ;//DQif(k==1//读到的数据是1{in_data=in_data|0x01;}else{in_data=in_data|0x00;}delay(3;//延时51usDQ=1;in_data=_cror_(in_data,1;//循环右移1}
return(in_data;}
/**************************DS18B20初始化函数**************************//*函数原型:voidDS18B20_init(void/*函数功能:DS18B20初始化/*输入参数:/*输出参数:/*调用模块:delay(


35

西华大学实验报告
/******************************************************************/voidDS18B20_init(void{unsignedchara;
DQ=1;//主机发出复位低脉冲DQ=0;delay(44;//延时540USDQ=1;for(a=0;a<0x36&&DQ==1;a++{a++;a--;//等待DS18B20回应}if(DQDS18B20=0;//18B20不存在else{DS18B20=1;//18B20存在delay(120;//复位成功!延时240US}}
/*******************************延时函数*********************************//*函数原型:delay(unsignedintdelay_time/*函数功能:延时函数
/*输入参数:delay_time(输入要延时的时间
/**********************************************************************/voiddelay(unsignedintdelay_time//延时子程序{for(;delay_time>0;delay_time--{}}
VB程序
OptionStrictOffOptionExplicitOn
FriendClassMCUFormInheritsSystem.Windows.Forms.Form'程序功能:'接收单片机发送的温度值(16进制,2个字节),转换成10进制形式,以数字、曲线、表格的方式显'当温度大于等于50度,上限指示灯亮;当温度小于等于30度,下限指示灯亮(与单片机控制一致)Dimdatatemp(1000AsSingle'用于存储温度采样值DimnumAsShort'用于存储采样值个数


36

西华大学实验报告
'串口初始化'在窗体的Load事件中加入下列代码对串口进行初始化PrivateSubMCUForm_Load(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesMyBase.Load
AxMSComm1.CommPort=2AxMSComm1.InputMode=1
AxMSComm1.Settings="19200,N,8,1"'波特率19200AxMSComm1.PortOpen=TrueEndSub
'周期性读串口输入缓冲区数据
PrivateSubTimer1_Tick(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesTimer1.Tick
DimiAsObject
DimInbyte(AsByteDimbufferAsStringDimdatastr(20AsStringbuffer=""
Inbyte=AxMSComm1.Input
Fori=LBound(InbyteToUBound(Inbyte
buffer=buffer&Hex(Inbyte(i&Chr(32'获得单片机传送来的16进制数Nexti
'获得16进制每一位Fori=1To5
datastr(i=Mid(buffer,i,1Nexti
'16进制转换成10进制IfLen(Trim(buffer>2Then
Ifdatastr(2=""Anddatastr(4<>""Then
datatemp(num=(Val("&H"&"0"*(16^3+Val("&H"&datastr(1*(16^2+Val("&H"&datastr(3*(16^1+Val("&H"&datastr(4*(16^0*0.1EndIf
Ifdatastr(2=""Anddatastr(4=""Then
datatemp(num=(Val("&H"&"0"*(16^3+Val("&H"&datastr(1*(16^2+Val("&H"&"0"*(16^1+Val("&H"&datastr(3*(16^0*0.1EndIf
Ifdatastr(3=""Anddatastr(5<>""Then
datatemp(num=(Val("&H"&datastr(1*(16^3+Val("&H"&datastr(2*(16^2+Val("&H"&datastr(4*(16^1+Val("&H"&datastr(5*(16^0*0.1EndIf
Ifdatastr(3=""Anddatastr(5=""Then
datatemp(num=(Val("&H"&datastr(1*(16^3+Val("&H"&datastr(2*(16^2+Val("&H"&"0"*(16^1+Val("&H"&datastr(4*(16^0*0.1EndIf


37

西华大学实验报告
ElseIfLen(Trim(buffer=2Then
datatemp(num=(Val("&H"&"0"*(16^3+Val("&H"&"0"*(16^2+Val("&H"&datastr(1*(16^1+Val("&H"&datastr(2*(16^0*0.1ElseIfLen(Trim(buffer=1Then
datatemp(num=(Val("&H"&"0"*(16^3+Val("&H"&"0"*(16^2+Val("&H"&"0"*(16^1+Val("&H"&datastr(1*(16^0*0.1EndIf
Ifdatatemp(num<>0Then
TempText.Text=VB6.Format(datatemp(num,"0.0"'10进制显示,保留一位小数num=num+1'采集个数
Callcal('调用计算极值、平均值子程序Calldraw('调用绘曲线过程EndIfEndSub
'计算极值、平均值Subcal(
DimaverAsObjectDimiAsObjectDimMinAsObjectDimMaxAsObjectDimSumAsObjectOnErrorGoTohhSum=0
Max=datatemp(0Min=Max
Fori=0Tonum-1
Ifdatatemp(i>=MaxThenMax=datatemp(iIfdatatemp(i<=MinThenMin=datatemp(iSum=Sum+datatemp(iNexti
aver=Sum/num
MaxText.Text=VB6.Format(Max,"0.0"MinText.Text=VB6.Format(Min,"0.0"AverText.Text=VB6.Format(aver,"0.0"hh:ExitSubEndSub
'绘制温度实时变化曲线Subdraw(
DimY2AsSingleDimX2AsSingleDimY1AsSingleDimX1AsSingleDimiAsInteger
DimmypenAsNewPen(Color.Black,1


38

西华大学实验报告
DimmygraphAsGraphics
mygraph=Me.Picture1.CreateGraphicsmygraph.PageUnit=GraphicsUnit.Pixel
mygraph.TranslateTransform(0,Picture1.HeightFori=1Tonum-1X1=(i-1
Y1=datatemp(i-1X2=i
Y2=datatemp(i
mygraph.DrawLine(mypen,X1*Picture1.Width/200,-Y1*Picture1.Height/100,X2*Picture1.Width/200,-Y2*Picture1.Height/100NextiEndSub
'当退出程序时,关闭串行口
PrivateSubCmdquit_Click(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.EventArgsHandlesCmdquit.ClickMe.Close(EndSub
PrivateSubMCUForm_FormClosing(ByValeventSenderAsSystem.Object,ByValeventArgsAsSystem.Windows.Forms.FormClosingEventArgsHandlesMe.FormClosingDimCancelAsBoolean=eventArgs.Cancel
DimUnloadModeAsSystem.Windows.Forms.CloseReason=eventArgs.CloseReasonAxMSComm1.PortOpen=False'关闭串口eventArgs.Cancel=CancelEndSub
PrivateSubFrame1_Enter(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgsHandlesFrame1.Enter
EndSubEndClass
六、结果分析

39

免费下载 Word文档免费下载: 西华大学测控仪器设计实验报1

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服