锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于51单片机智能计数器的设计

时间:2024-05-10 06:37:10

一、任务以及要求
对外部信号脉冲进行计数,并将脉冲个数显示出来。基本要求:计数至少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 ,#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 D, #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: B 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
        C
DA A
        MOV 69H,A
        MOVA,68H
        ADDCA,#00H
        CLRC
        DAA
        MOV68H,A
        MOVA,67H
        ADDCA
        MOV67H,A
        POP ACC
        R


实习心得
   通过本次单片机实习彻底掌握了MCS-51、8279的结构及工作原理,通过它们使我能够完成智能计数器,对智能计数器的工作原理也有了更深的体会和掌握。学会了巧妙的编程方法,掌握了定时器/计数器的应用。
   就连我自己也不知道为什么,一开始我就对单片机很感兴趣。我觉得每每听万一堂课,我都有一种说不出的高兴,有时也会发愁,因为课程越往后越难学而且讲课进度再加快,但我没有退缩,每周坚持看单片机。就这样一步步走到课程设计,也许是没全身心投入,搞了两天程序才搞出来,结果上机时还是存在着错误,和同组人刘欢讨论和修改后才完成了“智能计数器”这个程序的编写。为了更好的完成软硬件的结合,我查阅了相关资料,最终得到了解决。 转眼间,一周的课程设计过去了。经过这么一个过程我更加深刻的认识了单片机。单片机是编程语言中非常重要的一种。它的功能十分强大,而且应用广泛。我在编写这个程序时出现了许多问题,同时也发现了要编好一个程序就要有一个好的程序设计基础。不仅设计程序,就是任何事都是这样的。还有我们做事要持之以恒,迎难而上,这样才能有所成就。由于专业的需要我还要继续学习单片机,并且我相信我也会在这方面作出成绩,并把单片机灵活应用在学习和工作中。


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。锐单自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章