求一个51单片机定时闹钟程序。要C语言。能够调时间

求一个51单片机定时闹钟程序。要C语言。能够调时间,第1张

我来发一个C语言51单片机时钟程序,希望能帮到你

/ 程序功能:带定时闹铃时钟                                      /

/---------------------------------------------------------------/

#include <AT89X51H>    /包含器件配置文件/

#define uchar unsigned char

#define uint unsigned int

char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x90,};/0~9的数码管段码/

uchar hour=0,min=0,sec=0;   /时、分、秒单元清零/

uchar deda=0;        /5mS计数单元清零/

bit d_05s=0;               /05秒标志/

uchar set=0;      /模式设定标志/

uchar m=0;

uchar flag=0;      /RAM掉电标志/

void delay(uint k);     /延时函数/

void conv();         /走时单元转换/

void disp();      /走时时间显示函数/

/------------------------走时函数部分 ----------------------/

/定时器T0  5mS初始化/

void init_timer()

{

TMOD=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TR0=1;

}

/---------------------------------/

/5mS定时中断服务函数/

void T0_srv(void) interrupt 1

{

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

}

/----------------------------------/

/时、分、秒单元及走时单元转换/

void conv()

{

if(deda<=100)d_05s=0;

else d_05s=1;

if(deda>=200){sec++;deda=0;}

if(sec==60){min++;sec=0;}

if(min==60){hour++;min=0;}

if(hour==24){hour=0;}

}

/------------------------ 显示函数部分 ----------------------/

/走时时间显示函数/

void disp()

{

P0=DATA_7SEG[hour/10];P2=0xf7;delay(1);

P0=DATA_7SEG[hour%10];P2=0xfb;delay(1);

if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;}

delay(1);

P0=DATA_7SEG[min/10];P2=0xfd;delay(1);

P0=DATA_7SEG[min%10];P2=0xfe;delay(1);

}

/---------------------- 调整时间函数部分 -------------------/

/调整走时时间/

void set_time()

{uchar m;

if(P2_5==0)delay(1);

if(P2_5==0)hour++;

if(hour==24)hour=0;

for(m=0;m<30;m++)

{

disp();

if(P2_2==0)P0_7=0;

else P0_7=1;

delay(1);

}

if(P2_6==0)delay(1);

if(P2_6==0)min++;

if(min==60)min=0;

for(m=0;m<30;m++)

{

disp();

if(P2_2==0)P0_7=0;

else P0_7=1;

delay(1);

}

}

/------------------ 按键扫描、延时等函数部分-------------------/

/走时时间程序函数/

void time()

{

conv();    / 走时单元转换函数  /

disp();    / 走时时间显示函数  /

}

/------------------------------------/

/扫描按键函数/

void scan_key()

{

delay(1);

if(P2_4==0)set++;

if(set>=2)set=0;

if(set==1)flag=0x55;

F0:if(P2_4==0)goto F0; /按键未释放,在此等候/

}

/------------------------------/

/延时函数/

void delay(uint k)

{

uint i,j;

for(i=0;i<k;i++){

for(j=0;j<121;j++)

{;}}

}

/----------------------- 主函数 ------------------------- /

/主函数/

void main()

{

init_timer();             /定时器T0初始化/

while(1)     /无限循环/

{

if(P2_4==0)scan_key();   /有按键,调用按键扫描函数/

switch(set)      /根据set键值散转/

{

case 0:time();  break;    /走时时间程序/

case 1:set_time();break;       /走时时间调整/

default:break;     /其它退出/

}

if(flag!=0x55)          /判断掉电标志/

{

P0=0xc0; P2=0xc0; delay(100);

P2=0xff; delay(400);

}

}

}

单片机程序是基于硬件基础上开发的,你至少添加注释和硬件环境说明,不然大家都不知道怎么帮你。

你直接给出代码,也不清楚需要指正什么,这里也没有设置时间/闹钟的代码,发文前应该清楚表达要问的内容。

1)假设你的晶振是12MHz,那一个机器周期是1MHz,定时器的最长定时周期是(65535/10^6)你想要1/6秒触发一次中断就必须结合软件计时,为了尽量精确:硬件计时40000次,软件计时25次那么定时器的设这应该是TH1=(65535-40000)%256;TL1=(65535-40000)%256,(注意计数器大部分是加法计数)

2)按键监听没有给出思路,也没有处理按键抖动,我只能分析程序:

