急求基于单片机AT89C51的多功能数字电子钟的汇编程序,高手进!~ 50
2.四个按键功能,有加一,减一等功能
3.可校对时间,有闹钟功能,可以为整点报时,最好是能调整闹钟时间
4.不可以使用时钟芯片,12MHZ晶振~
5.最好要有proteus电路图及PCB图
6.汇编语言程序,有注释~
附:真的很着急,如果仿真成功的话可以追加悬赏~谢谢~
可以发到我的邮箱 176936177@qq.com~
图片是老师给的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的程序