单片机电子钟程序

作者&投稿:闵往 (若有异议请与网页底部的电邮联系)
一个51单片机电子钟程序,求详细的解释啊急急急!!!~

#include
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;
}
}



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

#include
#define uchar unsigned char //定义unsigned int为uint
#define uint unsigned int //定义unsigned uchar为uchar

sbit LCD_RS = P2^0 ;
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
sbit D_SDA = P2^6; //定义74HC164数据线为P2.6端口
sbit D_SCL = P2^7; //定义74HC164数据线为P2.7端口
sbit CLK = P1^3; /*实时时钟时钟线引脚 */
sbit IO = P1^4; /*实时时钟数据线引脚 */
sbit RST = P1^5; /*实时时钟复位线引脚 */

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};


//========= 延时函数 ============
//延时时间以1ms为单位
//s决定延时时间长短
void delay_ms(uint s)
{
uint x;
for(s;s>0;s--)
{
x = 200;
while(x--);
}
}

//========= 送出一个字节给74HC164(实现串并转换) ==========
void send_out(unsigned char out)//传送一个字节8位
{
uchar i;
D_SCL = 0;
for (i=8;i>=1;i--)
{
D_SDA = out&0x80; //送数据到数据口
D_SCL = 1; //时钟线置1
D_SCL = 0; //送一时钟
out<<=1; //左移
}
}

//========= 写命令函数 ==========
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
send_out(cmd);
LCD_EN = 1;
LCD_EN = 0 ;
}

//========= 写数据函数 ==========
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
send_out(dat);
LCD_EN = 1;
LCD_EN = 0;
}

//========= LCD初始化函数 ==========
void lcd_init()
{
lcd_wcmd(0x38);
delay_ms(1);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(1);
lcd_wcmd(0x06); //向右移动光标
delay_ms(1);
lcd_wcmd(0x01); //清除LCD显示屏
delay_ms(1);
}

//========== 往DS1302写入1Byte数据 (内部函数) =============
void w_byte(uchar dat)
{
uchar i;
for(i=8; i>0; i--)
{
IO = dat & 0x01;
CLK = 1;
CLK = 0;
dat = dat >> 1;
}
}

//======== 从DS1302读取1Byte数据 (内部函数) ===================
uchar r_byte(void)
{
uchar i;
for(i=8; i>0; i--)
{

ACC = ACC >> 1;
ACC7 = IO;
CLK = 1;
CLK = 0;

}
return(ACC);
}


//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============
void write_byte(uchar addr, uchar dat)
{
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
w_byte(dat);
CLK = 1;
RST = 0;
}

//========== 指定地址往DS1302读1Byte数据 (内部函数) =============
uchar read_byte(uchar addr)
{
uchar ucData;
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
ucData = r_byte();
CLK = 1;
RST = 0;
return(ucData);
}

//============ 设置ds1302日期和时间 =============
void write_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x80;
write_byte(0x8e,0x00); // 控制命令,WP=0,写操作
for(i =7; i>0; i--)
{
write_byte(addr,*p); // 秒 分 时 日 月 星期 年
p++;
addr +=2;
}
write_byte(0x8e,0x80); // 控制命令,WP=1,写保护
}

//============ 读ds1302当前日期和时间 =============
void read_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x81;
for (i=0; i<7; i++)
{
*p = read_byte(addr); //格式为: 秒 分 时 日 月 星期 年
addr += 2;
p++;
}
}

//============ 显示函数 ===================
void lcd_disp()
{
uchar addr = 4;
lcd_wcmd(0x80 + addr);
lcd_wdat(((time[2]>>4)&0x0f)+0x30); //显示小时
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[2]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //显示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[1]>>4)&0x0f)+0x30); //显示分
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[1]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //显示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[0]>>4)&0x0f)+0x30); //显示秒
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[0]&0x0f)+0x30);

addr = 2;
lcd_wcmd(0xc0 + addr); //在第二行显示年月日和星期
lcd_wdat('2'); //显示2
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat('0'); //显示0
addr++;

lcd_wdat(((time[6]>>4)&0x0f)+0x30); //年
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[6]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[4]>>4)&0x0f)+0x30); //显示月
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[4]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[3]>>4)&0x0f)+0x30); //显示日
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[3]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat((time[5]&0x0f)+0x30); //显示星期
}