有一个外部中断触发时间设置,P34设置小时、P35设置分钟,但是调整时间后没有进行显示,你至少要让数码管显示结果才能知道怎么调整。

我自己做的一个课程设计,程序运行已经成功了:

汇编程序如下:

ORG 0000H

AJMP main

ORG 000BH ;定时器0的中断向量地址

AJMP TIME0 ;跳转到真正的定时器程序处

ORG 30H

main:

mov dptr,#k1;

start:

MOV P0,#00H           ;中断预处理程序

MOV P1,#00H

MOV P3,#00H ;关所有灯

MOV R0,#00H ;软件计数器预清0

MOV R7,#00H

MOV R6,#00H

MOV TMOD,#00000001B ;定时/计数器0工作于方式1

MOV TH0,#3CH

MOV TL0,#0B0H ;即数15536

SETB EA  ;开总中断允许

SETB ET0 ;开定时/计数器0允许

SETB TR0 ;定时/计数器0开始运行

LOOP:     ;判断时钟进位程序

MOV A,R1

CJNE A,#60,LOOP1 ;R1等于60吗?

MOV R1,#0

INC R2      ;R1等于60那么R2加一,R1清0

MOV A,R2

CJNE A,#60,LOOP1 ;R2等于60吗?

MOV R2,#0

INC R3      ;R2等于60那么R3加一,R2清0

MOV A,R3

CJNE A,#24,LOOP1 ;R3等于24吗?

MOV R3,#0

;R3等于24那么R3清0

LOOP1:

mov a,r2       ;如果分钟显示为0,报警

cjne a,#01H,LOOP2

mov a,r1

cjne a,#00H,LOOP3

clr p20

LOOP3:

mov a,r1       ;如果秒钟显示为1,取消报警

cjne a,#05H,LOOP2

setb p20

LOOP2:           ;显示数据处理

MOV A,  R1        ;取来8位二进制数

MOV B, #100

DIV AB            ;除以100

MOV A, B          ;取回余数

MOV B, #10

DIV AB            ;再除以10

MOV R4, A         ;商是十位数,存放到R4

MOV R5, B         ;余数是个位,存放到R5

MOV 42H,R4

mOV 41H,R5

;R1的BCD码放入41-42H单元

MOV A,  R2        ;取来8位二进制数

MOV B, #100

DIV AB            ;除以100

MOV A, B          ;取回余数

MOV B, #10

DIV AB            ;再除以10

MOV R4, A         ;商是十位数,存放到R4

MOV R5, B         ;余数是个位,存放到R5

MOV 44H,R4

MOV 43H,R5

;R2的BCD码放入43-44H单元

MOV A,  R3        ;取来8位二进制数

MOV B, #100

DIV AB            ;除以100

MOV A, B          ;取回余数

MOV B, #10

DIV AB            ;再除以10

MOV R4, A         ;商是十位数,存放到R4

MOV R5, B         ;余数是个位,存放到R5

MOV 46H,R4

mov 45H,R5

;R3的BCD码放入45-46H单元

L1:

mov a,41h

movc a,@a+dptr

mov 51h,a

mov a,42h

movc a,@a+dptr

mov 52h,a

mov a,43h

movc a,@a+dptr

mov 53h,a

mov a,44h

movc a,@a+dptr

mov 54h,a

mov a,45h

movc a,@a+dptr

mov 55h,a

mov a,46h

movc a,@a+dptr

mov 56h,a      ;将显示代码送入51H--56H

display:  ;显示程序

mov p0,#0ffH;一

mov p0,51H

mov P1,#0feH

acall delay1S

mov p1,#0ffH

mov p0,#0ffH;二

mov p0,52h

mov P1,#0fdH

acall delay1S

mov p1,#0ffH

mov p0,#0ffH;三

mov p0,53h

mov P1,#0fbH

acall delay1S

mov p1,#0ffH

mov p0,#0ffH;四

mov p0,54h

mov P1,#0f7H

acall delay1S

mov p1,#0ffH

mov p0,#0ffH;五

mov p0,55h

mov P1,#0efH

acall delay1S

mov p1,#0ffH

mov p0,#0ffH;六

mov p0,56h

mov P1,#0dfH

acall delay1S

mov p1,#0ffH

;将51H-56H数据显示,

AJMP LOOP ;工作处理程序

TIME0: ;定时器0的中断处理程序

INC R7

MOV A,R7

CJNE A,#20,T_RET ;R7单元中的值到了20了吗

T_L1:

INC R1 ;到了20那么R1+1

