
我来发一个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单片机制作简易电子钟等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)