请问如何在51单片机上实现8路独立计时器?

作者&投稿:犹桦 (若有异议请与网页底部的电邮联系)
如何利用51单片机实现一个计时器?~

方法一:用定时器中断计时模式循环计时。
方法二:用CPU消耗时钟周期指令计时(浪费资源)。
思路:
用定时器中断计时,溢出时形成中断信号,标识为一个基本周期t,所定时间T/t=n为周期循环数,到时形成定时触发信号。

朋友以下是本人历时一个月殚精竭虑自主开发的一个8位51单片机时钟程序,望吾之兄弟姐妹习之,此程序乃采用一键控制,通过感知按下键持续时间的长短来进行调整时间,闹铃,6只共阳数码管输出显示,此外还包括整点铃声功能,在看程序之前我先交代一下运行该程序的硬件要求:12M晶振,P0端口驱动显示,P2.0到P2.5控制显示扫描,P2.7输出铃声,注意:铃声功放三极管应采用pnp管。以下是该程序:
ORG 00H
SETB TR0
JMP START
ORG 000BH
LJMP T0
START: MOV IE,#82H
MOV TMOD,#01H
MOV DPTR,#TAB
MOV SP,#60H
MOV 20H,#0
MOV R0,#0
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,#0
MOV 50H,#0
MOV 51H,#0
MOV 52H,#0
MOV 53H,#0
MOV 54H,#0
MOV 55H,#0
MOV A,TL0
ADD A,0B5H
MOV TL0,A
MOV TH0,#3CH
LOOP: ANL 20H,#08H
UNSV: MOV R1,#0
LCALL DISPLAY
JB 03H,LOP1
LCALL SOUND
LCALL HDLY
LOP1: MOV P3,#0FEH ;按键监视
MOV A,P3
CJNE A,#0FEH,LOP2
MOV R1,#0
JMP LOOP
LOP2: MOV R1,#2 ;误按判断
LOP3: LCALL HD
DJNZ R1,LOP3
JNB 04H,LOOP
CLR 04H
LOP4: INC R1
MOV C,00H ;调秒
CPL C
MOV 00H,C
LCALL HDLY
CJNE R1,#40,LOP5
JMP LOOP
LOP5: JNB 05H,LOP4
CLR 05H
MOV R1,#0
LCALL HD
CLR 00H
JB 04H,TF
MOV R2,#0
MOV R3,#0
JMP LOP4
TF: CLR 04H
LOP6: INC R1
MOV C,01H ;调分
CPL C
MOV 01H,C
LCALL HDLY
CJNE R1,#40,LOP7
JMP LOOP
LOP7: JNB 05H,LOP6
CLR 05H
MOV R1,#0
LCALL HD
CLR 01H
JB 04H,TS
INC R4
MOV R1,#0
CJNE R4,#10,LOP6
MOV R4,#0
INC R5
CJNE R5,#6,LOP6
MOV R5,#0
JMP LOP6
TS: CLR 04H
LOP8: INC R1
MOV C,02H ;调时
CPL C
MOV 02H,C
LCALL HDLY
CJNE R1,#40,LOP9
JMP LOOP
LOP9: JNB 05H,LOP8
CLR 05H
MOV R1,#0
LCALL HD
CLR 02H
JB 04H,TN
INC R6
CJNE R7,#2,NO2
CJNE R6,#4,LOP8
MOV R7,#0
MOV R6,#0
NO2: CJNE R6,#10,LOP8
MOV R6,#0
INC R7
JMP LOP8
TN: CLR 04H ;调闹铃
SETB RS0
CLR RS1
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,#0
NS: INC R1 ;闹铃秒调整
MOV C,00H
CPL C
MOV 00H,C
LCALL HDLY
CJNE R1,#40,NS1
JMP NH2
NS1: JNB 05H,NS
CLR 05H
MOV R1,#0
LCALL HD
CLR 00H
JB 04H,NF
INC R2
CJNE R2,#10,NS
MOV R2,#0
INC R3
CJNE R3,#6,NS
MOV R3,#0
JMP NS
NF: CLR 04H ;闹铃分
NF1: INC R1
MOV C,01H
CPL C
MOV 01H,C
LCALL HDLY
CJNE R1,#40,NF2
LJMP NH2
NF2: JNB 05H,NF1
CLR 05H
MOV R1,#0
LCALL HD
CLR 01H
JB 04H,NH
INC R4
CJNE R4,#10,NF1
MOV R4,#0
INC R5
CJNE R5,#6,NF1
MOV R5,#0
JMP NF1
NH: CLR 04H ;闹铃时调整
NH1: INC R1
MOV C,02H
CPL C
MOV 02H,C
LCALL HDLY
CJNE R1,#40,NH3
NH2: MOV 50H,R2
MOV 51H,R3
MOV 52H,R4
MOV 53H,R5
MOV 54H,R6
MOV 55H,R7
CLR RS0
CLR RS1
LJMP LOOP
NH3: JNB 05H,NH1
CLR 05H
MOV R1,#0
LCALL HD
CLR 02H
JB 04H,NH2
INC R6
CJNE R7,#2,NOT2
CJNE R6,#4,NH1
MOV R6,#0
MOV R7,#0
JMP NH1
NOT2: CJNE R6,#10,NH1
MOV R6,#0
INC R7
JMP NH1
;子程序区
TIMES: CJNE R0,#20,LOOP16
MOV R0,#0
INC R2
CJNE R2,#10,LOOP16
MOV R2,#0
INC R3
CJNE R3,#6,LOOP16
MOV R3,#0
ADMINI: INC R4
CJNE R4,#10,LOOP16
MOV R4,#0
INC R5
CJNE R5,#6,LOOP16
MOV R5,#0
HOUR: INC R6
LCALL SOUND ;整点铃声
CJNE R7,#2,LOOP14
CJNE R6,#4,LOOP16
MOV R6,#0
MOV R7,#0
JMP LOOP16
LOOP14: CJNE R6,#10,LOOP16
MOV R6,#0
INC R7
LOOP16: RET
DISPLAY:MOV P2,#0FFH
MOV A,R2
MOVC A,@A+DPTR
MOV P0,A
MOV C,00H
MOV P2.0,C
MOV P2,#0FFH
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
MOV P2.1,C
MOV P2,#0FFH
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
MOV C,01H
MOV P2.2,C
MOV P2,#0FFH
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
MOV P2.3,C
MOV P2,#0FFH
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
MOV C,02H
MOV P2.4,C
MOV P2,#0FFH
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
MOV P2.5,C
MOV P2,#0FFH
RET
HDLY: MOV 40H,#2
HDL1: MOV 41H,#25
HDL2: MOV 42H,#100
HDL3: DJNZ 42H,HDL4
DJNZ 41H,HDL2
DJNZ 40H,HDL1
JMP HDOT
SOUT: SETB 05H
HDOT: RET
HDL4: MOV P3,#0FEH
MOV A,P3
CJNE A,#0FEH,SOUT
CLR 05H
LCALL DISPLAY
JMP HDL3
HD: MOV 30H,#5
HD1: MOV 31H,#50
HD2: MOV 32H,#100
HD3: LCALL DISPLAY
DJNZ 32H,HD4
DJNZ 31H,HD2
DJNZ 30H,HD1
SETB 04H ;计满标志位
JMP HDOUT
HD4: MOV P3,#0FEH
MOV A,P3
CJNE A,#0FEH,HD3
MOV 33H,#50
HD5: MOV 34H,#100
DJNZ 34H,$
DJNZ 33H,HD5
MOV P3,#0FEH
MOV A,P3
CJNE A,#0FEH,HD3
CLR 04H
HDOUT: RET
SOUND: MOV 30H,#10
SO1: MOV 31H,#100
SO2: MOV 32H,#3
MOV C,P2.7
CPL C
MOV P2.7,C
SO3: MOV 33H,#25
DJNZ 33H,$
DJNZ 32H,SO3
DJNZ 31H,SO2
DJNZ 30H,SO1
RET
T0: PUSH PSW
PUSH ACC
CLR RS1
CLR RS0
MOV A,TL0
ADD A,#0B5H
MOV TL0,A
MOV TH0,#3CH
INC R0
LCALL TIMES
MOV A,R2
CJNE A,50H,TO
SETB 03H
MOV A,R3
CJNE A,51H,TO
MOV A,R7
CJNE A,55H,TO
MOV A,R6
CJNE A,54H,TO
MOV A,R5
CJNE A,53H,TO
MOV A,R4
CJNE A,52H,TO
MOV A,R2
ADD A,R3
ADD A,R4
ADD A,R5
ADD A,R6
ADD A,R7
JZ TO
CLR 03H
TO: POP ACC
POP PSW
RETI
TAB: DB 0C0H 0F9H 0A4H 0B0H 099H
DB 092H 082H 0F8H 080H 090H
END

