单片机实践报告.docx
《单片机实践报告.docx》由会员分享,可在线阅读,更多相关《单片机实践报告.docx(18页珍藏版)》请在冰豆网上搜索。
![单片机实践报告.docx](https://file1.bdocx.com/fileroot1/2022-12/31/1f8106ff-83a9-4b95-882f-33ea9ad4e046/1f8106ff-83a9-4b95-882f-33ea9ad4e0461.gif)
单片机实践报告
北华航天工业学院
课程设计报告
实践课程名称:
单片机技术课程设计
实践地点单片机实验室(教七)
专业班级自动化
姓名李凯
学号B0822208
指导教师李叶紫
完成时间:
2011年4月27日
北华航天工业学院电子工程系
课程设计任务书
姓名:
李凯
专业:
自动化
班级:
B08222
指导教师:
李叶紫
职称:
副教授
课程设计题目:
数字频率计
主要课程支撑:
模拟电子技术、数字电子技术、微机原理与接口技术
实践目标:
1.熟练掌握单片机汇编指令的使用方法
2.熟练掌握行列式键盘、LED显示器的控制与管理方法
3.掌握A/D、/D/A的应用
4.掌握单片机应用系统设计方法、软硬件调试方法
5.熟练使用单片机仿真软件
基本要求:
1设计一个数字频率计1.测量范围:
0~200K
2.测量信号:
方波
3.测量信号电压:
3~5V
4.闸门时间:
10mS、0.1S、1S
5.显示位数:
6位
6.编程实现题目要求的基本功能,程序运行通过。
7.撰写课程实践报告
所需仪器设备:
伟福Lab6000综合实验/仿真系统一台套
微机一台
成果验收形式:
程序上机运行
参考文献:
Lab6000综合实验/仿真系统说明书
时间
安排
(1)7-8周:
选题、方案设计
(2)第9周开始上机调试程序
(3)最后一次上机课题验收
(4)第10周上交实践报告
指导教师:
李叶紫教研室主任:
李叶紫
2011年04月27日
专业综合实践题目
一、综合实践目的
1.用单片机定时/计数功能完成外加信号频率测量。
2.LED数码管显示测量频率值。
二、综合实践理论基础和核心内容
1.实践理论基础:
由于此程序主要用到内部计数器的相关功能,因此需要详细了解计数器的工作原理。
此外还需要知道单片机中断的方法,以及单片机汇编语言。
单计数器相对来说更综合,因此这里把计数器作为理论基础。
80C51单片机内部设有两个16位的可编程定时器/计数器。
可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。
在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。
定时器/计数器的结构:
80C51单片机计时器/计数器结构原理图
从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:
T0由TH0和TL0构成;T1由TH1和TL1构成。
其访问地址依次为8AH-8DH。
每个寄存器均可单独访问。
这些寄存器是用于存放定时或计数初值的。
此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。
这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。
TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。
当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1(P3.5)输入。
定时计数器的原理:
16位的定时器/计数器实质上就是一个加1计数器,其控制电路受软件控制、切换。
当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出为止。
显然,定时器的定时时间与系统的振荡频率有关。
因一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。
如果晶振为12MHz,则计数周期为:
T=1/(12×106)Hz×1/12=1μs
这是最短的定时周期。
若要延长定时时间,则需要改变定时器的初值,并要适当选择定时器的长度(如8位、13位、16位等)。
当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿将触发计数。
计数器在每个机器周期的S5P2期间采样引脚输入电平。
若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。
此后的机器周期S3P1期间,新的计数值装入计数器。
所以检测一个由1至0的跳变需要两个机器周期,故外部事年的最高计数频率为振荡频率的1/24。
例如,如果选用12MHz晶振,则最高计数频率为0.5MHz。
虽然对外部输入信号的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。
2.核心内容:
通过汇编语言设置定时器,一个定时器用来确定闸门时间,另一个定时器用来计数(记有多少个脉冲或者周期,也就是频率)。
通过键盘来认为选择闸门时间,有1s,0.1s,0.01s,分别为1,2,3键,还有一个按键是0,用来启动定时器,也就是开始测频。
之后通过现实译码器连接显示电路,将要现实的频率数显示的八段显示数码管上,至此就实现了三个部分的连接(这三个部分将在线面详细说明),实现了由测试到显示的转换。
三、综合实践具体内容和记录(设计思路、题目分析、解决方法、硬件电路、程序流程图、硬件资源分配表、子程序模块、程序、数据表格表等)
1.设计思路及方案
根据技术要求,可确定出该数字频率计应由测量电路(包括量程标定电路和ADC)、单片机、键盘及显示电路几个组成部分,各部分采用的电路形式及主要器件确定如下:
(1)单片机部分
选用89C51单片机作为主机,同时要设计89C51单片机的晶振电路和复位电路,具体电路见参考教材。
(2)测量电路部分
直接利用单片机内部的定时/计数器实现频率的测量。
(3)键盘、显示部分
本机需配置具有3个按键的键盘和6位数字LED的显示器。
具体显示原理及硬件电路见图:
显示电路:
键盘电路:
测量频率范围:
1-1000HZ闸门时间1S,单位(HZ)
1K-10K闸门时间0.1S(计数值×10),单位(KHZ)
10k-200k闸门时间10mS(计数值×100)单位(KHZ)
用按键选择测量范围。
2程序流程图:
4.4.1直接频率测量模块
这是整个软件设计模块中最重要的一部分。
首先对定时器/计数器T0、T1进行初始化,T0设置为计数器方式1,T1设置为定时器方式1;然后打开闸门P3.1,软件设置EA=1,运行控制位TR=1,启动定时/计数器开始工作;再运行软件延时程序,同时定时/计数器对外部的待测信号进行计数,延时结束时TR清0,停止计数;最后从计数寄存器读出测量数据,在完成数据处理后,由显示电路显示测量结果。
其流程框图如图4-12所示。
直接测频法流程框图
3.试验程序及说明:
OUTBITequ08002h;位控制口
OUTSEGequ08004h;段控制口
INequ08001h;键盘读入口
LEDBufequ60h;显示缓冲
jsequ100h
org0000h;开始放置程序
ljmpStart
org000bh
ljmpT0Int
T0Int:
djnzr5,yas1;判断是否到了闸门时间
clrTR0
clrTR1
callshuc
callfuzhi
reti
yas1:
movth0,#0ech
movtl0,#78h
reti
ksjs:
movth1,#00h;计数器时间常数清零
movtl1,#00h
movth0,#0ech
movtl0,#78h
setbTR0
setbTR1
ret
Zhamen1:
movr5,#100;1s
callcled1
mov40h,#01h
ret
Zhamen2:
movr5,#10;0.1s
callcled2
mov40h,#02h
ret
Zhamen3:
movr5,#1;0.01s
callcled3
mov40h,#03h
ret
cled1:
movLEDBuf+0,#0h;显示***000
movLEDBuf+1,#0h
movLEDBuf+2,#0h
movLEDBuf+3,#3fh
movLEDBuf+4,#3fh
movLEDBuf+5,#3fh
ret
cled2:
movLEDBuf+0,#0h;显示*000.00
movLEDBuf+1,#3fh
movLEDBuf+2,#3fh
movLEDBuf+3,#0bfh
movLEDBuf+4,#3fh
movLEDBuf+5,#3fh
ret
cled3:
movLEDBuf+0,#0;显示*.*.000.0
movLEDBuf+1,#0
movLEDBuf+2,#3fh
movLEDBuf+3,#3fh
movLEDBuf+4,#0bfh
movLEDBuf+5,#3fh
ret
Delay:
;延时子程序
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
DisplayLED:
movr0,#LEDBuf
movr1,#6;共6个八段管
movr2,#00100000b;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关闭所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
movdptr,#OUTBIT
mova,r2
movx@dptr,a;显示一位八段管
movr6,#1
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
ret
TestKey:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;输出线置为0
movdptr,#IN
movxa,@dptr;读入键状态
cpla
anla,#0fh;高四位不用
ret
KeyTable:
;键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
GetKey:
movdptr,#OUTBIT
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#6
KLoop:
mova,r1;找出键所在列
cpla
movx@dptr,a
cpla
rra
movr1,a;下一列
movxa,@r0
cpla
anla,#0fh
jnzGoon1;该列有键入
djnzr2,KLoop
movr2,#0ffh;没有键按下,返回0ffh
sjmpExit
Goon1:
movr1,a;键值=列X4+行
mova,r2
deca
rla
rla
movr2,a;r2=(r2-1)*4
mova,r1;r1中为读入的行值
movr1,#4
LoopC:
rrca;移位找出所在行
jcExit
incr2;r2=r2+行值
djnzr1,LoopC
Exit:
mova,r2;取出键码
movdptr,#KeyTable
movca,@a+dptr
movr2,a
WaitRelease:
movdptr,#OUTBIT;等键释放
clra
movx@dptr,a
movr6,#10
callDelay
callTestKey
jnzWaitRelease
mova,r2
ret
ToLED:
movdptr,#LEDMap
movca,@a+dptr
ret
shuc:
movr6,#0h;数据处理将TI1计数赋给r6,r7
Movr7,#0h
movr6,TL1;低
movr7,TH1;高
MLoop:
clra;数据BCD转换
movr3,a;r3,r4,r5分别从高到底放转换完的BCD码
movr4,a
movr5,a
movr2,#10h;转换双字节十六进制数
shuzh:
clrc
mova,r6
rlca;从高端移出待转换的的一位到CY中
movr6,a
mova,r7
rlca
movr7,a
mova,r5
addca,r5;BCD码带进位自身加法,相当于乘以2
daa;十进制的调整
movr5,a
mova,r4
addca,r4
daa
movr4,a
mova,r3
addca,r3
movr3,a;双字节十六进制的万位不超过6,不用调整
djnzr2,shuzh;判断16位是否处理完
ret
fuzhi:
movr0,40h;判断使用哪种显示模式
cjner0,#01h,k2
mova,r3;不显示R3里的数;1S显示
anla,#0f0h
swapa
callToLED
mova,#0
movLEDBuf+0,a
mova,r3
anla,#0fh
callToLED
mova,#0
movLEDBuf+1,a
mova,r4;不显示R4里的高位数
anla,#0f0h
swapa
callToLED
mova,#0
movLEDBuf+2,a
mova,r4;显示R4的低位数
anla,#0fh
callToLED
movLEDBuf+3,a
mova,r5;显示R5里的数
anla,#0f0h
swapa
callToLED
movLEDBuf+4,a
mova,r5
anla,#0fh
callToLED
movLEDBuf+5,a
ret
k2:
cjner0,#02h,k3
mova,r3;显示R3里的数;0.1S显示
anla,#0f0h
swapa
callToLED
mova,#0;屏蔽r3的高四位
movLEDBuf+0,a
mova,r3;显示r3的低四位
anla,#0fh
callToLED
movLEDBuf+1,a
mova,r4;显示R4里的数
anla,#0f0h
swapa
callToLED
movLEDBuf+2,a
mova,r4
anla,#0fh
callToLED
orla,#80h;加小数点
movLEDBuf+3,a
mova,r5;显示R5里的数
anla,#0f0h
swapa
callToLED
movLEDBuf+4,a
mova,r5
anla,#0fh
callToLED
movLEDBuf+5,a
ret
k3:
mova,r3;不显示R3里的数;0.01S显示
anla,#0f0h
swapa
callToLED
mova,#0
movLEDBuf+0,a
mova,r3
anla,#0fh
callToLED
mova,#0
movLEDBuf+1,a
mova,r4;显示R4里的数
anla,#0f0h
swapa
callToLED
movLEDBuf+2,a
mova,r4
anla,#0fh
callToLED
movLEDBuf+3,a
mova,r5;显示R5里的数
anla,#0f0h
swapa
callToLED
orla,#80h;加小数点
movLEDBuf+4,a
mova,r5
anla,#0fh
callToLED
movLEDBuf+5,a
ret
Start:
movsp,#50h
mov40h,#0h
callcled1
movtmod,#51h;设置定时器T0方式1,计数器T1方式1
movth0,#0ech;往TH0和TL0中送数,并设10000us(10ms)
movtl0,#78h
setbET0;定时器T0中断允许
setbEA;开启总中断
MLoop1:
callDisplayLED;显示
callTestKey;有键入?
jzMLoop1;无键入,继续显示
callGetKey;读入键码
anla,#0fh;显示键码
cjnea,#1,l1;选择闸门时间
callzhamen1;1键选1s
l1:
cjnea,#2,l2
callzhamen2;2键选0.1s
l2:
cjnea,#3,l3
callzhamen3;3键选0.01s
l3:
cjnea,#0,MLoop1
callksjs
ljmpMloop1
end
4主要模块分析:
1)主程序模块,由start处开始,用来执行流程图中的内容。
2)DisplayLED处开始到子程序结束结束标志处均为显示程序,实现了先关断显示,到显示频率的过程。
3)TestKey模块用来检测是哪个按键按下,然后采取相应操作;GetKey为获取键码的程序,以配合TestKey来实现上述选择功能。
硬件上配有4个按键,1,2,3,0分别选择1s,0.1s,0.01s,开始计数几个功能。
4)shuc和shuzh是实现数制转换功能的模块,即将测得的16进制转换为相应的bcd码,之后得以显示。
四、综合实践总结及分析
1.产生计数误差的原因
计数误差也称为末位读数不确定度或量化误差,是所有数字化测量仪器都存在的误差。
对于频率测量是由于被测信号脉冲与门控脉冲间的相位是随机的以及计数器不能计出末位数字一个字以下的零头数而产生的±1个字的误差。
假如在闸门时间τ内有7.5个脉冲,由于被测信号与门控信号的相位不同,计数时可能被计成为7,也可能被计成为8,这样就产生±1个字的计数误差。
2.减少计数误差的措施
在实际测量中,增加显示的有效数字位数可降低计数误差对直接测频法的影响。
3.实验体会
本实验是一种基于单片机AT89C51制作数字频率计的设计方法。
其测量原理非常简单,硬件电路制作方便,软件编程易于实现,所测得的频率范围较宽,精度较高,平均相对误差在0.34%左右,是在允许的测量误差范围内。
此次设计的数字频率计达到了测量频率的目的,但在实际制作和测试过程中,由于自己知识有限,时间短和经验不足等原因,还是出现了一些问题和需要继续改进、完善的地方。
比如:
在编写程序时,没有能实现闸门时间的自动切换。
由于单片机内部具有丰富的存储资源和强大的数据处理能力,因此采用单片机设计的数字频率计只需要改动很少的硬件部分就可以和其他的自动化仪表组成多功能控制系统,测量速度得到提高,用于连续测量的控制系统是非常有价值和意义的。
五、参考资料
[1]李建忠.单片机原理及应用[M].西安:
西安电子科技大学出版社,2002.1-2
[2]张国兴.用单片机制作数字频率计[J].电子制作,2005
[3]刘雪根.数字频率计的误差分析[J].自动化与仪表,1996
成绩评定表
指导
教师
评价
意见
评价项目
优
良
中
差
学习态度及表现
实践内容完成情况
实践报告完成情况
最终成绩评定
指导教师签字:
年月日