西华大学测控仪器设计实验报告.docx
- 文档编号:16655398
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:40
- 大小:129.26KB
西华大学测控仪器设计实验报告.docx
《西华大学测控仪器设计实验报告.docx》由会员分享,可在线阅读,更多相关《西华大学测控仪器设计实验报告.docx(40页珍藏版)》请在冰点文库上搜索。
西华大学测控仪器设计实验报告
第组
西华大学实验报告(理工类)
开课学院及实验室:
实验时间:
年月日
学生姓名
学号
成绩
学生所在学院
年级/专业/班
课程名称
课程代码
实验项目名称
温度测量实验
项目代码
指导教师
项目学分
一、实验目的
二、实验内容
三、实验原理图
四、实验设备、仪器及材料
五、实验程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#definedelay4us()
{_nop_();_nop_();_nop_();_nop_();}//12MHZ系统频率下,延时4us
sbitDQ=P2^7;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharcodeTemp_Disp_Title[]={"CurrentTemp:
"};//1602液晶第一行显示内容
ucharCurrent_Temp_Display_Buffer[]={"TEMP:
"};//1602液晶第二行显示内容
ucharcodedf_Table[]=
{0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
//温度小数位对照表
ucharCurrentT=0;//当前读取的温度整数部分
ucharTemp_Value[]={0x00,0x00};
//从DS18B20读取的温度值
ucharDisplay_Digit[]={0,0,0,0};
//待显示的各温度数位
bitDS18B20_IS_OK=1;
//DS18B20正常标志
voidDelayXus(uintx)//延时1
{
uchari;
while(x--)
{
for(i=0;i<200;i++);
}
}
bitLCD_Busy_Check()
//LCD忙标志,返回值为1602LCD的忙标志位,为1表示忙
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delay4us();
result=(bit)(P0&0x80);
LCD_EN=0;
returnresult;
}
voidWrite_LCD_Command(ucharcmd)//1602LCD写指令函数
{
while(LCD_Busy_Check());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delay4us();
LCD_EN=1;
delay4us();
LCD_EN=0;
}
voidWrite_LCD_Data(uchardat)//1602LCD写数据函数
{
while(LCD_Busy_Check());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delay4us();
LCD_EN=1;
delay4us();
LCD_EN=0;
}
voidLCD_Initialise()//1602LCD初始化
{
Write_LCD_Command(0x01);
DelayXus(5);
Write_LCD_Command(0x38);
DelayXus(5);
Write_LCD_Command(0x0c);
DelayXus(5);
Write_LCD_Command(0x06);
DelayXus(5);
}
voidSet_LCD_POS(ucharpos)//1602LCD设置显示位置
{
Write_LCD_Command(pos|0x80);
}
voidDelay(uintx)//延时2
{
while(x--);
}
ucharInit_DS18B20()
//初始化DS18B20
{
ucharstatus;
DQ=1;
Delay(8);
DQ=0;
Delay(90);
DQ=1;
Delay(8);
status=DQ;Delay(100);
DQ=1;
returnstatus;
}
ucharReadOneByte()
//从DS18B20读一字节数据
{
uchari,dat=0;
DQ=1;
_nop_();
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)
dat|=0X80;
Delay(30);
DQ=1;
}
returndat;
}
voidWriteOneByte(uchardat)
//从DS18B20写一字节数据
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
voidRead_Temperature()
//从DS18B20读取温度值
{
if(Init_DS18B20()==1)//DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);//跳过序列号命令
WriteOneByte(0x44);//启动温度转换命令
Init_DS18B20();//复位DS18B20(每一次读写之前都要对DS18B20进行复位操作)
WriteOneByte(0xcc);//跳过序列号命令
WriteOneByte(0xbe);//读取温度寄存器
Temp_Value[0]=ReadOneByte();//读取温度低8位(先读低字节,再读高字节,)
Temp_Value[1]=ReadOneByte();//读取温度高8位(每次只能读一个字节)
DS18B20_IS_OK=1;//DS18B20正常
}
}
voidDisplay_Temperature()
//在1602LCD上显示当前温度
{
uchari;
uchart=150,ng=0;//延时值与负数标志
if((Temp_Value[1]&0xf8)==0xf8)//高字节高5位如果全为1,则为负数,为负数时取反
{
//加1,并设置负数标志为1
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
//若低字节进位,则高字节加1
Temp_Value[1]++;
ng=1;//设置负数标志为1
}
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];//查表得到温度小数部分
//获取温度整数部分(低字节低4位清零,高4位右移4位)+(高字节高5位清零,
//低三位左移4位)
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
//将温度整数部分分解为3位待显示数字
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
//刷新LCD缓冲,加字符0是为了将待数字转化为字符显示
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';
if(Display_Digit[3]==0)//高位为0时不显示
Current_Temp_Display_Buffer[7]='';
if(Display_Digit[2]==0&&Display_Digit[3]==0)//高位为0,且次高位为0,则次高位不显示
Current_Temp_Display_Buffer[8]='';
//负号显示在恰当位置
if(ng)
{if(Current_Temp_Display_Buffer[8]=='')
Current_Temp_Display_Buffer[8]='-';
elseif(Current_Temp_Display_Buffer[7]=='')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
Set_LCD_POS(0x00);//第一行显示标题
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_LCD_POS(0x40);//第二行显示当前温度
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//显示温度符号
Set_LCD_POS(0x4d);
Write_LCD_Data(0xdf);
Set_LCD_POS(0x4e);
Write_LCD_Data('C');
}
voidmain()//主函数
{
LCD_Initialise();
Read_Temperature();
Delay(50000);
Delay(50000);
while
(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
DelayXus(100);
}
}
六、实验结果分析及问题讨论
仿真结果:
温度为11℃时:
温度为-6℃时:
七、附录
第组
西华大学实验报告(理工类)
开课学院及实验室:
实验时间:
年月日
学生姓名
学号
成绩
学生所在学院
年级/专业/班
课程名称
课程代码
实验项目名称
PC机与单片机串行通讯实验
(1)
项目代码
指导教师
项目学分
一、实验目的
二、实验内容
三、实验原理图
四、实验设备、仪器及材料
五、实验程序
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharReceive_Buffer[101];
ucharBuf_Index=0;
ucharcodeDSY_CODE[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
voidDelay(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
voidmain()
{
uchari;
P0=0x00;//初始化数码管灭
Receive_Buffer[0]=i;//0
SCON=0x50;//8位异步收发,波特率可变(由定时器控制)1位起始位,8位数据位,1位终止位
TMOD=0x20;//工作方式寄存器方式2,8位的常数自动重新装载的定时器
PCON=0x00;//方式1的波特率smod=0;=(2^smod)*T1的溢出率/32;
TH1=0xfd;
TL1=0xfd;//波特率9600bit/s
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//中断0为跳沿触发方式在TCON时序控制器中
ES=1;//串行口中断
IP=0x01;//中断优先级外部中断0优先于串行口
TR1=1;//启动定时器1
while
(1)
{
for(i=0;i<100;i++)
{
if(Receive_Buffer[i]==-1)
break;//没重新接收数据的就不显示P0=DSY_CODE[Receive_Buffer[i]];
//依次显示接收到的数据
Delay(200);//每个数据显示2ms
}
Delay(200);
}
}
voidSerial_INT()interrupt4//接收
{
ucharc;
if(RI==0)
return;
ES=0;
RI=0;
c=SBUF;
if(c>='0'&&c<='9')
{Receive_Buffer[Buf_Index]=c-'0';
//接收的数据依次放到数组Receive_Buffer
Receive_Buffer[Buf_Index+1]=-1;
//接收的最后一位数组元素置-1.做标志
Buf_Index=(Buf_Index+1)%100;
//100时变成1平常加1,一百个接收完了,数组存满了,从头开始
}
ES=1;
}
voidEX_INT0()interrupt0
{
uchar*s=("XihuaUniversity");
uchari=0;
while(s[i]!
='\0')
{
SBUF=s[i];
while(TI==0);
TI=0;
i++;
}
}
六、实验结果分析及问题讨论
仿真结果:
当串口调试助手通过串口COM4发送数字7时,Proteus里的Compim器件便通过串口COM3接收到,使数码管显示为7,同时虚拟终端也可以显示接收到的数字7。
反之,当按下Proteus里的Button时,Compim器件便通过串口COM3将字符’XihuaUniversity’发送到串口调试助手中,同时另一个虚拟终端也可以显示发送出的字符’XihuaUniversity’,仿真图如下:
七、附录
第组
西华大学实验报告(理工类)
开课学院及实验室:
实验时间:
年月日
学生姓名
学号
成绩
学生所在学院
年级/专业/班
课程名称
课程代码
实验项目名称
PC机与单片机串行通讯实验
(2)
项目代码
指导教师
项目学分
一、实验目的
二、实验内容
三、实验原理图
四、实验设备、仪器及材料
五、实验程序
89C52程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharReceive_Buffer[101];
ucharBuf_Index=0;
ucharcodeDSY_CODE[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
voidDelay(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
voidmain()
{
uchari;
P0=0x00;//初始化数码管灭
Receive_Buffer[0]=i;//0
SCON=0x50;//8位异步收发,波特率可变(由定时器控制)1位起始位,8位数据位,1位终止位
TMOD=0x20;//工作方式寄存器方式2,8位的常数自动重新装载的定时器
PCON=0x00;//方式1的波特率smod=0;=(2^smod)*T1的溢出率/32;
TH1=0xfd;
TL1=0xfd;//波特率9600bit/s
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//中断0为跳沿触发方式在TCON时序控制器中
ES=1;//串行口中断
IP=0x01;//中断优先级外部中断0优先于串行口
TR1=1;//启动定时器1
while
(1)
{
for(i=0;i<100;i++)
{
if(Receive_Buffer[i]==-1)
break;//没重新接收数据的就不显示P0=DSY_CODE[Receive_Buffer[i]];
//依次显示接收到的数据
Delay(200);//每个数据显示2ms
}
Delay(200);
}
}
voidSerial_INT()interrupt4//接收
{
ucharc;
if(RI==0)
return;
ES=0;
RI=0;
c=SBUF;
if(c>='0'&&c<='9')
{Receive_Buffer[Buf_Index]=c-'0';
//接收的数据依次放到数组Receive_Buffer
Receive_Buffer[Buf_Index+1]=-1;
//接收的最后一位数组元素置-1.做标志
Buf_Index=(Buf_Index+1)%100;
//100时变成1平常加1,一百个接收完了,数组存满了,从头开始
}
ES=1;
}
voidEX_INT0()interrupt0
{
uchar*s=("XihuaUniversity");
uchari=0;
while(s[i]!
='\0')
{
SBUF=s[i];
while(TI==0);
TI=0;
i++;
}
}
VB程序:
PrivateSubCommand1_Click()
Text1.Text=""
Text1.SetFocus
EndSub
PrivateSubCommand2_Click()
Text2.Text=""
Text2.SetFocus
EndSub
PrivateSubCommand3_Click()
DimxAsString
IfText1.Text=""Then
x=MsgBox("发送数据不能为空",16)
ExitSub
EndIf
IfNotMSComm1.PortOpenThen
MSComm1.PortOpen=True
EndIf
MSComm1.Output=Text1.Text+Chr(13)'发送数据
Fori=1To2000000'延时
Next
EndSub
PrivateSubForm_Load()
MSComm1.CommPort=4'设置串口4
MSComm1.Settings="9600,n,8,1"'波特率9600bit/s,无校验,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'清除接收区的缓冲区数据
Text1.Text=""
Text2.Text=""
EndSub
PrivateSubMSComm1_OnComm()
SelectCaseMSComm1.CommEvent'检验串口事件
'错误处理
CasecomEventOverrun'数据丢失
Text1.Text=""
Text2.Text=""
Text1.SetFocus
ExitSub
CasecomEventTxFull'发送缓冲区已满
Text1.Text=""
Text2.Text=""
Text1.SetFocus
ExitSub
CasecomEvReceive'接收缓冲区有数据
DimstrAsString
str=MSComm1.Input
Text2.Text=Text2.Text+str
EndSelect
EndSub
六、实验结果分析及问题讨论
仿真结果:
当VB中的MSComm1控件通过串口COM4发送数字6时,Proteus里的Compim器件便通过串口COM3接收到,使数码管显示为6,同时虚拟终端也可以显示接收到的数字6。
反之,当按下Proteus里的Button时,Compim器件便通过串口COM3将字符’XihuaUniversity’发送到VB中的MSComm1控件中,同时另一个虚拟终端也可以显示发送出的字符’XihuaUniversit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西华 大学 测控 仪器 设计 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)