《单片机实验报告》word版 本文关键词:单片机,实验,报告,word
《单片机实验报告》word版 本文简介:实验报告课程名称计算机测控技术实验项目单片机实验仪器keil4.0系别仪器科学与光电工程专业测控技术与仪器班级/学号学生姓名实验日期成绩指导教师实验一单片机程序设计基础一.实验设备硬件使用的是单片机SS-8051高级单片机实验仪,软件使用的是Keiluv2软件开发环境。二.实验目的熟悉单片机的调试环
《单片机实验报告》word版 本文内容:
实
验
报
告
课程名称
计算机测控技术
实验项目
单片机
实验仪器
keil4.0
系
别
仪器科学与光电工程
专
业
测控技术与仪器
班级/学号
学生姓名
实验日期
成
绩
指导教师
实验一
单片机程序设计基础
一.实验设备
硬件使用的是单片机SS-8051高级单片机实验仪,软件使用的是Keil
uv2软件开发环境。
二.
实验目的
熟悉单片机的调试环境与指令系统
三.实验内容
自编一个汇编小程序,使用Keil
uv2软件开发环境,进行编译、调试、运行程序。
Keil
uv2
操作流程的简单说明:
1.
NEW
PROJECT
↙,建一个新的项目,取项目名并存于F:盘下(最好在F盘下建一个自己的文件夹)。在出现的对
话框中选Atmel/AT89c51
芯片型号;或者可以从File/
devices
database
的对话框中选择芯片型号。
2.
FILE/
NEW
↙,建立一个新文件,在打开的窗口下输入程序,取文件名并存盘。
3.
选中Source
Group1点击鼠标右键,在出现的菜单中选中
Add
Files
to
Group
`
Source
Group1`,将文件加入到项目中。
4.
选中Target1点击鼠标右键,在出现的菜单中选中Options
for
Target
`
Target1`:
l
在出现的对话框中打开output项的对话框,选中`Great
HEX
File`,以保证编译时能生成.HEX文件,为后续下载程序做准备。
l
在出现的对话框中打开debug项的对话框,选中`Use
“keil
monitor
51-driver”,并将其下的选项均选中系统处于在线下载调试状态。。
5.
Project/Build
target或Rebuild
all
target
files,编译所输入的程序,检查语法错误,更改错误直至无错为止。
6.
Debug/
‘Start/Stop
Debug
Session’
↙,开始调试程序,单步或断点运行程序额,检查逻辑错误。
4.
实验程序
#include
unsigned
int
code
chOriginalSet[10]={30,30,550,30,8,30,550,30,8,1};
/*阀序时间间隔设置*/
unsigned
char
code
chFarXu[9]={0x00,0x51,0x55,0x45,0x80,0x62,0x6a,0x4a,0x80};
/*阀序*/
void
delay(unsigned
int
times);
main()
{
unsigned
char
i;
while(1)
{
for(i=1;i
#include
typedef
unsigned
char
Byte;
BytedataAA;
voidOUT(void)
{
SBUF=AA;/*发送字符子程序*/
wait:if(TI==1)
{
TI=0;
goto
end1;
}/*发送完毕返回*/
gotowait;/*否则等待TI=1*/
end1:_nop_();
}
void
IN(void)
{
in1:if(RI==1)
{
RI=0;
goto
end2;
}/*接收到字符(RI=1)时启动接收*/
goto
in1;/*否则查询是否接收到字符*/
end2:AA=SBUF;/*启动接收*/
}
voidmain(void)
{
TH1=0xF3;/*设置波特率为2400*/
TL1=0xF3;/*设置波特率为2400*/
TMOD=0x20;/*选择计时器1方式2产生波特率*/
IE=0;/*禁止所有的中断,采用查询方式*/
SCON=0x50;/*设置串口为方式1,接收允许*/
TR1=1;/*启动定时器1*/
AGAIN:IN();/*接收字符子程序*/
OUT();/*回送字符子程序*/
goto
AGAIN;/*循环*/
}
7.
实验截图
实验三
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(V)
4.973
4.029
3.500
3.005
2.499
1.999
1.504
1.001
0.502
F(Hz)
6.64
5.38
4.63
4.00
3.32
2.66
2.00
1.32
0.67
实验四
V/F转换的数据采集
一.
实验内容
连线并编制程序:使用定时器和计数器完成
LM331脉冲输出信号的采集功能,
对采集的数据进行处理,最终得到频率值。
二.
实验目的
1.
定时器中断的使用;
2.
学习定时器中断间隔时间的计算;
3.
掌握计数器的使用方法;
4.
学习中断处理程序的编程方法。
三.
原理简述
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工作外,还要将时间常数重新送入定时器中,为下一次中断做准备。主程序则对计数器的数值进行处理,转换成频率值。
实验五
7279键盘显示控制实验
一.
实验题目
连线并编制程序,将HD7279A的全部编码送HD7279A显示,以一秒钟为间隔显示下一位,以前的显示内容左移。
二.
实验目的
1.
了解HD7279A键盘显示芯片的基本应用;
2.
掌握HD7279A键盘显示芯片的接口电路及编程方法。
三.
原理简述
HD7279A是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。
HD7279A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式,此外还有多种控制命令,如消隐、闪烁、左移、右移、段寻址等。命令的具体形式可查阅HD7279A相关的技术资料。
四.
实验电路
五.
连线方法
电路单元
2单元
6单元
8单元
9单元
连接一
P1.2-P1.5
DATA,/KEY,/CS,/CLK
(JP38.2-JP38.5)
连接二
左边的DG0-DG5
6G-1G
连接三
SA-DP
B7-B0
连接四
右边的DG0-DG3
C0-C3
连接五
SA-SC
C4-C6
连接六
JP16跳线接GND
另外,在实验之前,应将8单元的U7(7406)和U6(74LS245)芯片取下,因7279已经有直接驱动数码管的能力,如果另外放置驱动芯片,反而会影响数码管的显示效果。
六.
实验程序
程序清单(C51):
#include/*C51内部资源定义*/
#include
typedef
unsigned
char
Byte;/*下面的程序中用Byte代替unsigned
char*/
bdata
Byte
BIT_COUNT,TIMER,TIMER1,TEN,DATA_IN,DATA_OUT,AA,BB;
sbit
data_in0=DATA_IN^0;
sbit
data_out7=DATA_OUT^7;
sbit
DAT=P1^2;/*HD7279A的DATA连接于P1.2*/
sbit
KEY=P1^3;/*HD7279A的KEY(键盘中断信号)连接于P1.3*/
sbit
CS=P1^4;/*HD7279A的CS(片选信号)连接于P1.4*/
sbit
CLK=P1^5;/*HD7279A的CLK连接于P1.5*/
void
SEND(void);/*发送*/
void
LONG_DELAY(void);/*长延时*/
void
SHORT_DELAY(void);/*短延时*/
void
RECEIVE(void);/*接收*/
void
main(void)/*主程序*/
{
START:_nop_();/*启动,短延时几微秒*/
P1=0xDB;
/*给P1赋值0xDB*/
TIMER=50;/*定时50秒*/
START_DELAY:TIMER1=255;/*定时255秒*/
START_DELAY1:TIMER1--;/**/
if(TIMER1>0)
goto
START_DELAY1;/*如果TIMER1大于0跳转到START_DELAY1*/
TIMER--;/**/
if(TIMER>0)
goto
START_DELAY;/*如果TIMER大于0跳转到START_DELAY*/
DATA_OUT=0xA4;
/*给DATA_OUT赋值0xA4*/
SEND();
/*发送数据*/
CS=1;
/*片选置1*/
MAIN1:if(KEY==1)
goto
MAIN1;
/*如果键盘中断信号为1,跳转到MAIN1*/
DATA_OUT=0x15;
/*DATA_OUT赋值0x15*/
SEND();
/*发送*/
RECEIVE();
/*接收*/
CS=1;
/*片选为1*/
AA=DATA_IN;
/*给AA赋值DATA_IN*/
if(AA==6)BB=1;/*如果AA为6,BB为1*/
if(AA==5)BB=2;/*如果AA为5,BB为2*/
if(AA==4)BB=3;/*如果AA为4,BB为3*/
if(AA==14)BB=4;/*如果AA为14,BB为4*/
if(AA==13)BB=5;/*如果AA为13,BB为5*/
if(AA==12)BB=6;/*如果AA为12,BB为6*/
if(AA==22)BB=7;/*如果AA为22,BB为7*/
if(AA==21)BB=8;/*如果AA为21,BB为8*/
if(AA==20)BB=9;/*如果AA为20,BB为9*/
if(AA==30)BB=11;/*如果AA为30,BB为11*/
if(AA==29)BB=0;/*如果AA为29,BB为0*/
if(AA==28)BB=12;/*如果AA为28,BB为12*/
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;
/*片选信号置1*/
WAIT:if(KEY==0)
goto
WAIT;
goto
MAIN1;
/*如果KEY为0,跳转到WAIT,否则跳转到MAIN1*/
}
void
SEND(void)
/*发送子程序*/
{
BIT_COUNT=8;
/*统计为8*/
CS=0;
/*片选置0*/
LONG_DELAY();
/*长延时*/
SEND_LOOP:CY=data_out7;
/*发送循环*/
DAT=CY;
/*引脚的状态*/
CLK=1;
/*时钟信号为1*/
AA=DATA_OUT;
/*给AA赋值DATA_OUT*/
AA=_crol_(AA,1);/*_crol_函数在这里是把左边的一个零移到右边*/
DATA_OUT=AA;/*给DATA_OUT赋值AA*/
SHORT_DELAY();
/*短延时*/
CLK=0;/*时钟信号为0*/
SHORT_DELAY;/*短延时*/
BIT_COUNT--;
if(BIT_COUNT>0)
goto
SEND_LOOP;/*DJNZBIT_COUNT,SEND_LOOP;
DAT=0;/*将DAT清0*/
}
void
LONG_DELAY(void)/*长延时子程序*/
{
TIMER=25;
/*定时25秒*/
DELAY_LOOP:TIMER--;/*延时循环*/
if(TIMER>0)
goto
DELAY_LOOP;/*如果TIMER大于0,跳转到DELAY_LOOP*/
}/*RET*/
void
SHORT_DELAY(void)/*短延时子程序*/
{
TIMER=4;/*MOVTIMER,#4;
/**/
DELAY_LOOP1:TIMER--;/*延时循环*/
if(TIMER>0)
goto
DELAY_LOOP1;/*如果TIMER大于0,跳转到DELAY_LOOP1*/
}
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--;/**/
if(BIT_COUNT>0)
goto
RECEIVE_LOOP;/*如果BIT_COUNT大于0,跳转到DELAY_LOOP*/
DAT=0;/*CLR
DAT*/
}
七.
实验截图
实验六
电机调速控制实验
一.
实验内容
连线并编制程序,产生脉冲信号,控制直流电动机的运行。
二.
实验目的
1.
掌握采用单片机控制直流电动机的硬件接口技术。
2.
掌握直流电动机驱动程序的设计与调试方法。
3.
熟悉直流电动机的工作特性。
三.
实验电路
4.
连线方法
电路单元
2单元
电机单元
电机单元
连接一
P10-P13
AD4-AD7
连接二
GND
CS1
连接三
GND
GND(有跳线)
连接四
VCC
VCC(有跳线)
5.
实验程序
#include
typedef
unsigned
char
Byte;
sbit
PAA=P1^0;
sbit
PBB=P1^2;
sbit
PCC=P1^1;
sbit
PDD=P1^3;//设置引脚
void
DelayXms()//延时程序
{
int
i,j;
for(i=0;i
#include
int
f,f0;
void
main()
{
TMOD=0X51;
TH0=0X9E;
TL0=0X58;
TH1=0X00;
TL1=0X00;
ET0=1;
EA=1;
TR0=1;
TR1=1;
while(1);
}
void
time1()
interrupt
1
using
2
{
EA=0;
TR0=0;
TR1=0;
f=TL1+TH1*256;
f0=f*2;
}
八.
实验截图
实验八
微型打印机接口控制实验
一.
实验内容:
将实验仪接上微型打印机,控制打印机打印出各种效果的汉字和字符。
二.
实验目的:
1.
了解微型打印机接口及其打印字符的方法;
2.
了解微型打印机打印汉字的方法;
3.
了解单片机与微型打印机的连线方法。
三.
有关说明:
l
并行接口连接
接口与引脚定义:本系列打印机并口与CENTRONICS
兼容,支持BUSY/ACK
握手协议,接口插座如下图:
并行接口各引脚信号的定义如下图表所示:
注:
1.“入”表示输入到打印机。
2.“出”表示从打印机输出。
3.信号的逻辑电平为TTL
电平。
l
并行接口引脚信号时序
并口时序如下图所示:
四.
实验电路:
五.
连线方法:
电路单元
第2单元
打印机
连接1
P0.0-P0.7
Data1-Data8(3,5,7,9,11,13,15,17)
连接2
P3.7
/STB(1)
连接3
P3.2(INT0)
BUSY(21)
连接4
Gnd
18
六.
实验程序
l
单片机控制打印机时汇编例程
BUSY
EQU
P3.2
;
定义BUSY
信号引脚
nSTB
EQU
P3.7
;
定义nSTB
信号引脚
JB
BUSY,$
;
等待打印机到空闲
MOV
P1,A
;
送数据到数据口
CLR
nSTB
;
置nSTB
为低电平
NOP
;
延长nSTB
信号脉冲宽度以满足时序要求
nop
nop
SETB
nSTB
;
置nSTB
为高电平(此时数据将被读入打印机)
RET
print_content:
DB
北京炜煌
DB
0dh
END
l
单片机C51
例程
//
北京炜煌科技打印机示例程序
//
Nocky
Tian
//
2007-07-17
#include
//
Hardware
configuration
#define
PRINTER_DATA
P1
//
定义打印机数据线端口
sbit
BUSY
=
P3^2;
//
定义打印机忙信号引脚
sbit
nSTB
=
P3^7;
//
定义打印机nSTB
信号引脚
sbit
PE
=
P3^3;
//
定义打印机纸状态检测信号引脚
sbit
nACK
=
P3^2;
//
定义打印机应答信号引脚
sbit
nERR
=
P3^1;
//
定义打印机错误检测信号引脚
sbit
nSEL
=
P3^0;
//
定义打印机在线检测信号引脚
#define
CR
0x0d
#define
LF
0x0a
void
PrintByte(unsigned
char
byte_data);
void
PrintString(char*
str);
void
PrintByteN(unsigned
char*
data_src,unsigned
char
N);
void
main(void)
{
char
str[]
=
“Printer
demo“;
PrintString(“北京炜煌WH“);
PrintByte(CR);
while(1);
}
/*
PrintByte()
Send
a
byte
to
printer
Nocky
Tian
@
2006-7-17/
#include
void
PrintByte(unsigned
char
byte_data)
{
while(
BUSY
==
1
){
}
PRINTER_DATA
=
byte_data;
nSTB
=
0;
_nop_();
//
调整nSTB
信号脉宽
nSTB
=
1;
}
/*
PrintString()
a
string
which
is
ending
with
a
/0
character
To
Excuted
the
command
a
addition
CR
character
is
needed
Nocky
Tian
@
2006-7-17/
void
PrintString(char*
str)
{
while(str
){
PrintByte((str++));
}
}
/*
PrintByteN()
N
bytes
through
printer
no
more
than
255
bytes
could
be
printed
by
the
function
If
more
than
255
bytes
need
printing,the
type
of
N
need
changing
to
unsigned
int,even
unsigned
long
if
necessary.
Nocky
Tian
@
2006-07-17/
void
PrintByteN(
unsigned
char*
data_src,//
pointer
to
data
source
unsigned
char
N)
//
number
of
data(byte)
{
while(
N--){
PrintByte(*(data_src++));
}
}
七.
实验截图