求89c52单片机实现数字钟的汇编语言程序

作者&投稿:潘柴 (若有异议请与网页底部的电邮联系)
单片机c52数字钟汇编语言程序~

手头有一个89C51的,刚好键是在P3,不过不是四个,是6 个。你不能改吗?

#include
#include
#define REST P3_4
#define SCLK P3_7
#define DATA P3_6
unsigned char code displayCode[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char code controladdress[]={0x80,0x82,0x84,0x86,0x88,
0x8a,0x8c,0x8e,0x90,0xbe};
unsigned char hour,minute,second;
unsigned char day,month,week,year;
unsigned char clockhour,clockminute;
unsigned int num;
unsigned char select,oneminute;
bit bdata modeselect;
void delay();
void writetime();
void display(unsigned char temp,unsigned char mode);
void sound()
{
while(num<2000)
{
P3_0=0;
}
P3_0=1;
}
void initial()
{
P0=0;
TMOD=0x22;
IE=0xCF;
IT0=1;
IT1=1;
T2CON=0;
RCAP2L=0xf0;
RCAP2H=0x1f;
TH2=0x1c;
TL2=0xf0;

IP=0X06;
TH0=0x48;
TL0=0x48;
TH1=0X48;
TR0=1;
PCON=0x01;
hour=12;
minute=0;
second=0;
num=0;
select=0;
clockhour=12;
clockminute=0;
modeselect=0;
day=16;
month=8;
week=7;
year=9;
}
void interrupt0()interrupt 0 using 3
{
TR1=1;
select++;
if(select==8)
{
select=0;
}
if(select==1)
ET2=1;
oneminute=second-1;
}
void timer0()interrupt 1 using 3
{
num++;
if(num==5000)
{
num=0;
second++;
}
if(second>=60)
{
minute++;
second=0;
}
if(minute>=60)
{
hour++;
minute=0;
}
if(hour>=24)
hour=0;
}
void interrupt1()interrupt 2 using 3
{
oneminute=second-1;
switch(select)
{
case 4:{
hour++;
if(hour>=24)
hour=0;
break;
}
case 5:{
minute++;
if(minute>=60)
minute=0;
break;
}
case 6:{
second++;
if(second>=60)
second=0;
break;
}
case 2:{
clockhour++;
if(clockhour>=24)
clockhour=0;
break;
}
case 3:{
clockminute++;
if(clockminute>=60)
clockminute=0;
break;
}
default:{
modeselect=0;
ET2=!ET2;
break;
}
}
}
void timer1()interrupt 3 using 3
{

if(select)
{

if(second==oneminute)
{
select=0;
TR1=0;
}
}
}
void timer2()interrupt 5 using 3
{

sound();
TF2=0;
if(minute!=clockminute||hour!=clockhour)
TR2=0;
}
void delay()
{
unsigned char i=255;
while(--i)
{
;
}
}
void display(unsigned char temp,unsigned char mode)
{
if(temp==4||temp==2)
P0=0;
else
P0=1;
if(mode)
P1=displayCode[hour/10];
else
P1=displayCode[clockhour/10];
delay();

if(temp==4||temp==2)
P0=0;
else
P0=2;
if(mode)
P1=displayCode[hour%10];
else
P1=displayCode[clockhour%10];
delay();

if(temp==1||temp==2||temp==3)
P0=0;
else
P0=4;
P1=0xbf;
delay();
if(temp==5||temp==3)
P0=0;
else
P0=8;
if(mode)
P1=displayCode[minute/10];
else
P1=displayCode[clockminute/10];
delay();
if(temp==5||temp==3)
P0=0;
else
P0=16;
if(mode)
P1=displayCode[minute%10];
else
P1=displayCode[clockminute%10];
delay();

if(temp==1||temp==2||temp==3)
P0=0;
else
P0=32;
P1=0xbf;
delay();
if(temp==6)
P0=0;
else
P0=64;
if(mode)
P1=displayCode[second/10];
else
P1=displayCode[0];
delay();
if(temp==6)
P0=0;
else
P0=128;
if(mode)
{
if(ET2)
P1=displayCode[second%10]+128;
else
P1=displayCode[second%10];
}
else
P1=displayCode[0];
delay();
}
void write(unsigned char Bdata)
{
unsigned char i=8;
for(;i>0;i--)
{
if(Bdata&0x01)
DATA=1;
else
DATA=0;
SCLK=1;
SCLK=0;
Bdata>>=1;
}
}
void writedata(unsigned char address,Bdata)
{
REST=0;
SCLK=0;
_nop_();
REST=1;
write(address);
write(Bdata);
REST=0;
}
unsigned char read(unsigned char Bdata)
{
unsigned char tdata=0,i=8;
REST=0;
SCLK=0;
_nop_();
REST=1;
write(Bdata);
for(;i>0;i--)
{
tdata>>=1;
if(DATA)
tdata=tdata|0x80;
else
tdata|=0x00;
SCLK=1;
SCLK=0;

}
return tdata;
}
void writetime()
{
unsigned char i,time,temp[3];
temp[0]=second;
temp[1]=minute;
temp[2]=hour;
for(i=0;i<3;i++)
{
time=temp[i]%10;
time|=(temp[i]/10)<<4;
writedata(controladdress[i],time);
}
}
void writeyear()
{
unsigned char i,year0,temp[4];
temp[0]=day;
temp[1]=month;
temp[2]=week;
temp[3]=year;
for(i=0;i<4;i++)
{
year0=temp[i]%10;
year0|=(temp[i]/10)<<4;
writedata(controladdress[i+3],year0);
}
}
void readtime()
{
unsigned char i,time,temp[3];
for(i=0;i<3;i++)
{
temp[i]=read(1+controladdress[i]);
time=temp[i]&0x0f;
time+=(temp[i]>>4)*10;
temp[i]=time;
}
second=temp[0];
minute=temp[1];
hour=temp[2];
}
void readyear()
{
unsigned char i,year0,temp[4];
for(i=0;i<4;i++)
{
temp[i]=read(1+controladdress[i+3]);
year0=temp[i]&0x0f;
year0+=(temp[i]>>4)*10;
temp[i]=year0;
}
day=temp[0];
month=temp[1];
week=temp[2];
year=temp[3];
}
void main()
{
initial();
sound();
writedata(0x8e,0x00);
writedata(0x84,0x12);
writedata(0x8f,0x00);
readtime();
writeyear();
readyear();
while(1)
{
switch(select)
{
case 0:{
display(0,1);
break;
}
case 1:{
if(num<=2500)
{
display(1,0);
}
else
{
display(0,0);
}
break;
}
case 2:{
if(num<=2500)
{
display(2,0);
}
else
{
display(0,0);
}
break;
}
case 3:{
if(num<=2500)
{
display(3,0);
}
else
{
display(0,0);
}
break;
}
case 4:{
if(num<=2500)
{
display(4,1);
}
else
{
display(0,1);
}
break;
}
case 5:{
if(num<=2500)
{
display(5,1);
}
else
{
display(0,1);
}
break;
}
case 6:{
if(num<=2500)
{
display(6,1);
}
else
{
display(0,1);
}
break;
}
case 7:{

writetime();
writetime();
writetime();
select=0;
break;
}
default:break;
}

if(second==0)
{
if(minute==0||minute==30)
sound();
}
if(minute==clockminute&&hour==clockhour)
{
TR2=1;
modeselect=1;
}
if(modeselect==1&&hour==clockhour&&!((minute-clockminute)%5))
TR2=1;
}
}

S_SET BIT P3.2 ;数字钟秒控制位
M_SET BIT P3.3 ;分钟控制位
H_SET BIT P3.4 ;小时控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
TCNT EQU 34H
ORG 0000H
SJMP START
ORG 000BH
LJMP INT_T0
START:MOV DPTR,#TABLE
MOV P1,#0FEH
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256 ;定时50毫秒
MOV TL0,#(65536-50000)/256
MOV IE,#82H
SETB TR0
;****************************;判断是否有控制键按下,是哪一个键按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖动
JB S_SET,A1
INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判断是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1 K1: INC MINUTE ;分钟值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判断是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小时值加1
MOV A,HOUR
CJNE A,#24,J2 ;判断是否加到24小时
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;*********************;等待按键抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定时器中断服务程序,对秒,分钟和小时的计数
INT_T0:MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)/256
INC TCNT
MOV A,TCNT
CJNE A,#20,RETUNE ;计时1秒
INC SECOND
MOV A,P1
RR A
MOV P1,A
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#25,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE: RETI
;*********************;显示控制子程序
DISPLAY: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
CLR P2.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.1
MOV A,B
CLR P2.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.0
CLR P2.2
MOV P0,#40H
LCALL DELAY
SETB P2.2 MOV A,MINUTE ;显示分钟
MOV B,#10
DIV AB
CLR P2.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.4
MOV A,B
CLR P2.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.3
CLR P2.5
MOV P0,#40H
LCALL DELAY
SETB P2.5 MOV A,HOUR ;显示小时
MOV B,#10
DIV AB
CLR P2.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.7
MOV A,B
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P2.6
RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDELAY: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END


