哈喽小伙伴们 ,今天给大家科普一个小知识。在日常生活中我们或多或少的都会接触到基于51单片机智能计数器的设计方面的一些说法,有的小伙伴还不是很了解,今天就给大家详细的介绍一下关于基于51单片机智能计数器的设计的相关内容。
一、任务以及要求
(资料图)
对外部信号脉冲进行计数,并将脉冲个数显示出来。基本要求:计数至少65536个脉冲,并将脉冲个数显示出来。
二、方案选择
用中断方式进行计数,利用定时器/计数器0的方式2。使用查寻方式进行计数,利用定时器/计数器0的方式1。本程序使用第一方案进行设计,并能实现计数99999999次
三、系统硬件设计
设计思路
1)、通过按钮产生脉冲信号。
2)、由于按钮按合会出现机械弹跳过程,使得电平跳变发生多次。为了克服按钮抖动而产生的误计数,接入脉冲消抖电路,克服按钮的抖动现象。
3)、脉冲计数可采用定时器/计数器来实现。
4)、选择8279作为6位LED显示器的译码驱动电路,实现累进计数。
2、硬件电路组成:
根据硬件设计思路,将用到单片机8031、按纽、脉冲消抖电路,8279芯片电路、6位LED显示器电路用连接线接好。其中按钮脉冲消抖电路由按钮产生的电平跳变信号经由两个与非门构成的RS触发器进行消抖。根据RS触发器的工作原理,当两个输入端均为1时,触发器输出状态不变;当按钮在两个触点间抖动时,RS触发器的两个输入端均为高电平,触发器输出电平不变;仅当按钮实现一次完整的按合过程后,触发器的输出端才产生一个脉冲,从而消除了按钮按合是抖动的影响。数据显示采用8279芯片连接LED数码管实现。应根据单片机,确定8279与单片机和与6位LED显示器的接口方式,以及8279芯片的端口地址(8279数据口地址为0000H,8279命令/状态口地址为0001H)
系统程序设计
设计思路:
以定时器/计数器0来对脉冲进行计数,数据用8279芯片连接LED数码管实现累进显示。程序分为主程序和中断服务程序两部分。主程序主要实现初始化、循环显示。而累计数在中断服务程序中完成。
主程序设计:
1)、实现初始化
包括设置堆栈指针、8279芯片初始化、定时器/计数器0初始化、RAM区初始化,以及开中断、启动定时期/计数器0等。
2)、数据循环显示
首先要编写8279初始化子程序和显示一个字符的基本子程序。其中8279初始化子程序为P8279,该子程序功能包括设置8279的工作方式(8个字符显示,左入口,编码扫描键盘,双键锁定)以及写相关的命令字(设置分频系数为31、清除LED显示等)。显示一个字符的子程序为DISLED,该子程序的入口条件为:工作就寄存器R4中存放待显示字符的LED数码管管号。另在工作寄存器R5中,以非压缩BCD码的形式存放带显示字符。一般情况下,如要显示0~9,则在R5中依次置00H~09H,程序中用查表的方法找到待显示字符所对应的“段码”。
显示子程序DISP的设计思想是:待显示的六位数据分别以压缩BCD码的形式存放在67H、68H、69H和70H四个单元中,该子程序的功能是依次将存放在67H、68H、69H和70H中的八个BCD码分别送0#~7#数码管显示。先将其拆开为个位、十位、百位、千位、万位、十万位、百万位和千万位八个非压缩BCD码的形式,随之先后送工作寄存器R5,再三次调用DISLED子程序。由于在工作寄存器R4中已设置好该数据显示的管号,故即可在0#号管和1#号管实现个位和十位数据的显示。第二次循环中,又可在2#号管和3#号管实现百位和千位数据的显示,第三次循环中,可在4#号管和5#号管实现万位和十万位数据的显示,第四次循环中,可在6#号管和8#号管实现百万位和千万位数据的显示。
3)、主程序清单:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTCO
ORG 0030H
MAIN: MOV TMOD, #60H ;设定时器/计数器1为计数方式,工作方式2
MOV TH1,#0FFH ;每产生一个脉冲即产生中断
MOV TL1,#0FFH
MOV67H,#00H
MOV 68H,#00H ;计数器先清零
MOV 69H,#00H
MOV 70H,#00H
MOV SP,#2FH ;堆栈指针置初值
MOV R3, #06H ;LED待显示位数送R3
SETB EA
SETB ET0
SETB TR0
PUSH DPH ;8279的初始化
PUSH DPL
PUSH ACC
MOV DPTR, #0001H ;0001H为8279命令和状态口地址
MOV A, #00H ;置8279工作方式(8个字符显示,左入口;编码扫描键盘,双键锁定)
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
MOV @R0, #00H ;显示缓冲区清零
INC R0
DJNZ R3, $
CLR A ;累加器清零
LOOP: LCALL DISP
SJMP LOOP
DISP: STEB RS0 ;保护第0组工作寄存器,启用第
一组工作寄存器
MOV R0,#70H ;显示缓冲区首址送R0
MOV R4,#00H
MOV R2,#04H
DIS1: MOV A,@R0
ANL A,#0FH
MOV R5,A
LCALL DISLED
INC R4
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV R5,A
LCALL DISLED
DEC R0
INC R4
DJNZ R2,DIS1
RET
DISLED: PUSH DPH ;显示字符子程序
PUSH DPL
PUSH ACC ;A入栈保护
MOV A,#80H
ADD A,R4
MOV DPTR,#0001H ;8279命令和状态口地址
MOVX @DPTR,A
MOV DPTR,#LEDSEG ;指向字形表首地址
MOV A,R5
MOVC A,@A+DPTR ;查表取得字形码
MOV DPTR,#0000H ;8279数据口地址
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
LEDSEG: DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,
DB 07FH,6FH,77H,7CH,39H,5EH,79H,71H ;
中断服务程序设计
1)、中断服务程序设计思路:
定时器/计数器0设置为工作方式2,并设计时器处值为FFH。这样只要来一个脉冲,计时器就溢出而产生中断,进入中断程序使67H、68H、69H、70H四个计数单元的值实现累加。
2)、中断服务程序清单:
ORG 1000H
CTCO: PUSH ACC
MOV A,70H
ADD A,#01H
DA A
MOV 70H,A
MOV A,69H
ADDC A,#00H
CLRC
DA A
MOV 69H,A
MOVA,68H
ADDCA,#00H
CLRC
DAA
MOV68H,A
MOVA,67H
ADDCA
MOV67H,A
POP ACC
RETI
实习心得
通过本次单片机实习彻底掌握了MCS-51、8279的结构及工作原理,通过它们使我能够完成智能计数器,对智能计数器的工作原理也有了更深的体会和掌握。学会了巧妙的编程方法,掌握了定时器/计数器的应用。
就连我自己也不知道为什么,一开始我就对单片机很感兴趣。我觉得每每听万一堂课,我都有一种说不出的高兴,有时也会发愁,因为课程越往后越难学而且讲课进度再加快,但我没有退缩,每周坚持看单片机。就这样一步步走到课程设计,也许是没全身心投入,搞了两天程序才搞出来,结果上机时还是存在着错误,和同组人刘欢讨论和修改后才完成了“智能计数器”这个程序的编写。为了更好的完成软硬件的结合,我查阅了相关资料,最终得到了解决。 转眼间,一周的课程设计过去了。经过这么一个过程我更加深刻的认识了单片机。单片机是编程语言中非常重要的一种。它的功能十分强大,而且应用广泛。我在编写这个程序时出现了许多问题,同时也发现了要编好一个程序就要有一个好的程序设计基础。不仅设计程序,就是任何事都是这样的。还有我们做事要持之以恒,迎难而上,这样才能有所成就。由于专业的需要我还要继续学习单片机,并且我相信我也会在这方面作出成绩,并把单片机灵活应用在学习和工作中。