//=========== 主函数 ===============
void main()
{
lcd_init(); // 初始化LCD
write_ds1302(time);
while(1)
{
read_ds1302(time); //读DS1302数据
lcd_disp(); //LCD显示
delay_ms(500); //延时0.5秒
}
}

这是一个电子时钟,在LCD1602上显示,时钟芯片是DS1302

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;20h.1半点标示位
;20H.2闹钟设置中........标示,为了显示区别用
;20H.3闹钟设置时间CHECK到,使能标志位
;20H.5开/关闹钟设置中........标示;
;20H.6闹钟1开关标志位
;20H.7闹钟2开关标志位
;psw.5用来做显示开关标志位
;21,22,23,24这里设置第一个闹钟的时间
;25,26,27,28这里设置第二个闹钟的时间
;29H
;P0口输出数码管段码,
;P2口 输出位选信号
;
;70H存放P1.0--3按钮值,
;71H--78H存放当前系统定时时间;
;78H 77H 76H 75H 74H 73H 72H 71H
; 星期* 小时 分钟 秒钟
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ts equ 24h ;这里设置`24小时周期制
trr equ #0bbh ;这个是温度,晶振等的时间补偿值,
org 0000h ;定时太慢此值调大,定时太快调小;
jmp main
;org 0bh ;定时器0中断入口矢量
;jmp bz
org 1bh ;定时器1中断入口矢量
jmp t1int
org 0100h ;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:clr p3.0; ;关继电器
mov sp,#30h
mov r3,#20
mov tmod,#10h
;mov tl0,#06h ;定时器1,方式1,定时 50 MS;
;mov th0,#06h
mov tl1,#0b0h
mov th1,#3ch
mov ie,#88h ;开定时器1中断
;mov 65h,#5
; mov 66h,#100
;mov 64h,#4
;clr psw.5
clr p3.0
setb pt1 ;设置T1为高优先级中断
;setb tr1
clr tr1 ;开启T1中断
acall send ;71h--78h 清零;
acall send1 ;20h--29h 清零;
dd: acall daa ;进行十进制调整71H-79H
;acall compare ;第一闹钟
;acall compare1 ;第二闹钟 设置值
;acall sound
acall disp ;数码管显示,78H--71H分别对应着8个数码管显示
acall key_scanf ;按钮控制
acall time_adj ;时间调整
acall lasttime ;调用上一次的设置值为当前定时值
;acall alarm1_set ;设置定时开/关闹钟
ajmp dd

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;调用上次值为设置时间
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lasttime:push acc
mov a,70h
jnb acc.2,return1
clr p3.0; 紧急暂停按钮,按下后暂停,并把上次设定值恢复.
clr tr1
mov 73h,21h
mov 74h,22h
wait7:acall disp
acall key_scanf
mov a,70h
jnb acc.0,wait7
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
setb tr1
setb p3.0
return1:pop acc
ret

daa: push acc ;对当前系统时间进行十进制调整
mov 71h,79h
mov r1,#71h
cjne @r1,#10,s2
mov 71h,#0h
mov 79h,#0
inc 72h
mov r1,#72h
cjne @r1,#6,s2
mov 72h,#0h
dec 73h
mov r1,#73h
cjne @r1,#255,s2
dec 74h
mov 73h,#9
s1: pop acc
ret
s2: mov r1,#73h
cjne @r1,#0,s1
mov r1,#74h
cjne @r1,#0,s1
clr p3.0
clr tr1
sjmp s1

h_half: ;半点CHECK
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#29h,o25 ;CHECK 当前时间是否为29分钟
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
cjne a,#59h,o25 ;CHECK 当前时间为59秒?
setb tr0 ;启动T0
setb 20h.1 ;enable 半点flag bit
o25: xchd a,@r1
ret
compare: ;闹钟1设置时间与当前时间比较
push acc
jnb 20h.6,nequ ;闹钟1开/关标志位
mov a,73h
cjne a,21h,nequ ;分低位
mov a,74h
cjne a,22h,nequ ;分高位
mov a,75h
cjne a,23h,nequ ;小时低位
mov a,76h
cjne a,24h,nequ ;小时高位
setb 20h.3 ;到闹钟设置时间,使能闹钟报警标志位
nequ:pop acc
ret

compare1: ;闹钟2设置时间与当前时间比较
push acc
jnb 20h.7,nequ33 ;闹钟2开/关标志位
mov a,73h
cjne a,25h,nequ33
mov a,74h
cjne a,26h,nequ33
mov a,75h
cjne a,27h,nequ33
mov a,76h
cjne a,28h,nequ33
setb 20h.3 ;到闹钟设置时间,使能闹钟报警标志位
nequ33:
pop acc
ret

sound:
acall h_half ;check 是否半点?
jb 20h.1,s23 ;半点则返回
jb 20h.0,s23
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#59h,s25
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
s20: cjne a,#56h,s21
ajmp s26
s21: cjne a,#58h,s22
ajmp s26
s22: cjne a,#59h,s25
setb tr0
ajmp s26
s25: xchd a,@r1
s23: ret
s26: jb 20h.0,s25
setb tr0
xchd a,@r1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序,报时铃音信号输出
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bz: djnz 64h,rrr
jb 20h.3,alarmsign;闹钟到点报时有效
jb 20h.1,next ;半点报时
mov 64h,#4 ;0.5KHZ
ajmp justh
alarmsign:
mov 64h,#1; 2KHZ信号
justh:
djnz 66h,ccc
mov 66h,#100
djnz 65h,ccc ;产生1000次中断后关中断
mov 65h,#5 ;响0.5秒
setb 20h.0
clr tr0
reti

next:mov 64h,#2 ;1KHZ信号,半点报时音
ccc: jb 20h.3,cc
cpl p1.4 ;半点报时输出声音信号
rrr: reti
cc: cpl p1.4 ;闹钟报时输出声音信号
reti

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中断服务程序,定时器主时钟;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

t1int:
clr ea
mov tl1,trr
mov th1,#3ch
djnz r3,sd ;20*50MS=1S
mov r3,#20
;cpl p1.4
inc 79h
clr 20h.0
clr 20h.1 ;半点报时标志清零
jb 20h.3,sdd ;闹钟CHECK有效与否?
clr tr0 ;关T0
sd: setb ea
reti
sdd: setb tr0 ;开T0,即开闹铃声音
setb ea
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示子函数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dispnum1:; 显示
ajmp disp_num
disp:
push acc
;jb 20h.5,dispnum1;开/关闹钟设置中界面...........
;jb 20h.2,alarmcheck;闹钟设置时间中界面..........
jb psw.5,closedisp
mov r2,#01h;位选通信号输出到P2口
mov r5,#2; 显示的位数循环控制
mov r0,#73h;分别取出内存76H-71H
cjne r3,#10,dot1;在小时和分之间闪烁DOT point
dot1:jnc dsp1
orl 73h,#10h
;dot1:cjne r3,#11,dsp1
;anl 73h,#0efh
dsp1:mov a,r2
;cpl a
mov p2,a
mov a,@r0
dsp2:mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp1
anl 73h,#0efh
pop acc
ret
closedisp:; 关显示
acall delay
mov p0,#0ffh
mov p2,#0
pop acc
ret

;;;;;;;;;;;;;;;;;闹钟的定时设置显示
alarmcheck:
mov r2,#01h
mov r5,#2 ;两位显示22-21H对应定时设置值
mov r0,#21h
dsp21:
mov a,r2
;cpl a
mov p2,a
mov a,@r0
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp21
pop acc
ret
bcd:; 共阳接法数码管段码表
db 0c0h,0f9h,0a4h,0b0h
db 99h,92h,82h,0f8h
db 80h,90h,88h,83h
db 0c6h,0a1h,86h,8eh; 不带小数点七段
db 40h,79h,24h,30h,19h
db 12h,02h,78h,00h,10h
db 0ffh,0bfh,7fh,3fh; 带小数点七段
delay:mov r6,#4h
tm: mov r4,#0h
ee: djnz r4,ee; 延时2048US=2MS
djnz r6,tm
ret

send:mov r7,#9; 初始化设置
mov r0,#71h
mov a,#0h
ss: mov @r0,a
inc r0
djnz r7,ss
mov 78h,#1h
mov 77h,#01ah
;mov 71h,#1
;mov 72h,#2
;mov 73h,#3
;mov 74h,#4
ret
send1:; 初始化
mov r7,#10
mov r0,#20h
mov a,#0
ss1: mov @r0,a
inc r0
djnz r7,ss1
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;开/关闹钟界面显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
disp_num:
mov p2,#0f7h
mov a,29h ;当前要操作的闹钟号码
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
pop acc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key_scanf:; 按钮处理
push acc
mov 70h,#0
orl p1,#0fh
mov a,p1
cpl a
anl a,#07h
jz nokey1
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jz nokey1
mov 70h,a
key_wait:; 等按钮放下
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jnz key_wait
mov a,70h
jnb acc.1,nokey1
cpl psw.5
nokey1:; 无按钮
pop acc
ret

a_on_off:
jnb 29h.0,iii
cpl 20h.6
iii: jnb 29h.1,out_2
cpl 20h.7
out_2:
ajmp alarmnum
alarmnum:
setb 20h.5
acall daa
acall disp
acall key_scanf
clr 20h.5
mov a,70h
jb acc.0,a_on_off
jb acc.1,alar_adj_1
jb acc.2,a_num_inc
acall numb
ajmp alarmnum
alarm1_set:
push acc
mov a,70h
jb acc.1,alarmnum
alarm1_out:
clr 20h.2
pop acc
ret
a_num_inc:
inc 29h
mov a,29h
anl a,#0fh
cjne a,#3,alarmnum
anl 29h,#0
ajmp alarmnum
alar_adj_1:
setb 20h.2
acall daa
orl 21h,#10h
acall disp
anl 21h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_1
jb acc.2,minc_1
ajmp alar_adj_1
madj_2:
acall daa
orl 25h,#10h
acall disp
anl 25h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_2
jb acc.2,minc_2
ajmp madj_2
hadj_1:
acall daa
orl 23h,#10h
acall disp
anl 23h,#0fh
acall key_scanf
mov a,70h
jb acc.1,madj_2
jb acc.2,hinc_1
ajmp hadj_1
hadj_2:acall daa
orl 27h,#10h
acall disp
anl 27h,#0fh
acall key_scanf
mov a,70h
jb acc.1,alarm1_out
jb acc.2,hinc_2
ajmp hadj_2
minc_1:
inc 21h
mov r1,#21h
cjne @r1,#10,alar_adj_1
mov 21h,#0
inc 22h
mov r1,#22h
cjne @r1,#6,alar_adj_1
mov 22h,#0h
ajmp alar_adj_1
minc_2:
inc 25h
mov r1,#25h
cjne @r1,#10,madj_2
mov 25h,#0
inc 26h
mov r1,#26h
cjne @r1,#6,madj_2
mov 26h,#0
ajmp madj_2
hinc_1:
inc 23h
mov r1,#23h
cjne @r1,#10,ss14
mov 23h,#0
inc 24h
ss14:
mov a,24h
swap a
xchd a,@r1
cjne a,#ts,ss15
mov 23h,#0
mov 24h,#0
ajmp hadj_1
ss15:xchd a,@r1
ajmp hadj_1
hinc_2:
inc 27h
mov r1,#27h
cjne @r1,#10,sss14
mov 27h,#0
inc 28h
sss14:
mov a,28h
swap a
xchd a, @r1
cjne a,#ts,sss15
mov 27h,#0
mov 28h,#0
ajmp hadj_2
sss15:
xchd a,@r1
ajmp hadj_2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;时间调整程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

time_adj:;
clr psw.5
push acc
mov a,70h
jb acc.0,l1;P1.0调时功能键,每按一次切换一位
ajmp nokeyout
adj_out:
mov 21h,73h
mov 22h,74h
setb p3.0 ;闭合继电器
setb tr1
nokeyout:
pop acc
ret
QQ: anl 73h,#0fh
anl 74h,#0fh
;anl 78h,#0fh
ret
l1: clr tr1;acall dab; 分钟调整
orl 73h,#10h;点亮分右下角的小数点,当前调整位置
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,h_adj;切换到小时调整
jb acc.1,m_inc;P1.2加1按钮
ajmp l1
h_adj:; 小时调整
;acall dab
orl 74h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj;切换到星期调整
jb acc.1,h_inc;小时加1
ajmp h_adj
w_adj:
acall daa
orl 78h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj
jb acc.2,w_inc
ajmp w_adj
out_adj:
ajmp adj_out
m_inc:;;;;;;;;;;;;;;; 调整分时,对定时复位,初始化
clr tr1
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
inc 73h
mov r1,#73h
cjne @r1,#10,s12
mov 73h,#0
inc 74h
mov r1,#74h
cjne @r1,#10,s12
mov 74h,#0
s12: ajmp l1
;;;;;;;;;;;;;;;;;;;;;;调整小时位
h_inc:
inc 74h
mov r1,#74h
cjne @r1,#10,s14
mov 74h,#0
;inc 76h
s14: ajmp h_adj
;mov a,76h
;swap a
;xchd a,@r1
;cjne a,#ts,s15;;;12进制,24进制设置值决定
;mov 75h,#0
;mov 76h,#0
;ajmp h_adj
;s15: ;xchd a,@r1
;ajmp h_adj
;;;;;;;;;;;;;;;;;;;;;;;调整星期位
w_inc:
inc 78h
mov r1,#78h
cjne @r1,#8,s16
mov 78h,#1h
s16: ajmp w_adj

;;;;;;;;;;;;;;;;;;;;;;;当前闹钟开/关情况报告位
numb:clr 29h.4
jnb 29h.0,iii1
jnb 20h.6,iii1
setb 29h.4
iii1:jnb 29h.1,out_21
jnb 20h.7,out_21
setb 29h.4
out_21:
jnb 20h.6,out_12
jnb 20h.7,out_13
mov 77h,#1dh
ajmp out_22
out_12:
jnb 20h.7,out_14
mov 77h,#1bh
ajmp out_22
out_13:
mov 77h,#1ch
ajmp out_22
out_14:
mov 77h,#1ah
out_22:
ret
end

如果你会C的话,我觉得这些你都可以不用去考虑,因为C是不管内存的分配的!这就是C的好处,如果你的时间要求不是很精确,你就直接用循环,如果你时间要求非常精确,你就用中断。


单片机时钟制作的可行性研究,短点的,一二百字足矣
础上,为我们安排了一个涉及MCS—51 单片机多种资源应用及具有综合功能的电子时钟设计。关键字: 显示时间 定时 温度采集 系统仿真1引言《单片原理及应用》是一门技术性、应用性很强的学科,实践教学是它的一个极为重要的环节。不论是硬件扩展、接口应用还是编程方法、程序调试,都离不开实验教学。如果不在切实认真...

STC89C52单片机作息时间控制钟一秒时间基准是如何产生的
这是用单片机做电子钟的最典型的最基本的应用了。用定时器定时,可以定时20ms或50ms(不能直接定时1秒的),采用中断方式,每中断一次,就是20ms或50ms,对中断计数50次,或20次就是1秒啦。这一秒的基准时间就得到了。

电子时钟开题报告
课题名称 基于单片机的电子时钟设计 姓名xx 学号xx 班级 信息xx班 专业 电子信息工程 院系 信息工程学院...(1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。 (2)根据...(7)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方便用户操作等因素。 2 设计报告内...

数字电子钟可设报告
尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。单片机具有体积小、...

哪位有基于单片机的数字钟的设计开题报告
该数字钟可实现年、月、日、时、分、秒显示、整点音乐报时、定时闹钟等基本功能。(1)数字电子钟的硬件组成及原理图;(2)数字电子钟模拟的程序设计。相关论文也行... 该数字钟可实现年、月、日、时、分、秒显示、整点音乐报时、定时闹钟等基本功能。(1)数字电子钟的硬件组成及原理图;(2)数字电子钟模拟的程序...

大学数字电子技术的课程设计:数字式电子钟的设计或交通灯控制电路设计...
根据题目,我们可以分析出:数字电子钟是由多块数字集成电路构成的,其中有振荡器,分频器,校时电路,计数器,译码器和显示器六部分组成。振荡器和分频器组成标准秒信号发生器,不同进制的计数器产生计数,译码器和显示器进行显示,通过校时电路实现对时,分的校准。1)振荡器又包括由集成电路555与RC组成的多谐振荡器,用...

如何设计一个类似石英钟的数字显示的电子钟
(5)、当分频器和计数器调试正常后,观察电子钟是否准确正常地工作。四、供参考的元器件 (1)、七段显示器(共阴极)6片 (2)、74LS90 9片 (3)、555多谐振荡器 1片 (4)、74LS00 8片 (5)、74LS04 4片(6)、电阻、电容、导线等。五、收获体会 该电路的设计让我对数字钟的设计有了一定的了解。我知道...

单片机课程设计电梯程序设计汇编语言
工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,...1、程序设计内容 (1.在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,从新秒计数。

急求多功能数字钟的设计,要详细的制作过程,需要购买的元件以及电路板的...
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。 本系统采用石英晶体振荡器、分频器、计数器、显示器和校时电路组成。由LED数码管来...

单片机实训总结范文5篇
其中分支程序分别为:AD转换模块(状态号为0),数字模块状态号为1),倒计时模块(状态号为2),电子钟模块(状态号为3),功能组合模块(状态号为4),流水灯模块(状态号为5)。 2 功能子程序设计 2.1 流水灯模块 流水灯模块利用单片机的P3口,通过给P3口的各位送低电平,相应的实现流水灯有规律的点亮。 2.2 30秒倒计时...

天全县18787294796: 单片机电子钟程序 -
冶轰富尔: 51单片机在数码管上显示的数字钟程序:#include "at89x51.h" 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,0...

天全县18787294796: 求c51单片机电子钟程序(c语言) -
冶轰富尔: 以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)./**** 本程序中,晶振为12MHz, ****//**** 时间控制采用定时中断控制方式. ****//**** 模式和时间调整采用查询方式. ****/#include<reg52.h> sbit P20=P2^0; //分个位控制端 ...

天全县18787294796: 电子时钟程序用单片机怎么写 -
冶轰富尔: HOUR EQU 40H ;存放时信息的单元 MINUTE EQU 41H ;存放分信息的单元 SECOND EQU 42H ;存放秒信息的单元 NUM EQU 43H ;存放T0溢出次数的单元 ORG 0000H ;程序入口 AJMP MAIN ORG 0030H ;主程序入口 MAIN:MOV SP,#...

天全县18787294796: 单片机程序,帮我写一个单片机数字钟的程序. -
冶轰富尔: #include#define uchar unsigned char uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9 unsigned char sec=0,min=0,hour=12,scanled; unsigned char key,flashbit,mode,time; unsigned char disdat[8]; sbit led=P1^0; ...

天全县18787294796: 单片机课程设计电子时钟程序 -
冶轰富尔: #include <at89x51.h> //头文件包含#define uchar unsigned char //宏定义 #define uint unsigned int #define ON 0 //定义0为打开 #define OFF 1 //定义1为关闭 #define LEDBus P1 //定义p1口为数码管段码口 sbit MIAO =P1^2; //秒点 sbit HOU_S=P...

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

天全县18787294796: 单片机设计数字电子钟的程序 -
冶轰富尔: org 00h ajmp start org 03h ajmp jia org 0bh ajmp saomiao org 13h ajmp jian org 1bh ajmp jishu org 2bh start: mov ie,#10001111b mov ip,#00000010b mov tmod,#00100010b mov th1,#6 mov tl1,#6 mov th0,#88h mov tl0,#88h setb it1 setb it0 mov r4,...

天全县18787294796: 谁知道单片机电子钟设计的程序?
冶轰富尔: ORG 8000H AJMP MAIN ORG 800BH AJMP INTT0 ORG 8040H MAIN:MOV SP,#60H MOV 39H,#00H MOV 3AH,#00H MOV 3BH,#00H MOV 3CH,#00H MOV 3DH,#00H MOV 3EH,#00H MOV R1,#3EH MOV R5,#6 LOOP:LCALL 0026H LCALL ...

天全县18787294796: 单片机电子时钟编程 -
冶轰富尔: SDA BIT P0.0 SCL BIT P0.1 LED0 EQU 40H LED1 EQU 41H LED2 EQU 42H LED3 EQU 43H LED4 EQU 44H LED5 EQU 45H second equ 50h minute equ 51h hour equ 52hMOV DPTR, #TABLEMOV LED0,#0MOV LED1,#5MOV LED2,#9 ...

天全县18787294796: 单片机C语言编程简易数字电子时钟 -
冶轰富尔: #include unsigned char X=10,sec,flag;unsigned char key[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 数码管显示数字表unsigned char ke...

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