用8051单片机编写一个闹钟程序,先设置时间,然后中断开始计数,如果时间到了,则报警,但是程序有问题

作者&投稿:旁寇 (若有异议请与网页底部的电邮联系)
单片机做闹钟程序中,如何用定时器中断计时一个时间,闹钟时间到时就响,比如一分钟后就停止响。~

1设置变量
uchar TC_20ms;20毫秒计数
uchar TC_100ms;100毫秒计数
uchar TC_1s;1秒计数
uchar TC_60s;60秒计数
uchar TC_3600s;1小时计数
uchar TF_200ms;20毫秒到时标记
uchar TF_100ms;100毫秒到时标记
uchar TF_1s;1秒到时标记
uchar TF_60s;60秒到时标记
uchar TF_3600s;1小时到时标记

用定时器定时产生20ms定时
void init() interrupt 1
//定时常数=65535-(晶体频率/分频数*定时周期)-20
{
//重装定时器;
TF_20MS=1;
TC_20MS++;
if(TC_20MS==5){TC_20MS=0;
TF_100MS=1;
TC_100MS++;
if(GC_100MS==10)
{TC_100MS=0;
TF_1S=1;
TC_1S++;
if(TC_1S==60){
TC_1S=0;
…………

}
}
}


}
main()
{
unsigned long waiting_time_s=10000;
unsigned long beep_time_100ms=100;
unsigned long sys_time_s;
unsigned long beep_100ms;

//初始化定时器;
while(1)
{
if(TF_1S==1){sys_time_s++;TF_1S=0;}
if(sys_time_s>=waiting_time_s)
{
if(TF_100MS==1){beep_100ms++;TF_100MS=0;}
if(beep_time_100ms>beep_100ms)

beep();//响铃函数
}
}

}
///仅仅是思路,希望有帮助。

问题不是很清晰!
首先,定时器溢出时间较短,需要在定时器中断外另设计数单元;

其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):
1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或CJNE指令;本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。
2) 预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时;但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。

通过了,自己对照看看问题出在哪里。
ORG 00H
LJMP MAIN
ORG 0003H
LJMP EINT0
ORG 0013H
LJMP EINT1
ORG 1BH
LJMP TIMER1
ORG 0100H
MAIN:SETB EA;开所有中断
SETB PX0;使int0为高级中断,start(int0高于1)
SETB PX1;使int1为高级中断,pause
SETB IT0;int0负边沿触发
SETB IT1;int1负边沿触发
MOV SP,#60H;给指针设置初始地址
MOV R0,#00H;初始化R0
MOV R1,#00H
READY:MOV A,#00000011B;开始输入数值,并使用P1.0和P1.1
MOV P1,A
MOV A,P1;读键盘状态
JB ACC.0,L1;若ACC.0为1,跳转至L1,否则个位键按下执行下条指令
LCALL PROM0;若个位键按下,则跳转RPOM0,并返回R0
L1:JB ACC.1,L2;若ACC.1为1,跳转至L2,否则个位键按下执行下条指令
LCALL PROM1;若十位键按下,则跳转RPOM1,并返回R1
L2:MOV DPTR,#DTAB;数据表格起始地址送DPTR
MOV A,R0;把R0里的数给A,用于查表偏移量
MOVC A,@A+DPTR;查表后相应数值给A
MOV P0,A;送P0口显示
MOV A,R1;把R1里的数给A,用于查表偏移量
MOVC A,@A+DPTR;查表后相应数值给A
MOV P2,A;送P2口显示
LCALL READY;跳转回READY检查是否有按键再次按下
DTAB:DB 3FH,06H,5BH,4FH,66H;共阴极数码管从0~9表
DB 6DH,7DH,07H,7FH,6FH
PROM0:LCALL DY12MS;防抖动
INC R0;若个位键按下,则使R0+1
CJNE R0,#0AH,CTN;如果R0=10,则执行下一条指令,否则跳转
MOV R0,#00H;给R0重置0
CTN:RET
PROM1:LCALL DY12MS
INC R1;若个位键按下,则使R1+1
CJNE R1,#06H,CNT;如果R1=6,则执行下一条指令,否则跳转
MOV R1,#00H;给R1重置0
CNT:RET
DY12MS:MOV R7,#18H;延时12MS子程序
DYMS1:MOV R6,#0FFH
DYMS2:DJNZ R6,DYMS2
DJNZ R7,DYMS1
RET
EINT0:PUSH ACC
PUSH PSW
CLR TR1
POP PSW
POP ACC
SETB EX0
RETI
EINT1:ANL TMOD,#0FH;计数器置为方式1,定时器模式,与INT0有关
ORL TMOD,#90H
MOV TH1,#3CH;装入时间常数,0.05S
MOV TL1,#0AFH
MOV B,#0AH;
MOV A,R1;
MUL AB;把十位分乘十
ADD A,R0;
MOV B,#120;0.05s*2*60
MOV R3,A
MOV R4,B
SETB TR1;启T1计数
LOOP:CJNE R4,#00H,LOOP;每当过1分钟后,才进入R3
CJNE R3,#00H,L3;
SETB P3.0;让P3.0口为1,输出高电压给蜂鸣器
LCALL DY2S;让蜂鸣器鸣叫2S
RETI
L3:CLR P3.0;输出低电平,使蜂鸣器不工作
SJMP LOOP