MOV R7,#0 ;清软件计数器

T_RET:;二十分之一秒时的程序

inc r6

mov a,r6

cjne r6,#3,T_over   ;调节时间的延迟时间

mov r6,#0

jb p21,T_over1

mov a,r2

add a,#1

cjne a,#60,T_tiao1

mov a,#0

T_tiao1:

mov r2,a

T_over1:

jb p22,T_over

mov a,r3

add a,#1

cjne a,#24,T_tiao2

mov a,#0

T_tiao2:

mov r3,a

T_over:

MOV TH0,#3CH

MOV TL0,#0B0H ;如果没到一秒重置定时常数

reti

delay1s:  MOV 31H,#100

D1:  MOV 32H,#30

D2:  DJNZ 32H,D2

DJNZ 31H,D1

RET

delay2s:  MOV 33H,#255

D3:  MOV 34H,#255

D4:  DJNZ 34H,D4

DJNZ 33H,D3

RET

K1:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

END

给你ds18b20温度传感器代码你参考,我的空间还有些资料

/

//DS18B20温度传感器//

//作者:jammylee

//日期:2008-2-25

//版本:V10

//晶振:12MHZ

/

//包含头文件

#include<reg51h>

#include<stdioh>

//

typedef unsigned char uint8; //定义八位无符号变量

//

//定义引脚(根据硬件改变)

sbit highbit = P2^7;

sbit lowbit = P2^6;

sbit DQ = P3^0; //温度传感器数据引脚通信定义

//

unsigned char Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义数字显示数组

//0, 1, 2 3 4 5 6 7 8 9

//

//定义延时子函数

void mDelay(uint8 Delay)

{

while(Delay--);

}

//

//温度传感器DS18B20的初始化函数

Init_DS18B20(void)

{

uint8 x = 0;

DQ = 1; //DQ复位信号

mDelay(8); //延时

DQ = 0; //将DQ电平拉低

mDelay(80); //延时大于480us

DQ = 1; //将DQ电平拉高

mDelay(14); //延时

x = DQ; //如果x=0则初始化成功,x=1则初始化失败

mDelay(20); //延时

}

//

//读一个字节

ReadOneChar(void)

{

uint8 i = 0;

uint8 dat = 0;

for(i=8;i>0;i--)

{

DQ = 0; //低电平脉冲信号

dat>>=1; //dat右移一位

DQ = 1; //高低平脉冲信号

if(DQ)

{

dat |= 0x80;

}

mDelay(4);//延时

}

return(dat); //返回dat值

}

//

//写一个字节

WriteOneChar(uint8 dat)

{

uint8 i = 0;

for(i=8;i>0;i--)

{

DQ = 0; //低电平脉冲信号

DQ = dat&0x01;

mDelay(5);//延时

DQ = 1; //高电平脉冲信号

dat >>= 1;//dat右移一位

}

mDelay(4);

}

//

//读取温度

ReadTemperature(void)

{

uint8 L = 0; //定义温度高八位

uint8 H = 0; //定义温度低八位

uint8 temp = 0;

Init_DS18B20(); //温度传感器DS18B20初始化

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

L = ReadOneChar(); //读取温度值低位

H = ReadOneChar(); //读取温度值高位

L = L>>4;

temp = H<<4;

temp = temp|L;

return(temp);

}

//

//温度显示函数

void DisplayTemperture(uint8 temp)

{

P0 = Code[temp%10];

lowbit = 0;

mDelay(100);

lowbit = 1;

P0=Code[temp/10];

highbit = 0;

mDelay(100);

highbit = 1;

}

//

//主函数

void main(void)

{

uint8 temp;

while(1) //主循环

{

temp = ReadTemperature();

DisplayTemperture(temp);

}

}

#include <AT89X51H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义显示用的段码

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义显示用的位码

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //定义显示缓冲区

unsigned char dispbitcnt; //定义显示的位

unsigned char second; //定义秒

unsigned char minite; //定义分钟

unsigned char hour;//定义小时

unsigned int tcnt;//定义定时累加器

unsigned char mstcnt;//定义毫秒累加器

unsigned char i,j;

void main(void) //主函数

{

TMOD=0x02; //设置定时器工作模式

TH0=0x06; //设置初值

TL0=0x06;

TR0=1; //开定时器

ET0=1; //开定时器中断

EA=1; //开总中断

while(1)

{

if(P0_0==0) //判断P00口的按键是否按下

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);//延时消抖

if (P0_0==0) //判断按键真的按下了

{

second++; //秒加1

if(second==60) //秒加到60?

{

second=0; //秒清零

}

dispbuf[0]=second%10; //取秒的个位放在显示缓冲

dispbuf[1]=second/10; //取秒的十位放在显示缓冲

while(P0_0==0); //等待,知道按键松开

}

}