求89c52单片机 C语言实现数字时钟程序
include <AT89X52.H> include <intrins.h> define REST P3_4 define SCLK P3_7 define DATA P3_6 unsigned char code displayCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned char code controladdress[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x...

用两种方法来实现对89C52单片机P1口8位进行流水灯的控制(灯亮0.8秒灭...
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1\/12 us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率...

89c52单片机
1、你的延时子程序for循环的嵌套关系好像搞反了。2、利用“软件延时控制数码管显示”的同时,在软件延时中添加break,会造成显示中断。3、多位数码管扫描显示时,变换“段位”前应该先将“段值”清空,减少不必要的闪烁。4、你在数码管显示中的每一位延时时间有些长,多位显示往往不流畅,会出现单个...

单片机89C52连接4位共阴极数码管实现动态显示需要加负载驱动吗?_百度...
89C52的输出电流能力很若,吸收电流能力很强。因此,采用共阴极数码管需要加负载驱动,你若采用共阳极的数码管(低电平驱动),就无需驱动了,实际好需要加电阻限流。

89c52单片机与89s52单片机的区别是什么
STC89C52单片机与AT89S52是完全兼容的,就是原来用的是AT89S52,STC89C52是完全可以直接替换的。硬件和程序都不用做改动。两者的区别就在于烧录程序上。AT89S52需要电脑的并口下载线,这是早期的电脑才有并口的,现在电脑连串口都没有了。所以,要烧录程序要买一条USB转ISP线,可是网上能买的USB转ISP线又是...

单片机89c51与89c52的区别
单片机的两种型号。主要区别是容量不同。at89c51最多支持4KB的程序,at89c52则最多支持8KB的程序。AT89C51简介:AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读...

请教单片机89C52问题?
用定时器中断 来 控制驱动数码管 就不会产生 这种现象,(每个数码管的刷新频率 > 50 Hz)如 4个 数码管 可以 定时 3 - 5 mS 就可以,每次中断 更新 1 位数码管。

89c52单片机的RAM为多少?
我们的 STC89C52 共有 512 字节的 RAM,分为 256 字节的片内 RAM 和 256 字节的片外RAM。一般情况下,我们是使用 data 区域,data 不够用了,我们就用 xdata,如果希望程序执行效率尽量高一点,就使用 pdata 关键字来定义。其它型号有更大的 RAM 的 51 系列单片机,如果要使用更大的 RAM,就...

89c52单片机中,串行口工作方式1时,每次发送8位数据是什么意思?
而为什么串口在方式1要以字节为单位呢? 这是在硬件设计之初就确定好的,是串口标准.你我是不能改变的.发送时间是由波特率决定的,波特率就是指每秒钟发送多少个bit位.串口标准中: 要发送一个数据,还得加上一些其它的东西,比如起始位 停止位等.a=01;SUBF=a; 单片机执行后,就会将a中的...

1、请问单片机STC89C52RC的含义是什么?(例如:stc是什么?89是什么?等 ...
STC就是一个名字,它代表的是中国自己生产的一种单片机的商标名,现有二厂部,一在深圳二在南昌。89C52就是51类单片机中的专用了,自带可擦ROM。RC是STC中专用的了,主用在AD\/DA转换地的。这到STC官网上就可看到更详细的说明了。

顺德区13418996300: 求89c52单片机实现数字钟的汇编语言程序 -
亥顷小儿: S_SET BIT P3.2 ;数字钟秒控制位 M_SET BIT P3.3 ;分钟控制位 H_SET BIT P3.4 ;小时控制位 SECOND EQU 30H MINUTE EQU 31H HOUR EQU 32H TCNT EQU 34H ORG 0000H SJMP START ORG 000BH LJMP INT_T0 START:MOV ...

顺德区13418996300: 用C语言编写程序使89C52单片机实现数字时钟功能,急求! -
亥顷小儿: /*---------------------------------------------------------------*/ /* 文件名称:SZ01.c */ /* 程序功能:带定时闹铃时钟 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint ...

顺德区13418996300: 单片机89C52电子时钟用汇编 -
亥顷小儿: 请访问51电子网站: http://www.51dzy.com/view.asp?id=7165;里面有一篇《6位可调电子钟》作为参考. 其中用的是89S51单片机与89S52是兼容的,程序可以通用. 但现在大多数编程都已经用C语言了,你完全可以只用C程序完成你的设计.;

顺德区13418996300: 求89c52单片机 C语言实现数字时钟程序 -
亥顷小儿: result equ 40h one equ 41h ten equ 42h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h jmp main org 001bh jmp change org 0040h main: MOV IE,#88H ;;;;;;;;;;;;;;T1 中断 允许 mov r2,#10h ;;;;;;;;;;;;;;设置 X 秒中断一次 mov result,#...

顺德区13418996300: 单片机电子时钟编程 -
亥顷小儿: 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 ...

顺德区13418996300: 基于89C52单片机的时钟程序设计~~硬件下面有图,要软件编程 -
亥顷小儿: #include "reg52.H"#include "string.h"#include "intrins.h" #define uint unsigned int #define uchar unsigned char...

顺德区13418996300: 51单片机 芯片是89C52 实现秒表计时器!急急……
亥顷小儿: #include<reg52.h> unsigned char x,y; sbit H=P3^6; unsigned char D[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //用于数字0~9的显示数据表 void delay(unsigned char a){ //延时程序 unsigned char i; while(a--) for(i=115;i>0;i--); } void ...

顺德区13418996300: 求助:基于单片机的数字钟 汇编源代码 -
亥顷小儿: 51单片机的程序如下: ORG 0000H LJMP MAIN ORG 0003H LJMP INTA ORG 000BH LJMP SEV1 ORG 0013H LJMP INTB ORG 001BH LJMP SEV2 ORG 0030H MAIN:MOV SP,#60H MOV A,#00H MOV 30H,A MOV 31H,A MOV 32H,A MOV ...

顺德区13418996300: 急求液晶电子钟程序(提示:要C语言版的,89C52的,RT12864) -
亥顷小儿: 展开全部#include #define uchar unsigned char #define uint unsigned int sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit key1=P2^3; sbit key2=P2^4; sbit key3=P2^5; void delay(void); void init(void); void wc51r(uchar i); void wc51ddr(uchar i); void ...

顺德区13418996300: 急求单片机电子时钟程序,用汇编写的 -
亥顷小儿: ;********************************************************************; 引脚定义;******************************************************************** D_PORT EQU P0 CS1 EQU P2.5 CS2 EQU P2.6 E EQU P2.7;******************************************************...

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