TIMER1:CLR TR1;关计数控制位
DEC R4;
CJNE R4,#00H,L4;R4不为零,则R3不减
DEC R3;
L4:MOV TL1,#0AFH;装入时间常数
MOV TH1,#3CH;
SETB TR1;开计数控制位
RETI
DY2S:MOV R7,#200;延时2S子程序
DY2S1:MOV R6,#20
DY2S2:MOV R5,#124
DY2S3:DJNZ R5,DY2S3
DJNZ R6,DY2S2
DJNZ R7,DY2S1
RET
END


8051单片机c语言编一个程序 8个按键按下显示相应1到8
8 个独立按键?include<reg51.h> define uchar unsigned char define uint unsigned int uchar i;uchar code tab[]={ 0xC0,\/*0*\/ 0xF9,\/*1*\/ 0xA4,\/*2*\/ 0xB0,\/*3*\/ 0x99,\/*4*\/ 0x92,\/*5*\/ 0x82,\/*6*\/ 0xF8,\/*7*\/ 0x80,\/*8*\/ 0x90,\/*9*\/ };sbit key1=P1^0...

8051单片机的数字钟汇编程序
ORG 0000H ;程序执行开始地址 LJMP START ;跳到标号START执行 ORG 0003H ;外中断0中断程序入口 LJMP REMO ;外中断0中断返回 ORG 000BH ;定时器T0中断程序入口 LJMP TIME0 ;跳至INTTO执行 ORG 0013H ;外中断1中断程序入口 RETI ;外中断1中断返回 ORG 001BH ;...

求关于8051单片机程序
\/\/晶振用11".0592MHz,通信波特率选19200 ,或根据蓝牙的波特率修改初始化值 \/\/单片机通过UART通信,接个MAX232芯片连上蓝牙模块的RS232接口就行了 include <reg51.h> include <string.h> unsigned char ch;sbit P10=P1^0;void init_serialcom( void ) \/\/串口通信初始设定 { SCON = 0x50 ; \/\/...

编程题 硬件电路中由8051单片机P1口控制8个放光二极管,编程实现依次...
首先搞清LED管是高电平导通还是低电平导通。如果是低电平导通,P1赋0x00时,发光管全亮,0xff时,全灭。具体程序:define uint unsigned int define uchar unsigned char void delay(uint time_out){ uint i,j;for(i=0;i<time_out;i++){ for(j=0;j<110;j++){;} } } void main(){...

51单片机编程题,用汇编语言怎么做?
在8051单片机的时钟频率为6MHz,那么定时器的计数脉冲周期就是 2uS;sbit CP=P1^0;void Timer0_init(){ TMOD |=0x01; \/\/T0定时器,方式1,采用16位定时器 TH0 = (65536-500)\/256; \/\/定时器装初值500, 即 1000uS 中断一次 TL0 = (65536-500)%256;EA=1; ET0=1; TR0=1;} ...

单片机8051怎么编程?
1、下个keil3软件,新建工程之后,新建文件,写文件名的时候,写.asm后缀的就是写汇编语言,写.c后缀的就是写C语言。2、至于怎么编程,单片机编程,重点就是掌握单片机有哪些I\/o口,哪些寄存器,哪些特殊寄存器。3、推荐看一下视频《十天学会单片机》,搜一下都有的,对初学者非常有帮助。4、另外补充...

设单片机8051的时钟频率为MHZ,试编写Ms的软件延时程序。
一般采用循环结构,达到多次反复执行某一段指令的目的,来增加延时的时间,可以通过对循环次数的控制,来达到控制延时时间长短的目的。为了延长延时时间,一般要采用多重循环,即由外循环内部又含有内循环。延时时间=(内循环时间)×外循环次数。例如:设计一个延时1ms的延时子程序ys1ms,设单片机8051的时钟...

单片机8051与键盘的连接程序(汇编语言)
WAIT: MOV P1,#0FFH ;P1口送高电平 MOV A,P1 ;读P1口 XRL A,#0FFH ;判断是否有低电平 ,即判断是否有按键按下 JZ WAIT ;有低电平继续扫描,否者继续扫描 LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下 MOV A,P1 ;读P1口 CJNE A,#0FEH,NK2 ;如果扫描数...

要在8051单片机片内RAM里存入的一个16位数据,汇编语言怎么写?
在8051单片机片内RAM中存入一个16位数据,汇编指令中没有专门的指令。可以通过以下方法来实现:(加入十六位数为DATA,存入30H31H中)1、用压栈指令实现。MOV SP,#30H PUSH #LOW(DATA)PUSH #HIGH(DATA)或者这样也可以:PUSH #LOW(DATA)PUSH #HIGH(DATA)POP 31H POP 30H 2、用传送指令实现。MOV...

急求基于8051单片机的多功能数字钟的程序
include <AT89X51.H> unsigned char second=0,minute=0,hour=0,max=23; \/\/second秒,minute分,hour时,max时制 \/\/主函 main(){ unsigned char code table[]={0xdd,0x84,0xe9,0xec,0xb4,0x7c,0x7d,0xc4,0xfd,0xfc};unsigned int i;void good();TMOD=0X11; \/\/T0工作于定时...

嘉兴市15875285915: 用8051单片机控制的闹钟的电路图着是一个用8051单片机设计的
查哀阿昔: 1、其中的发光二极管方向反了.其工作方式是:当P1.0=0时,发光管导通.当K4、P3.0同时为1时,另外一个发光管导通. 2、三角型的东西是输入缓冲门,类似于74LS04.如果8031是COMS器件,缓冲还是必需的,这要考虑8031的驱动能力.另一个就是与非门,类似于74LS00. 3、如果按照上述接线,那么红笔标志的是应该改成K4=0. 建议: 1、如果采用普通8031,驱动发光管还是可以的,可以去掉缓冲门. 2、随便用一个口子来判断K4是否为0,通过软件来控制禁闹.这样就可以去掉与非门. 其他的自己考虑吧.

嘉兴市15875285915: 求8051单片机数字钟汇编程序,有闹钟功能的!!!
查哀阿昔: 第一,设置进入闹钟管理界面.(按键一个) 第二,设置时间,可以用一个变量来计算,(这样时间也用一个变量,通过简单算法来计算出时间格式) 第三,确定设置完成. 第四,开启,关闭闹钟. 第五,判断变量是否相等 ...... ...

嘉兴市15875285915: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. -
查哀阿昔: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.

嘉兴市15875285915: 如何拿单片机用C语言编程做一个闹钟? -
查哀阿昔: 下面的程序就是用AT89C2051做的数字式时钟,数码管显示,具有闹钟功能,整点报时,几点蜂鸣器响几下,晚上九点到第二天早上六点整点不报时.给你参考一下吧.#include<AT89X051.h>#include<intrins.h>#define uint unsigned int#define...

嘉兴市15875285915: 求一个用汇编语言编写一个8051单片机的时钟程序(急急急啊) -
查哀阿昔: 给你当参考...不足功能自己改...有问题再发问..;P1.4小时调整 P1.5分种调整 CODE_SEG SEGMENT CODE DATA_SEG SEGMENT DATA STACK_SEG SEGMENT IDATA K1 BIT P1.4 K2 BIT P1.5 RSEG DATA_SEG KEY_S: DS 1 KEY_V: DS...

嘉兴市15875285915: 8051单片机时钟程序 -
查哀阿昔: org 0000h ajmp main org 0030h main: mov dptr,#tab mov 30h,#00h mov 31h,#00h mov 32h,#00h mov 33h,#00h mov 34h,#00h mov 35h,#00h loop: mov r4,#5 tt1: lcall display djnz r4,tt1 lcall update ajmp loop display: mov p3,#0h mov r7,#100 dd1: ...

嘉兴市15875285915: 请高手帮我写个单片机闹钟程序. -
查哀阿昔: #include <reg51.h>#include <intrins.h>#define uchar unsigned char #define uint unsigned int typedef bit by; sbit rs=P2^6; sbit rw=P2^5; sbit lcde=P2^7; uchar code zf[]={" 2011 may 31 "}; uchar code zf1[]={" 00:00:00 "}; uchar code zf2[]={"...

嘉兴市15875285915: 用单片机设计时钟在c程序中怎么在给定的时间闹铃 -
查哀阿昔: 你可以试着在主程序中加入以下程序:if (ARM_hour==当前小时&ARM_min==当前分钟) {调闹钟程序();}

嘉兴市15875285915: 求单片机大神给帮忙编一个带闹钟的电子时钟程序~ -
查哀阿昔: #include <reg51.h> typedef unsigned int uint; typedef unsigned char uchar; sbit DS1302_SDA=P1^0; sbit DS1302_SCK=P1^1; sbit DS1302_RST=P1^2; sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit BEEP=P3^7; ...

嘉兴市15875285915: 求单片机时钟程序 -
查哀阿昔: 自己把按键接口改一下,加一个ROM,这是8051的程序只要改一下就可以用在8031 因为它们的指令系统是一样的 你看着办吧. 要是悬赏分多的话 我可以帮你改.嘎嘎 HOUR EQU 40H ;存放时信息的单元 MINUTE EQU 41H ;存放分信息的单...

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