测控技术实验报告.docx
《测控技术实验报告.docx》由会员分享,可在线阅读,更多相关《测控技术实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
测控技术实验报告
实验一单片机程序设计基础
1.实验设备
硬件使用的是单片机SS-8051高级单片机实验仪,软件使用的是Keiluv2软件开发环境。
2.实验目的
熟悉单片机的调试环境与指令系统
3.实验内容
自编一个汇编小程序,使用Keiluv2软件开发环境,进行编译、调试、运行程序。
Keiluv2操作流程的简单说明:
1.NEWPROJECT↙,建一个新的项目,取项目名并存于F:
盘下(最好在F盘下建一个自己的文件夹)。
在出现的对话框中选Atmel/AT89c51芯片型号;或者可以从File/devicesdatabase的对话框中选择芯片型号。
2.FILE/NEW↙,建立一个新文件,在打开的窗口下输入程序,取文件名并存盘。
3.选中SourceGroup1点击鼠标右键,在出现的菜单中选中AddFilestoGroup`SourceGroup1`,将文件加入到项目中。
4.选中Target1点击鼠标右键,在出现的菜单中选中OptionsforTarget`Target1`:
●在出现的对话框中打开output项的对话框,选中`GreatHEXFile`,以保证编译时能生成.HEX文件,为后续下载程序做准备。
●在出现的对话框中打开debug项的对话框,选中`Use`,选Keilmonitor51driver。
选人、Runtomain()。
5.Project/Buildtarget或Rebuildalltargetfiles,编译所输入的程序,检查语法错误,更改错误直至无错为止。
6.Debug/‘Start/StopDebugSession’↙,开始调试程序,检查逻辑错误。
4.实验过程
程序:
ORG00H
MOVA,3AH
ADDA,01H
END
运算结果:
3BH
1.新建工程,选取8051芯片如下图
2.新建文件,存盘并加入项目中。
如下
3.选中Target1点击鼠标右键,在出现的菜单中选中OptionsforTarget`Target1`:
4.调试程序直至无错为止。
实验二51单片机的串行通信实验
一.实验内容
连线并编制程序,完成单片机与PC机通信的功能。
二.实验目的
1.了解单片机串口通信的基本功能;
2.了解单片机与PC机串口通信的硬件接口电路;
3.学会单片机和PC机串口程序的编制和调试。
三.实验电路
四.常用的各种波特率设置表
波特率
振荡频率
SMOD
TIMER
C/T
模式
自动装入
4800
12M
1
0
2
0F3H
2400
12M
0
0
2
0F3H
1200
12M
1
0
2
0F6H
19200
11.0592M
1
0
2
0FDH
9600
11.0592M
0
0
2
0FDH
4800
11.0592M
0
0
2
0FAH
2400
11.0592M
0
0
2
0F4H
1200
11.0592M
0
0
2
0E8H
五.实验程序
实验三V/F转换电路实验
1、实验内容
V/F转换电路的调试。
2、实验要求
1、在了解LM331工作原理(转换原理)的基础上,考虑以下几个问题:
输入电压范围;输出频率范围;输入和输出间的对应关系。
2、调试电路,直至V/F转换器可以正确输出波形。
如果V/F转换器没有输出或输出波形不理想,请分析查找原因,并将波形调至等占空比。
3、用示波器、频率计等工具观察V/F转换器的输出波形,观察定标调整环节W1,W2和W3对波形的影响。
4、通过实测数据分析V/F转换器的线性,画出实际的V、F对应关系。
3、实验电路图
实验四V/F转换的数据采集
一.实验内容
连线并编制程序:
使用定时器和计数器完成LM331脉冲输出信号的采集功能,对采集的数据进行处理,最终得到频率值。
二.实验目的
定时器中断的使用;
学习定时器中断间隔时间的计算;
掌握计数器的使用方法;
学习中断处理程序的编程方法。
三.原理简述
1.定时器/计数器的输入脉冲周期与机器周期一样,为振荡器频率的1/12。
本实验中时钟频率为12M,现要采用中断方法来实现1秒延时,要在定时器1中设置一个时间常数,使其每隔0.05秒产生一次中断,CPU响应中断后R0中计数值减一,令(R0)=14H,即可实现1秒的延时,
时间常数可按下法确定:
机器周期=12/晶振频率=12/12=1uS
定时器需设初值为X,则(2^16—X)*1=50000uS
求出X=15536
化为十六进制:
X=3CB0H,故初始值为:
TH1=3CH,TL1=B0H。
2.初始化程序
包括定时器初始化和中断系统初始化,主要对IP,IE,TCON,TMOD的相应位进行正确的设置,并将时间常数送入定时器中。
由于只有定时器中断,IP不必设置。
注意一点:
定时器1初始化时建议用如下的指令:
ANLTMOD,#0FH
ORLTMOD,#10H
3.设计中断服务程序和主程序
中断服务程序除了要完成计数减1工作外,还要将时间常数重新送入定时器中,为下一次中断做准备。
主程序则对计数器的数值进行处理,转换成频率值。
四.实验程序
#include
#include
intf,f0;
voidmain()
{
TMOD=0X51;//T1是计数器且工作在方式2下8位计数器,T0是定时器且工作在方式1下16位定时器
TH0=0X9E;//定时器T0高八位初值X16位
TL0=0X58;//定时器TO低八位初值X16位
TH1=0X00;//计数器高八位初值
TL1=0X00;//计数器低八位初值
ET0=1;//打开定时器T0的运行开关
EA=1;//开总中断
TR0=1;//开定时器0
TR1=1;//开定时器1
while
(1);//死循环
}
voidtime1()interrupt1using2
{
EA=0;//关总中断
TR0=0;//关定时器0
TR1=0;//关计数器1
f=TL1+TH1*256;//把数字构成16位的
f0=f*2;//频率的计算公式
TMOD=0X51;//01010001T1是计数器且工作在方式2下8位计数器,T0是定时器且工作在方式1下16位定时器
TH0=0X9E;//定时器T0高八位初值X16位
TL0=0X58;//定时器TO低八位初值X16位
TH1=0X00;//计数器高八位初值
TL1=0X00;//计数器低八位初值
ET0=1;////打开定时器T0的运行开关
EA=1;//开总中断
TR0=1;//开定时器0
TR1=1;//开计数器1
}
实验五7279键盘显示控制实验
一.实验题目
连线并编制程序,将HD7279A的全部编码送HD7279A显示,以一秒钟为间隔显示下一位,以前的显示内容左移。
二.实验目的
1.了解HD7279A键盘显示芯片的基本应用;
2.掌握HD7279A键盘显示芯片的接口电路及编程方法。
三.原理简述
1.HD7279A是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。
2.HD7279A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式,此外还有多种控制命令,如消隐、闪烁、左移、右移、段寻址等。
命令的具体形式可查阅HD7279A相关的技术资料。
四.实验电路
注意:
另外,在实验之前,应将8单元的U7(7406)和U6(74LS245)芯片取下,因7279已经有直接驱动数码管的能力,如果另外放置驱动芯片,反而会影响数码管的显示效果。
五.实验程序
//程序清单(C51):
#include//调用C51的头文件
#include
typedefunsignedcharByte;/*在程序中用BYTE代替unsignedchar了,这只是为了编写代码的方便而已!
BYTE在这里还是一个类型,并不是一个变量,里面没有存储东西。
*/
bdataByteBIT_COUNT,TIMER,TIMER1,TEN,DATA_IN,DATA_OUT,AA,BB;/*位变量BIT_COUNT,TIMER,TIMER1,TEN,DATA_IN,DATA_OUT,AA,BB被定义为bdata存储类型,编译时编译器将把该变量定位在51单片机片内数据存储区(RAM)中的位寻址区(地址:
20H----2FH)*/
sbitdata_in0=DATA_IN^0;//定义IN口第0位为data_in0
sbitdata_out7=DATA_OUT^7;//定义out口第7位为data_out7
sbitDAT=P1^2;/*HD7279A的DATA连接于P1.2*/
sbitKEY=P1^3;/*HD7279A的KEY连接于P1.3*/
sbitCS=P1^4;/*HD7279A的CS连接于P1.4*/
sbitCLK=P1^5;/*HD7279A的CLK连接于P1.5*/
voidSEND(void);//调用SEND(void)函数
voidLONG_DELAY(void);//调用LONG_DELAY(void)函数
voidSHORT_DELAY(void);//调用SHORT_DELAY(void)函数
voidRECEIVE(void);//调用RECEIVE(void)函数
voidmain(void)//定义主函数
{
START:
_nop_();/*空操作,就是不进行任何操作的延时,作用一般就是用作延时用*/
P1=0xDB;/*11011011处于无效状态*/;
TIMER=50;/*计时器初值*/
START_DELAY:
TIMER1=255;/*开延时*/
START_DELAY1:
TIMER1--;/*开延时*/
if(TIMER1>0)//如果TIMER1>0
gotoSTART_DELAY1;//跳至START_DELAY1
TIMER--;//计时器自减1
if(TIMER>0)//判断计时器的值是否大于0,使进START_DELAY
gotoSTART_DELAY;
DATA_OUT=0xA4;
SEND();/*发送*/
CS=1;/*片选无效*/
MAIN1:
if(KEY==1)
gotoMAIN1;/*键没有按下,循环*/
DATA_OUT=0x15;/*将00010101赋值给DATA_OUT*/
SEND();/*发送*/
RECEIVE();/*接收*/
CS=1;/*片选无效*/
AA=DATA_IN;/*把输入数据复制给AA*/
if(AA==6)BB=1;/*数码管显示00000110*/
if(AA==5)BB=2;/*00000101*/
if(AA==4)BB=3;/*00000100*/
if(AA==14)BB=4;/*00010100*/
if(AA==13)BB=5;/*00010011*/
if(AA==12)BB=6;/*00010010*/
if(AA==22)BB=7;/*00100010*/
if(AA==21)BB=8;/*00100001*/
if(AA==20)BB=9;/*00100000*/
if(AA==30)BB=11;/*00110000*/
if(AA==29)BB=0;/*00101001*/
if(AA==28)BB=12;/*00101000*/
TEN=0;/*MOVTEN,A*/
DATA_OUT=0xA1;/*MOVDATA_OUT,#10100001B*/
SEND();/*CALLSEND*/
DATA_OUT=0xA1;/*MOVDATA_OUT,#10100001B*/
SEND();/*CALLSEND*/
DATA_OUT=0x81;/*MOVDATA_OUT,#10000001B*/
SEND();/*CALLSEND*/
DATA_OUT=TEN;/*MOVDATA_OUT,TEN*/
SEND();/*CALLSEND*/
DATA_OUT=0x80;/*MOVDATA_OUT,#10000000B*/
SEND();/*CALLSEND*/
DATA_OUT=BB;/*MOVDATA_OUT,B*/
SEND();/*CALLSEND*/
CS=1;/*片选无效*/
WAIT:
if(KEY==0)/*有键按下*/
gotoWAIT;/*跳到WAIT函数*/
gotoMAIN1;/*跳到WAIT1函数*/
}
voidSEND(void)/*定义SEND(void)函数*/
{
BIT_COUNT=8;/*位数为8*/
CS=0;/*片选有效*/
LONG_DELAY();/*长延时*/
SEND_LOOP:
CY=data_out7;/*将data_out7赋值给cy,为进位的位,cy复位即cy=0*/
DAT=CY;/*将进位赋值给DAT*/
CLK=1;/*时钟高电平,它变成高电平以后,HD7279延时T6才输出数据*/
AA=DATA_OUT;/*将输出数据复制给AA*/
AA=_crol_(AA,1);/*循环左移*/
DATA_OUT=AA;/*将左移后的数据输出*/
SHORT_DELAY();/*短延时*/
CLK=0;/*CLK变低电平*/
SHORT_DELAY;/*延时T7*/
BIT_COUNT--;/*位数自减一*/
if(BIT_COUNT>0)/*判断位数是不是>0*/
gotoSEND_LOOP;/*DJNZ/*跳至SEND_LOOP*/BIT_COUNT,SEND_LOOP;/**/
DAT=0;/**/
}
voidLONG_DELAY(void)/*定义长延时函数*/
{
TIMER=25;/*计数初值25*/
DELAY_LOOP:
TIMER--;/*延时循环自减一*/
if(TIMER>0)
gotoDELAY_LOOP;
}/*RET*/
voidSHORT_DELAY(void)/*定义短延时函数*/
{
TIMER=4;/*MOVTIMER,#4;/*计数初值为4*/
DELAY_LOOP1:
TIMER--;/*延时循环自减一*/
if(TIMER>0)/**/
gotoDELAY_LOOP1;/*跳至DELAY_LOOP1*/
}
voidRECEIVE(void)/*定义RECEIVE(void)函数*/
{
BIT_COUNT=8;/*MOVBIT_COUNT,#8*/
DAT=1;/*SETBDAT*/
LONG_DELAY();/*CALLLONG_DELAY*/
RECEIVE_LOOP:
CLK=1;/*SETBCLK*/
SHORT_DELAY();/*CALLSHORT_DELAY*/
AA=DATA_IN;/*MOVA,DATA_IN*/
AA=_crol_(AA,1);/*RLAA*/
DATA_IN=AA;/*MOVDATA_IN,A*/
CY=DAT;/*MOVC,DAT*/
data_in0=CY;/*MOVDATA_IN.0,C*/
CLK=0;/*CLRCLK*/
SHORT_DELAY();/*CALLSHORT_DELAY*/
BIT_COUNT--;//BIT_COUNT自减1
if(BIT_COUNT>0)//BIT_COUNT判断是否〉0,若是进入循环ECEIVE_LOOP
gotoRECEIVE_LOOP;
DAT=0;/*CLRDAT*/
}
实验六电机调速控制实验
一.实验内容
连线并编制程序,产生脉冲信号,控制直流电动机的运行。
二.实验目的
掌握采用单片机控制直流电动机的硬件接口技术。
掌握直流电动机驱动程序的设计与调试方法。
熟悉直流电动机的工作特性。
三.实验电路
4.实验程序
#include//调用C51的头文件
typedefunsignedcharByte;//typedef定义可以在程序中用BYTE代替unsignedchar
sbitPAA=P1^0;//定义位变量PAA为P1^0
voidDelayXms()//定义延时函数
{
inti,j;
for(i=0;ifor(j=0;j<100;j++)
}
voidmain(void)//定义主函数
{
P1=0x0;//使P1口8个脚都输出低电平
while
(1)//循环
{PAA=0;//产生矩形方波
DelayXms(10);
PAA=1;
DelayXms(10);
}
}
实验七模/数转换实验
一.实验内容:
利用实验台上的ADC0809做A/D转换器,实验台上的电源和地提供模拟量输入,编制程序,将模拟量转换成数字量,用发光二极管显示。
二.实验目的:
1.掌握A/D转换与单片机的接口方法。
2.了解A/D芯片ADC0809转换性能及编程方法。
3.通过实验了解单片机如何进行数据采集。
三.实验原理简述:
A/D转换器大致有三类:
一是双积分A/D转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近A/D转换器,精度、速度、价格适中;三是并行A/D转换器,速度快,价格也昂贵。
实验用的ADC0809属于第二类,是八位A/D转换器。
每采集一次需100uS。
ADC0809START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号。
实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换。
故启动A/D转换只需如下两条指令:
MOVDPTR,#00H
MOVX@DPTR,A
A中为何内容是不重要的,这是一次虚拟写。
中断方式下,A/D转换结束后会自动产生EOC信号,将其与8031INTO相接。
中断处理程序中,使用如下指令即可读取A/D转换结果:
MOVDPTR,#00H
MOVXA,@DPTR
4.实验原理图:
●Enable:
输出允许信号位
5.程序框图:
这里给出软件延时方法的程序框图和程序:
6.实验程序
#include
#include//调用C51的头文件
#defineaddXBYTE[0x800]//宏定义将add定义为XBYTE[0x800]
voiddelay(intc)//延时子程序
{inti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voidmain()
{
chark;//定义字符型变量K
while
(1)//死循环
{add=0x0;//通道至0
delay(50);//延时
k=add;//将add赋值给K
P1=~k;//取反并赋给P1口
}
}
实验八微型打印机接口控制实验
一.实验内容:
将实验仪接上微型打印机,控制打印机打印出各种效果的汉字和字符。
二.实验目的:
了解微型打印机接口及其打印字符的方法;
了解微型打印机打印汉字的方法;
了解单片机与微型打印机的连线方法。
三.有关说明:
并行接口连接
接口与引脚定义:
本系列打印机并口与CENTRONICS兼容,支持BUSY/ACK握手协议,接口插座如下图:
并行接口各引脚信号的定义如下图表所示:
注:
1.“入”表示输入到打印机。
2.“出”表示从打印机输出。
3.信号的逻辑电平为TTL电平。
并行接口引脚信号时序
并口时序如下图所示:
四.实验电路:
五.实验程序
//北京炜煌科技打印机示例程序
//NockyTian
//2007-07-17
#include
//Hardwareconfiguration
#definePRINTER_DATAP0//定义打印机数据线端口
sbitBUSY=P3^2;//定义打印机忙信号引脚
sbitnSTB=P3^7;//定义打印机nSTB信号引脚
sbitPE=P3^3;//定义打印机纸状态检测信号引脚
sbitnACK=P3^2;//定义打印机应答信号引脚
sbitnERR=P3^1;//定义打印机错误检测信号引脚
sbitnSEL=P3^0;//定义打印机在线检测信号引脚
#defineCR0x0d
#defineLF0x0a
voidPrintByte(unsignedcharbyte_data);
voidPrintString(char*str);
voidPrintByteN(unsignedchar*data_src,unsignedcharN);
voidmain(void)
{
charstr[]="Printerdemo";
PrintString("北京炜煌WH");
PrintByte(CR);
while
(1);
}
/*PrintByte()
*Sendabytetoprinter
*NockyTian@2006-7-17
*/