先挑准一个或者两个时间基数,比如你这8路分别要是 5s 2s 3s 7s 1分钟 6分钟 3分钟 10分钟 ,那么你就选1s和1分钟做时间基数。用tmer0和tmer1分别来实现。比如在tmer0中断中用一个变量x计数,每中断一次,x就自加一(x++),比如:当在tmer0中断里当x为3的时候,就响应3s那路的定时。

51系列有的有3个定时器,工作模式根据情况自选,其实时间基数可以选3个,用tmer加上中断即可处理。

用单片机的PCA模块


51单片机访问内RAM使用什么指令
内部ram分几个区 1.低128B 可以有 mov a,70h 直接寻址 取出70h地址的值 mov r0,#70 用r0或r1间址 mov a,@r0 取出70h的值 2.高128B只能用间址 mov r0,#90h 间址 mov a,@r0 取出90h的值 3.还有sfr(特殊功能寄存器)其地址与高128B重叠,为了区分只能用直接寻址 mov a...

51单片机怎么同时开启两个中断的问题?
高优先级中断执行过程中低的不能执行。中断使能,中断允许即此中断已开启。但CPU不可以同时执行两个中断。所以中断分优先级。要优先于高级中断,再开低级中断。当系统有个定时中断。比如定时采集温度值,然后通过串口发送到上位机。这样程序里要用到定时中断和串口中断。处理了定时中断后,再处理的串口中断...