if(P0_1==0) //p01的按键按下,设置分钟,请参考秒的程序,一样的

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_1==0)

{

minite++;

if(minite==60)

{

minite=0;

}

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

while(P0_1==0);

}

}

if(P0_2==0) //p02的按键按下,设置小时,请参考秒的程序,一样的

{

for(i=5;i>0;i--)

for(j=248;j>0;j--);

if(P0_2==0)

{

hour++;

if(hour==24)

{

hour=0;

}

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

while(P0_2==0);

}

}

}

}

void t0(void) interrupt 1 using 0 //定时器中断函数

{

mstcnt++; //累加器加一

if(mstcnt==8) //计时满8毫秒?

{

mstcnt=0; //累加器清零

P1=dispcode[dispbuf[dispbitcnt]]; //送显示段码

P3=dispbitcode[dispbitcnt]; //送显示位码

dispbitcnt++; //显示位加1

if(dispbitcnt==8) //8位都显示完了?

{

dispbitcnt=0; //从第一位开始显示

}

}

tcnt++; //累加器加一

if(tcnt==4000) //记满1秒

{

tcnt=0; //累加器清零

second++; //秒加一

if(second==60) //秒满60?

{

second=0; //秒清零

minite++; //分钟加一

if(minite==60) //分钟满60

{

minite=0; //分钟清零

hour++; //小时加1

if(hour==24) //小时满24

{

hour=0; //小时清零

}

}

}

dispbuf[0]=second%10; //将时分秒的个位与十位分开,装在显示区

dispbuf[1]=second/10;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

}

}

其实这个程序不难,仔细想想,有不懂的再问我吧

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;系统名称: 数字钟

;创健人:济南, 日期:2005619

;系统功能描述:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;修改人: 修改日期:

;修改原因:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;蕊片型号:AT89C51 晶振:12MHZ

;-------------硬件连接---------------------

;

;

;-----------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称: 声明区

;功能描述: 声明各常量和变量

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SECOND EQU 30H ;存储妙

MINITE EQU 31H ;存储分

HOUR EQU 32H ;存储时

SPEAKER BIT P37

HOURK BIT P32 ;时键

MINITEK BIT P33 ;分键

SECONDK BIT P30 ;妙键

FLAG BIT 00H

FLAG1S BIT 01H ;1S到标志位

DISPBUF EQU 40H ; 段选标志

DISPBIT EQU 48H ; 位选通标志

T2SCNTA EQU 49H ; 中断次数

T2SCNTB EQU 4AH ; 中断次数

TEMP EQU 4BH ; 初始化位

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:主程序

;功能描述;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0 ;T0中断入口

START: MOV SECOND,#00H ;妙初始化0

MOV MINITE,#00H ;分初始化0

MOV HOUR,#12 ;时始化送12

MOV DISPBIT,#00H ;位选通标志

MOV T2SCNTA,#00H ;标志

MOV T2SCNTB,#00H ;标志

CLR FLAG

CLR FLAG1S

SETB SPEAKER

MOV TEMP,#07FH ;初始位,让第一个位选通

LCALL DISP ;调用显示处理程序

MOV TMOD,#01H ;方式1

MOV TH0,#0F8H ;赋值20MS

MOV TL0,#030H

SETB TR0 ;开中断启动

SETB ET0

SETB EA

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:按键程序

;功能描述;调整分,时

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

WT: JNB FLAG,CC

LCALL SPEAKING

CC: JB SECONDK,NK1 ;妙末按下,转去判断分键

LCALL DELY10MS ;按下,延时,消抖动

JB SECONDK,NK1 ;再次判断是否按下

INC SECOND ;按下,按下一次加1

MOV A,SECOND ;送A判断

CJNE A,#60,NS60 ;妙末到60转分

MOV SECOND,#00H ;到了,回0

NS60: LCALL DISP

JNB SECONDK,$ ;等待妙键释放

NK1: JB MINITEK,NK2 ;跟妙键分析相似

LCALL DELY10MS

JB MINITEK,NK2

INC MINITE

MOV A,MINITE

CJNE A,#60,NM60

MOV MINITE,#00H

NM60: LCALL DISP

JNB MINITEK,$

