急求基于单片机AT89C51的多功能数字电子钟的汇编程序,高手进!~

要求:1.四位七段LED数码管,显示时,分,有复位~
2.四个按键功能,有加一,减一等功能
3.可校对时间,有闹钟功能,可以为整点报时,最好是能调整闹钟时间
4.不可以使用时钟芯片,12MHZ晶振~
5.最好要有proteus电路图及PCB图
6.汇编语言程序,有注释~
附:真的很着急,如果仿真成功的话可以追加悬赏~谢谢~
可以发到我的邮箱 [email protected]~
图片是老师给的51最小系统硬件图,用的是MAX232下载,还有两个芯片是HC595,不是很明白作用~
六位显示,C语言编程也可以,但要有注释!~

用89C51控制3个HC595,前两个595接8段数码显示管,显示“0”~“9”每秒跳动一次.第3个HC595接8个LED灯,每隔1秒闪烁1次.

#include<at89x52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uint cycle=0,cycle1=0,count=0,key=0,ACK=0x01; 

/*******************************/

void comend();

/*********************************/

//两位显示子程序

/********************************/

void sent_P0(uchar temp1,uchar temp)//两位的显示

P0=table[temp1];

P1_6=0;

P1=0xff;

P0=table[temp];

P1_7=0;

P1=0xff; 

/*******************************/

//调节两位显示运算的子程序

/*******************************/

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值不能为零,否则显示不准

{

cycle++; //根据中断计的时间来决定时间加的快慢

}

if(cycle==10)

cycle=0; //cycle为个位

cycle1++; //cycle1为十位

}

if(cycle1==10)cycle1=0;//if(RB8==1)RI=1; 

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

}

/*******************************/

//串行中断子程序

/*******************************/

void Out_int(void) interrupt 4 using 3

{

uchar temp;

if(TI==1)TI=0;

else{

if(RB8==1)

RB8=0;

while(!RI);RI=0; //ES=0; 

temp=SBUF;

if(0x01==temp) //对照地址

{

SM2=0;

TI=0; 

SBUF=ACK; //回复主机收到

while(!TI);TI=0; 

}

else goto stop;

while(!RI); RI=0; 

temp=SBUF;//SBUF为从串行接收寄存器中接收到的主机发来的数据

switch(temp)//switch语句控制是显示还是停止

case 0x01 : //显示

key=1; 

break;

}

case 0x02: //停止

{

key=2; 

break;

}

default: ;

}

stop: ; 

}

/************************************/

//主函数

/***********************************/

void main(void)

{

SCON=0xf0;//串行中断的工作方式和开接收寄存器的设置

PCON=0x80;//设置波特率为双倍波特率

TH1=0xf9;//设置T1产生的波特率为4800*2=9600

TMOD=0x21;//设置T1产生波特率并且工作在方式2下和T0工作在方式1下 

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

IE=0x92; //开T0中断ET0和串行中断ES和总中断EA

TR1=1;//开T1中断

IP=0x10;

P1=0xff;

while(1) //当RB8=1时,系统自动申请中断,既把RIç½®1;

{

if(key==1)set_LED();

if(key==2)P0=0xff; 

}

}

主机的程序:

#include<at89x52.h>

#include<intrins.h>

#define uchar unsigned char 

#define uint unsigned int

uint address1=0x01,ACK=0x01;

/*void Delay(uint n)

{

uint i;

for(i=0;i<n;i++);

}

*/

void main(void)

{

uchar temp;

SCON=0xd0; 

PCON=0x80;//SMOD=1,双倍波特率

TMOD=0x20;

TH1=0xf9;//设定波特率为4800*2=9600,要和从机一致才能发出正确的数据

TR1=1;

while(1)

P1=0xff;

while(P1_0==1); 

TB8=1;

SBUF=0x01; //发地址

while(!TI);TI=0;

while(!RI);RI=0; 

temp=SBUF; 

if(ACK==temp)//验证从机地址

P2=0x00; 

TB8=0;

SBUF=0x01; //发第一个命令 

while(!TI);TI=0;

}

while(P1_1==1);

TB8=1;

SBUF=0x01;//发地址,再次给从机发地址

while(!TI);TI=0;

while(!RI);RI=0; 

temp=SBUF;

if(ACK==temp)

P2=0xff; 

TB8=0;

SBUF=0x02; //发第二个命令 

while(!TI);TI=0;

}

}

}

不知道你的电路图是怎么样的,给你个HC595数码管显示的参考电路和程序。

数字钟的不知道你用的是什么芯片。。无法写。我这里有8563的程序

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-14
给你个建议:问在校大学生、
第2个回答  2010-12-20
电路不搞清楚,写多少程序都是无用的。