基于单片机的窄带脉冲宽度检测数字钟频率计电子琴程序Word文档下载推荐.docx
《基于单片机的窄带脉冲宽度检测数字钟频率计电子琴程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的窄带脉冲宽度检测数字钟频率计电子琴程序Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
将压缩BCD码转换为非压缩BCD码
AJMPLOOP1;
循环处理计数器T0采集得到的数据
PTF0:
MOVTH1,#0F0H
给定时器T1重新赋值
INC40H;
数码管判断位加1
MOVA,50H
CJNEA,#00H,DAY;
判断50H单元是否为零,若为0继续往下执行,若不为0,则跳转到子程序DAY中
MOVA,40H;
每4ms显示一位,从最高位开始,到最低位时,返回高位
CJNEA,#1,LOP1
ACALLQIANW
AJMPTIAO
LOP1:
CJNEA,#2,LOP2
ACALLBAIW
LOP2:
CJNEA,#3,LOP3
ACALLSHIW
LOP3:
ACALLGEW
MOV40H,#0
DAY:
MOVA,40H
CJNEA,#1,LP1
ACALLQIANW1
LP1:
CJNEA,#2,LP2
ACALLBAIW1
LP2:
CJNEA,#3,LP3
ACALLSHIW1
LP3:
ACALLGEW1
TIAO:
DJNZ30H,PTFR;
判断是否到1S
MOV20H,TH0
MOV21H,TL0;
将计数器T0中的数转移到20H,21H中
MOVTH0,#0
MOVTL0,#0;
将计数器T0重新赋0
MOV30H,#0FAH
PTFR:
RETI
ZHUANH:
MOVR2,20H;
将计数得到的值存入R2和R3中
MOVR3,21H
CLRA
MOVR4,A;
将R4、R5、R6清零
MOVR5,A
MOVR6,A
MOVR7,#16
LOOP:
CLRC;
将16位二进制数逐位左移一位,移得的数据放入进位C中
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
MOVR2,A
MOVA,R6;
(R4R5R6)+(R4R5R6)+C=(R4R5R6)*2+C
ADDCA,R6
DAA
MOVR6,A
MOVA,R5
ADDCA,R5
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZR7,LOOP
RET
CHAIF:
MOVA,R5;
将压缩BCD码R4R5R6转换为非压缩BCD码,从高到低依次放于50H、51H、52H、53H、54H
ANLA,#0F0H
SWAPA
MOV52H,A
ANLA,#0FH
MOV51H,A
MOVA,R6
MOV53H,A
MOV54H,A
MOV50H,R4
QIANW:
MOVA,52H;
频率不超过10KHZ时,以HZ为单位,四位显示,最高位为千位,以此类推
MOVDPTR,#TAB;
千位上显示51H单元中的内容
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H
BAIW:
MOVA,51H;
百位上显示52H单元中的内容
MOVDPTR,#TAB
MOVP2,#0FBH
SHIW:
MOVA,53H;
十位上显示53H单元中的内容
MOVDPTR,#TAB
MOVP2,#0FDH
GEW:
MOVA,54H;
个位上显示54H单元中的内容
MOVP2,#0FEH
QIANW1:
MOVA,50H;
频率大于10KHZ时,小数点放千位,以KHZ为单位,省去个位,以四位显示
千位上显示50H单元中的内容
BAIW1:
MOVA,52H;
百位上显示51H单元中的内容和显示小数点
MOVDPTR,#TAB1
SHIW1:
MOVA,51H;
十位上显示52H单元中的内容
GEW1:
个位上显示53H单元中的内容
MOVP2,#0FEH
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
TAB1:
DB0F7H,0C1H,0BBH,0EBH,0CDH,0EEH,0FEH,0C3H,0FFH,0EFH
NOP
END
基于单片机的数字钟设计
ORG0000H
AJMPMAIN
ORG000BH
AJMPPTF0
ORG0033H
TAB:
DB7EH,48H,3DH,6DH,4BH,67H,77H,4CH,7FH,6FH;
不带小数点
TAB1:
DB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;
带小数点
TAB2:
DB01H,02H,04H,08H,10H,20H,40H,80H,00H;
自检a--h
PUSHPSW;
保护现场PSW,ACC进栈
PUSHACC;
选工作寄存器1区
MOVTH0,#0ECH;
T0初始化
MOVTL0,#78H
DJNZ36H,PTFOR
MOV36H,#92;
判断中断次数计数单元减1是否为0
XRL33H,#0FFH
DJNZ37H,PTFOR;
中断次数计数单元36H,37H
MOV37H,#2
MOVA,32H;
秒单元32H加1
ADDA,#1
DAA;
十进制调整
MOV32H,A
CJNEA,#60H,PTFOR;
判断单元是否计数到60
MOV32H,#0
MOVA,31H;
分单元31H加1
MOV31H,A
CJNEA,#60H,PTFOR
MOV31H,#0
MOV32H,#0
MOVA,30H;
时单元30H加1
MOV30H,A
CJNEA,#24H,PTFOR;
判断计数单元是否到24
MOV30H,#0
MOV31H,#0
PTFOR:
POPACC;
恢复现场,ACC,PSW退栈
POPPSW
RETI
MOVP2,#0FH;
数码管自检
MOVDPTR,#TAB2
SS:
MOVR2,#00H
SST:
MOVCA,@A+DPTR
JZSS
INCR2
ACALLDEL3
MOVA,P0
CJNEA,#80H,SST
MOV30H,#00H;
状态数初始化
MOV31H,#00H
MOV32H,#00H
MOV33H,#00H
MOV36H,#92
MOVSP,#0EFH;
栈指针初始化
MOVTH0,#0ECH
MOVTMOD,#1
MOVIP,#2
MOVIE,#82H;
中断初始化
允许T0计数
LOOP:
ACALLLOP0
JBP1.0,XX;
校时按键按下但未松开(低电平)转移到校时模块
ACALLJS1
XX:
JBP1.1,YY;
校分按键按下但未松开(低电平)转移到校分模块
ACALLJF1
ACALLLOP0
YY:
AJMPLOOP
JS1:
LCALLDEL
JS2:
JBP1.0,JS3;
校时按键松开(高电平)校时
AJMPJS2
JS3:
MOVA,30H
CJNEA,#24H,RT;
校时到24时,采用24进制计时
JF1:
JF2:
JBP1.1,JF3;
校分按键松开(高电平)校分
AJMPJF2
JF3:
MOVA,31H
MOV31H,A
CJNEA,#60H,RT;
分为60进制计时
MOV31H,#0
INCA,
MOV30H,A;
分校时到60时,时自加一
RT:
RET
LOP0:
MOVR6,33H
CJNER6,#00H,ZZ;
保证秒的闪烁,采用小数点的闪烁
LJMPLOP1
ZZ:
LOP1:
MOVA,31H
ANLA,#0FH;
利用与0F从中取出分个位,显示分个位
MOVP2,#0FFH
MOVP2,#0EFH;
保证数码管的显示不变,原理来源于任务5
ACALLDEL
MOVA,31H
ANLA,#0F0H;
利用与F0相与取出分十位,显示分十位
SWAPA;
交换高低半字节
MOVP0,A
MOVP2,#0FFH
MOVP2,#0DFH
ACALLDEL
时个位的显示(原理与分同)
ANLA,#00FH
MOVP2,#0BFH
时十位的显示
MOVP2,#7FH
DEL:
MOVR4,#20;
延时程序1
DEL1:
MOVR5,#40
DEL2:
DJNZR5,DEL2
DJNZR4,DEL1
DEL3:
MOVR7,#0FFH;
延时程序2
DEL4:
MOVR6,#0FFH
DEL5:
DJNZR6,DEL5
DJNZR7,DEL4
END
基于单片机的窄带脉冲宽度检测
第1节引言
一般单片机能够检测较宽的脉冲,但很难检测窄带脉冲,该系统只要是用于检测窄带脉冲,并显示其宽度的功能。
1.1系统概述
本系统使用AT89C2051单片机,利用定时器T1门控GATE的功能,测量引脚上出现的正脉冲宽度,并用LED数码管显示出来。
1.2设计任务
设计要完成的任务有硬件设计和软件设计。
硬件方面,AT89C2051单片机的P3.3口测试外部脉冲。
P1口可以接LED数码管。
软件方面,利用单片机的定时完成正脉冲宽度的读取,然后用到P1口使LED数码管显示。
第2节系统硬件设计
硬件电路关系到软件的编程,也要有利用系统的实际应用。
2.1系统的硬件构成及功能
本系统有以下几个部件组成:
单片机AT89C2051,CD4511芯片电源,LED数码管等。
单片机即单片微型计算机,是集CPU,ROM,RAM,I/O口,内部总线及中断系统于一体的微控制器,它体积小,重量轻,功能强,广泛应用于智能产品及工业自动控制上,而51单片机是各单片机最为典型和最有代表性的一种。
电源提供单片机正常工作,单片机只需+5V的电压,可以通过220V的市电通过变压、整流稳压来得到,维持系统的正常工作。
LED数码管用于显示所检测外部输入脉冲的宽度,直观
2.2AT89C2051单片机及其引脚说明
AT89C2051单片机是51系列单片机的一个成员,是8051单片机的简化版。
内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与IntelMCS-51系列单片机的指令和输出管脚相兼容。
由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,节省了成本,提高了系统的性价比。
AT89C2051单片机是一个有20个引脚的芯片,引脚配置如图1所示。
与8051相比,AT89C2051减少了两个对外端口(即P0、P2口),使它最大可能地减少了对外引脚下,因而芯片尺寸有所减小。
图1AT89C2051引脚配置
AT89C2051芯片的20个引脚功能为:
VCC电源电压。
GND接地。
RST复位输入。
当RST变为高电平并保持2个机器周期时,所有I/O引脚复位至“1”。
XTAL1反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2来自反向振荡放大器的输出。
P1口8位双向I/O口。
引脚P1.2~P1.7提供内部上拉,当作为输入并被外部下拉为低电平时,它们将输出电流,这是因内部上拉的缘故。
P1.0和P1.1需要外部上拉,可用作片内精确模拟比较器的正向输入(AIN0)和反向输入(AIN1),P1口输出缓冲器能接收20mA电流,并能直接驱动LED显示器;
P1口引脚写入“1”后,可用作输入。
在闪速编程与编程校验期间,P1口也可接收编码数据。
P3口引脚P3.0~P3.5与P3.7为7个带内部上拉的双向I/0引脚。
P3.6在内部已与片内比较器输出相连,不能作为通用I/O引脚访问。
P3口的输出缓冲器能接收20mA的灌电流;
P3口写入“1”后,内部上拉,可用输入。
P3口也可用作特殊功能口,其功能见表1。
P3口同时也可为闪速存储器编程和编程校验接收控制信号。
2.3CD4511芯片说明
CD4511是BCD锁存—段码译码—共阴LED驱动集成电路,其引脚如图2所示,各引脚功能如下:
图2CD4511各引脚配置
VCC:
接正电源;
VSS:
接地;
A,B,C,D:
BCD码输入脚(A为最低位,D为最高位);
Qa~Qg:
段码输出脚,高电平有效,最大可输出25mA电流;
BI:
熄灭,接低电平则Qa~Qg全部输出低电平;
LT:
点亮测试,接低电平则Qa~Qg全部输出高电平;
LE:
锁存允许,接高电平锁存,则输出不会随BCD码输入改变
2.4LED数码管显示说明
由于系统要显示的内容比较简单,显示量不多,所以选用数码管既方便又经济。
LED有共阴极和共阳极两种。
如图所示。
二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。
一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。
当在某段发光二极管施加一定的正向电压时,该段笔划即亮;
不加电压则暗。
为了保护各段LED不被损坏,需外加限流电阻。
LED数码管结构原理图:
gfcomab
符号和引脚
共阴极高电平驱动共阳极低电平驱动
LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动。
本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性。
所谓软件译码,即由单片机软件完成从数字到显示码的轮换。
从LED数码管结构原理图可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节。
各段码位与显示段的对应关系如表:
各段码位的对应关系
段码位
D7
D6
D5
D4
D3
D2
D1
D0
显示段
dp
g
f
e
d
c
b
a
当用数据口连接LED数码管a~dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系。
通常数据口的D0位与a段连接,D1位与b段连接,……D7位与dp段连接,如上表所示,LED数码管显示的十六制数和空白字符与P的显示段码。
LED显示段码
字型
共阳极段
共阴极段
C0H
3FH
9
90H
6FH
1
F9H
06H
A
88H
77H
2
A4H
5BH
B
83H
7CH
3
B0H
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
84H
71H
7
F8H
07H
空白
FFH
00H
8
80H
7FH
P
8CH
73H
在该系统中,根据由于硬件连线的不同,各段码的关系如下:
D6
D5
D4
D3
D2
D1
D0
因此在该系统中所出现的LED数码管显示的十六进制数和空白字符与P的显示段码也要根据此修改。
根据AT89C2051单片机灌电流能力强,拉电流能力弱的特点,选用共阳数码管。
将AT89C2051的P1.0~P1.7分别与共阳数码管的a~g及dp相连,高电平的位对应的LED数码管的段暗,低电平的位对应的LED数码管的段亮,这样,当P0口输出不同的段码,就可以控制数码管显示不同的字符。
例如:
当P0口输出的段码为11000000,数码管显示的字符为0。
数码管显示器有两种工作方式,即静态显示方式和动态扫描显示方式。
为节省端口及降低功耗,本系统采用动态扫描显示方式。
动态扫描显示方式需要解决多位LED数码管的“段控”和“位控”问题,本电路的通过P1口实现:
而每一位的公共端,即LED数码管的“位控”,则由P3口控制。
这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码。
在这一瞬时,只有这一位在显示,其他几位则暗。
在本系统中,字位线的选通与否是通过PNP三极管的导通与截止来控制,即三极管处于“开头”状态。
2.5硬件电路
单片机的P3.3引脚接外部的脉冲源,通过内部的定时器控制计算脉冲个数,这与单片机的晶振频率有关。
通过2片CD4511芯片输出2个4位BCD码,再输出到LED数码管显示。
其具体的系统电路图参见图3所示。
图3系统电路图
第3节系统的软件设计
本系统的软件设计主要是通过定时器计脉冲个数,然后显示在LED数码管上。
3.1系统主程序设计
通过外部脉冲输入到P3.3口。
当引脚上出现高电平时,定时器T1即开始对12分频时钟周期计数,直到引脚变低电平为止,然后读出T1计数器的值并显示。
图4脉冲源
假设我们使用的脉冲源如图4所示。
3.2系统源程序设计
ORG0000H
AJMPSTART
ORG1000H
START:
MOVTMOD,#90H;
对定时器初始化
MOVTL1,#00H
MOVTH1,#00H
WAIT1:
JBP3.3,WAIT1;
等待变低
SETBTR1;
启动T1计数
WAIT2:
JNBP3.3,WAIT2;
等待升高
WAIT3:
JBP3.3,WAIT3;
CLRTR1;
停止T1计数
MOVA,TL1;
读出TL1的计数值
CLRC
SUBBA,#30H
SWAPA
MOV40H,A;
暂存A的内容
MOVA,TH1
CLR