NK2: JB HOURK,NK3 ;时键

LCALL DELY10MS

JB HOURK,NK3

INC HOUR

MOV A,HOUR

CJNE A,#24,NH24

MOV HOUR,#00H

NH24: LCALL DISP

JNB HOURK,$ ;等待时键释放

NK3: LJMP WT ;返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:显示处理程序

;功能描述;,该程序实现时,分,秒计时转换为BCD码并存储在以47H起始地址的显示

;输出数据存储单元里,即显示缓冲区47H至40H单元

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DISP:

MOV A,#DISPBUF ;送40H

ADD A,#7 ;加8

;DEC A

MOV R1,A ;送47H

MOV A,HOUR ;送时

MOV B,#10

DIV AB

MOV @R1,A ;存储时十位

DEC R1 ;指向时个位

MOV A,B ;送时个位

MOV @R1,A ;存储时个位

DEC R1

MOV A,#10

MOV @R1,A

DEC R1

MOV A,MINITE ; 送分,处理与时处理类似

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

MOV A,#10

MOV @R1,A

DEC R1

MOV A,SECOND ;送秒

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:显示程序

;功能描述;在LED上显示为12-12-12显示模式

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INT_T0:

MOV TH0,#0F8H ;重赋值

MOV TL0,#030H

MOV A,#DISPBUF ;段偏移存储

ADD A,DISPBIT ;位偏移量

MOV R0,A ;段偏移存储

MOV A,@R0 ;段偏移量

MOV DPTR,#TABLE ;指向字形表

MOVC A,@A+DPTR ;取字形

MOV P0,#0 ;防闪烁

MOV P0,A ; 字形选P1口显示

MOV A,DISPBIT ;位移偏量

MOV DPTR,#TAB ;指向位选

MOVC A,@A+DPTR ;取位选通

MOV P2,A ;位送P3口选通

INC DISPBIT ;位偏移加1

MOV A,DISPBIT ;位偏移送A

CJNE A,#08H,KNA ;八个数管码扫描完不

MOV DISPBIT,#00H ;描完重新开始

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:1秒计时程序

;功能描述;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KNA: INC T2SCNTA

MOV A,T2SCNTA

CJNE A,#100,DONE

MOV T2SCNTA,#00H

INC T2SCNTB

MOV A,T2SCNTB

CJNE A,#05H,DONE

SETB FLAG1S

MOV T2SCNTB,#00H

INC SECOND ;秒加1

MOV A,SECOND

CJNE A,#50,BB ;50S到

MOV A,MINITE

CJNE A,#59,BB ;59分

SETB FLAG ;打开正点响标志

BB: MOV A,SECOND

CJNE A,#60,NEXT ;秒超过60了没有 没有,调用显示处理程序

MOV SECOND,#00H

INC MINITE ;分加1

MOV A,MINITE

CJNE A,#60,NEXT

MOV MINITE,#00H ;分超过60,清0

INC HOUR ;并时加1

MOV A,HOUR

CJNE A,#24,NEXT ;是否超过24小时不是,则跳至NEXT

MOV HOUR,#00H

NEXT: LCALL DISP ; 调用显示处理程序

DONE: RETI ;中断返回

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;0到9字形(40表示横扛)

TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:正点报时子程序

;功能描述; 前十秒报第一声,每隔一秒报一声

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPEAKING:MOV R5,#6

AA: CLR SPEAKER

JNB FLAG1S,$ ;延时1S

CLR FLAG1S

SETB SPEAKER

JNB FLAG1S,$

CLR FLAG1S

DJNZ R5,AA

CLR FLAG

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:延时子程序

;功能描述;按键消抖调用

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELY10MS:MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

TIMER0:

CLR TR0

PUSH ACC

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

INC 30H

MOV A,30H

CJNE A,#20,JIXU

MOV 30H,#0

INC MIAO

MOV A,MIAO

CJNE A,#60,JIXU

MOV MIAO,#0

INC FEN

MOV A,FEN

CJNE A,#60,JIXU

MOV FEN,#0

INC HOUR

MOV A,HOUR

CJNE A,#24,JIXU

MOV HOUR,#0

JIXU: POP ACC

RETI

以上就是关于求一个51单片机定时闹钟程序。要C语言。能够调时间全部的内容,包括:求一个51单片机定时闹钟程序。要C语言。能够调时间、51单片机 c语言写的电子时钟程序 请帮忙指正!、如何用51单片机制作简易电子钟等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10140606.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存