51单片机中内部的存储有ROM和RAM,我想问,有没有什么方法把数据存进RAM...
你不想让这些数据占用单片机的空间,简单啊。比如让计算机通过串口把数据123传给单片机,然后再让单片机执行MOV @R0,SBUF,这占用的字节和MOV @R0,#123一样多的。或者在外面扩展24C02、AT28C64这样的存储器,那就不占用单片机内部的ROM空间了,但是访问这些存储器需要更多的代码。如果你不想用串口、不...

用51单片机 制作简易电子琴 的两个问题
内部大循环只要把扫描程序等需要不停执行的程序写在 while(1){ 。。。(这里)} 识别按键只要与按键相连的引脚检测到低电平即可 给你一个按键范例:假如按键接到单片机P2^0引脚 sbit K = P2^0;if(K == 0){ delay(5); \/\/延时去抖 if(K == 0) \/\/确定键按下 { while(!K); \/\/判...

51单片机简单的C语言问题
include <reg51.h> sbit P10 = P1^0; \/\/定义I\/O口 sbit P11 = P1^1;sbit P20 = P2^0;sbit P21 = P2^1;void InitT0(); \/\/定时器0初始化函数 bit Flag_TimeOut; \/\/定时时间到标志位 unsigned char T0INT_Count; \/\/定时器0中断计数 void main(){ InitT0();Flag_TimeO...

51单片机定时器问题,题目如图所示,蜂鸣器的位置在P3^6
include<reg52.h> include <intrins.h> define uint unsigned int define uchar unsigned char sbit beep=P2^3;uchar tt;uint fre,flag;void main(){ fre=50000;beep=0;TMOD=0x11;\/\/设置定时器0,定时器1为工作方式1 TH0=(65536-fre)\/256;TL0=(65536-fre)%256;TH1=(65536-50000)\/256;TL1...

关于51单片机IIC总线问题,AT24C02的使用!我想要写一个数据,然后再读出...
给你参考 include<reg51.h> include<intrins.h> define uchar unsigned char sbit SCL=P2^0; \/\/定义端口 sbit SDA=P2^1;\/\/ \/\/启动IIC总线程序 \/\/ void start(void){ SDA=1; \/\/发送起始条件数据信号 _nop_();SCL=1; \/\/发送起始条件的时钟信号 _nop_();_nop_();_nop_();_n...

usb如何连接51单片机,要用到哪些芯片(要考虑到经济问题哦),怎么连接...
看你想怎连接了,PL2303是USB转串口的,可以将单片机链接起来;PDIUSBD12,是专用的USB芯片,是USB通讯的

51单片机定时器问题 TMOD=0x00; 初值算完是4192 我想问TH0 = ? TL0...
在51单片机中,模式0为13位C\/T,最大定时\/计数值为8192。它由TL0的低5位和TH0的8个位组成13位定时器\/计数器TL0的5个位最大为0x1f,也就是十进制的31。那么同样可以用模式1那样的公式来计算初始值,只需要把因子改成32即可:define CNT XXXX \/\/XXXX为需要定时的值 \/\/假定1个机器周期...

51单片机定时器的问题。计算初值。程序的编写问题。设fosc=12MHz。初 ...
单片机定时器的方式一是一个十六位的定时器。但51单片机是8位的,装不下十六位数据,所以,想要用单片机来装一个十六位的数怎么弄?单片机提供了两个寄存器(8位的)来装这个十六位的数。c语言中怎么实现把一个十六位的数装进两个八位的寄存器里?就是:TH1=(65536-50000)\/256;\/\/把(65536-50000...

顺庆区17074597831: 51单片机如何产生8路PWM波 -
豫都康艾: 我来说一下我的方案,这个我验证过,方法如下: 其实用一个定时器就够了,外部中断接按键,一个用来频率加,一个用来频率减,即做调节频率用,8路频率从P0口输出,定时器产生中断,比如1us,那么我到1us时对P0.0取反,同时中断里在...

顺庆区17074597831: 请问51单片机的I/O口外接8个独立的1瓦LED灯泡的电路应该怎么接? ... -
豫都康艾: LED的负极接IO口,例如:P1.0,正极接电源,根据情况接上限流电阻. 然后直接用KEIL软件编一个简单的程序 下载到51单片机上 即可实现.程序很简单 仅仅就是 赋值语句(高低电平)和循环语句.希望对你有帮助.

顺庆区17074597831: 51单片机控制8路伺服电机的程序..下面这个程序是怎么实现的啊?看来半天头有点晕了..求注释.. -
豫都康艾: order1 有 1-16 16种状态 ,每进一次中断改变一次.1-16分别对应 8个口高一次,低一次,高低总时间计数器2700次 比如 d1 高 t1 1500 低时 2700-t1= 1200 出来波形就是 d1 高 (1500) 拉低(1200) d2高(1000) 拉低...d8 高(2000) 拉低(700) d1高(1500)这样循环下去.

顺庆区17074597831: 如何用单片机设计一个八路彩灯控制电路原理图?要求亮的彩灯每次不少于4盏? -
豫都康艾: 应该是单片机最简单的应用,八个输出端口自然可控制八路彩灯,每次可任意控制亮0--8路,调延时程序即可控制点亮时间,每路连入4盏以上的灯...

顺庆区17074597831: 怎样用51单片机同时采集八路方波信号?采集下降沿个数 -
豫都康艾: 以上解答,有的可行,有的不行.个人认为最简单的方式:八路方波接到P0口的八个引脚上.这样,在任一时刻,八路方波的状态都组成了一个字节.在程序中设8个计数变量,保存各路方波的计数值.在程序中不停的查询这个字节,哪一位为0,就把对应该位的计数变量加1.而且,大大节约了查询周期.简化了外围电路.简单的就是最好的.

顺庆区17074597831: 如何用51单片机控制cd4051 八路开关的通断,c语言程序该怎么写~ -
豫都康艾: 4051好像是三条线选线吧!你只要给出使能信号,然后给出线选信号,就可以输出了呀!

顺庆区17074597831: AT89C51单片机8路抢答器课程怎么样设计??? -
豫都康艾: 采用单片机的P1口控制8个发光二级光LED1,LED2,...LED8,P2口控制8个按键K1,K2,K3,...,K8,每个按键分别对应一个发光二级光.例如当K1按下时,LED1点亮,此时其余按键再按下无效.这是硬件的电路实现和基本程序设计思路,具体程序编写就要靠你自己了哈~~

顺庆区17074597831: 求51单片机的控制的八路抢答器的程序 -
豫都康艾: OK EQU 20H;抢答开始标志位RING EQU 22H;响铃标志位ORG 0000HAJMP MAINORG 0003HAJMP INT0SUBORG 000BHAJMP T0INTORG 0013HAJMP INT1SUBORG 001BHAJMP T1INTORG 0040H MAIN: MOV R1,#0FH...

顺庆区17074597831: 如何用单片机设计一个8路的跑马灯?本人急用!!在此表示重谢! -
豫都康艾: #include unsigned char scan_key(); void proc_key(unsigned char key_v); void delayms(unsigned char ms); sbit K1 = P3^4; sbit K2 = P3^5; char code SST516[3] _at_ 0x003b; main() { unsigned char key_s,key_v; key_v = 0x03; P1 = 0xfe; while(1) { ...

顺庆区17074597831: STC89c51RC单片机点动程序怎么写?要单独控制8路的输出.有懂得帮我搞一下 -
豫都康艾: 单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚.⒈ 电源: ⑴ VCC - 芯片电源,接+5V;⑵ VSS - 接地端;⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端.⒊ 控制线:控制线共有4根,⑴ ALE/PROG:地址...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网