用单片机制作可调数字时钟要汇编语言程序的

要AT89C51

用这个程序吧 C和汇编都有。
数字钟[★]
1. 实验任务
(1. 开机时,显示12:00:00的时间开始计时;
(2. P0.0/AD0控制“秒”的调整,每按一次加1秒;
(3. P0.1/AD1控制“分”的调整,每按一次加1分;
(4. P0.2/AD2控制“时”的调整,每按一次加1个小时;
2. 电路原理图

图4.20.1
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
(3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;
4. 相关基本知识
(1. 动态数码显示的方法
(2. 独立式按键识别过程
(3. “时”,“分”,“秒”数据送出显示处理方法
5. 程序框图
6. 汇编源程序
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
HOURK BIT P0.0
MINITEK BIT P0.1
SECONDK BIT P0.2
DISPBUF EQU 40H
DISPBIT EQU 48H
T2SCNTA EQU 49H
T2SCNTB EQU 4AH
TEMP EQU 4BH
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#12
MOV DISPBIT,#00H
MOV T2SCNTA,#00H
MOV T2SCNTB,#00H
MOV TEMP,#0FEH
LCALL DISP
MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB SECONDK,NK1
LCALL DELY10MS
JB SECONDK,NK1
INC SECOND
MOV A,SECOND
CJNE A,#60,NS60
MOV SECOND,#00H
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
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP:
MOV A,#DISPBUF
ADD A,#8
DEC A
MOV R1,A
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
INT_T0:
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
MOV A,#DISPBUF
ADD A,DISPBIT
MOV R0,A
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
MOV A,DISPBIT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P3,A
INC DISPBIT
MOV A,DISPBIT
CJNE A,#08H,KNA
MOV DISPBIT,#00H
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
MOV T2SCNTB,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEXT
MOV SECOND,#00H
INC MINITE
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXT
MOV HOUR,#00H
NEXT: LCALL DISP
DONE: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
END
7. C语言源程序
#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,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)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
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)
{
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)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==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;
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-21
带仿真的

设计一个单片机时钟。要求显示时、分、秒,并能修改时间,能进行定时控 ...
\/ 作品名称:基于单片机的二十四进制数字时钟 实现功能:正常显示、调时调分、秒位清零、整点报时 \/ ORG 0 START: MOV R0,#100 MOV R1,#0 MOV R2,#0 MOV R3,#0 MOV R4,#0 MOVR5,#0 MOVR6,#0 MOV20H,#20 \/***查表显示部分***\/ NEXT1: MOV A,R1 MOV...

基于单片机的数字时钟设计方案
数字钟〔★〕这里用了两种编写方法(即汇编语言与C语言)(1. 开机时,显示12:00:00的时间开始计时;(2. P0.0\/AD0控制“秒”的调整,每按一次加1秒;(3. P0.1\/AD1控制“分”的调整,每按一次加1分;(4. P0.2\/AD2控制“时”的调整,每按一次加1个小时;2. 电路...

51单片机控制数字钟原理图及汇编程序设计
delay();\/\/调用延时程序 P2=0;P0=display_code[time[i]\/10];\/\/存放十位数字 P0=~P0;P2=k;k=k<<1;delay();\/\/调用延时程序 } P2=0;} void calc()\/\/计算程序 { time[0]++;if(time[0]>59){ time[0]=0;time[1]++;if(time[1]>59){ time[1]=0;time[2]++;if(time[2]>...

51单片机时钟程序,C语言,汇编都行
Set_RTC(); \/\/写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽 while(1){ if(ReadRTC_Flag){ ReadRTC_Flag=0;Read_RTC();l_tmpdisplay[0]=l_tmpdate[2]\/16; \/\/数据的转换,因我们采用数码管0~9的显示,将数据分开 l_tmpdisplay[1]=l_tmpdate[2]&0x0...

51单片机的电位器可调延时程序 用汇编语言
用STC系列带AD转换的单片机(例如STC12C5410AD)在P1.0接上电位器,经AD转换得到控制值,再用定时中断产生基准信号,由控制值修改计数值达到调整时间的目的。例如0电压对应20秒,5V电压对应80秒。

用汇编语言做单片机时钟显示
基于c8051f020单片机最小系统的实时时钟显示程序 c8051f020 FYD12864-0402B LCD显示,按键电子时钟\/\/ include <c8051f020.h> include<lcd.h> include <intrins.h> define uchar unsigned char void lcd_ini();void DISPInitial();void ascii_change(void);void delay();void wri_add(uchar com);void...

急求基于单片机AT89C51的多功能数字电子钟的汇编程序,高手进!~_百度知...
\/\/调节两位显示运算的子程序 \/***\/ void set_LED(){ TR0=1;\/\/开T0中断做计时间用1S sent_P0(cycle,cycle1);TR0=0;} \/***\/ \/\/T0中断子程序 \/***\/ void Timer0Int(void) interrupt 1 using 0 { count++;if(count==50)count=0; \/\/中断计时间 if(count==10) \/\/这的count值...

求一个用汇编语言编写一个8051单片机的时钟程序(急急急啊)
STACK_SEG SEGMENT IDATA K1 BIT P1.4 K2 BIT P1.5 RSEG DATA_SEG KEY_S: DS 1 KEY_V: DS 1 DIS_DIGIT: DS 1 SEC: DS 1 DIS_INDEX: DS 1 HOUR: DS 1 MIN: DS 1 SEC100: DS 1 DIS_BUF: DS 8 BUF_HOUR_H EQU DIS...

用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设...
unsigned char z,s=00,m=00,h=00;给时钟初始值 while(1){ for(z=0;z<100;z++){ tmp=0x01;P2=tab[h\/10];小时显示 disp();P2=tab[h%10];disp();P2=tab[m\/10];分钟显示 disp();P2=tab[m%10];disp();P2=tab[s\/10];秒显示 disp();P2=tab[s%10];disp();} s++;while...

数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点...
void display1(uchar dz);\/\/只显示要校对的数 void init();\/\/初始化 void jiaoshi();\/\/定义一个校时函数 void delay(uchar z)\/\/定义一个延时函数 { uchar x,y;for(x=0;x<50;x++)for(y=0;y<z;y++);} void main(){ init();while(1){ jiaoshi();} } void init(){ EA=1;...

相似回答