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

作者&投稿:塔炭 (若有异议请与网页底部的电邮联系)
请教AT89C51单片机的数字时钟程序带闹钟的功能 用C语言编写~

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit s1=P3^4;//模式的选择
sbit s2=P3^5;//调高
sbit s3=P3^6;//调低
sbit s4=P3^7;//选择是否开启闹铃
sbit beep=P2^3;
uchar tt,num,t1,settime,bi;
uchar flag; //至位
int fen,miao,fen1=0,miao1=10;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar dis[]={0x40,0x40,0x40,0x40,0x40,0x40};
void timedisplay();
void display();
void keydisplay();
void setdisplay();
void display1();
void delay(uchar z)
{
uchar i,j;
for(i=125;i>0;i--)
for(j=z;j>0;j--);
}
void warm()
{
if(bi==1)
{
beep=0;
TR1=1;
}
}
void init()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
EA=1;
ET0=1;
ET1=1;
TR0=1;
}
void keyscan()
{
if(s4==0)
{
delay(5);
{
if (s4==0)
{
while(!s4);
bi++;
if(bi==2)
{
bi=0;
}
}
}
}
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!s1);
num++;
if(num==3)
{
num=0;
}
}
}
if(num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
if(num==1)
{
miao1++;
if(miao1==60)
miao1=0;
}
if(num==2)
{
fen1++;
if(fen1==60)
fen1=0;
}
while(!s2)
{
keydisplay();
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
if(num==1)
{
miao1--;
if(miao1==-1)
miao1=59;
}
if(num==2)
{
fen1--;
if(fen1==-1)
fen1=59;
}
while(!s3)
{
keydisplay();
}
}
}


}
}
void setdisplay() //设置模式下的显示
{

dis[0]=0x40;
dis[1]=0x40;
dis[2]=table[0];
dis[3]=table[num];
dis[4]=0x40;
dis[5]=0x40;
display();
}
void keydisplay() //通过按键加减时的显示
{
if((flag==1)&&(num==2))
{
dis[0]=table[fen1/10]&0x00;
dis[1]=table[fen1]&0x00;
}
else
{
dis[0]=table[fen1/10];
dis[1]=table[fen1];
}
dis[2]=0x40;
if((flag==1)&&(num==1))
{
dis[3]=table[miao1/10]&0x00;
dis[4]=table[miao1]&0x00;
}
else
{
dis[3]=table[miao1/10];
dis[4]=table[miao1];
}
dis[5]=0x40;
display();
}
void display() //基本的动态显示
{
dula=1; //the one
P0=dis[0];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1; //the two
P0=dis[1];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1; //the three
P0=dis[2];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1; //the four
P0=dis[3];
dula=0;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1; //the five
P0=dis[4];
dula=0;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1; //the six
P0=dis[5];
dula=0;

wela=1;
P0=0xdf;
wela=0;
delay(1);
}
void timedisplay()
{
dis[0]=table[fen/10];
dis[1]=table[fen];
dis[2]=0x40;
dis[3]=table[miao/10];
dis[4]=table[miao];
dis[5]=0x40;
display();
}
void main()
{
init();
while(1)
{
keyscan();
if(num!=0)
{
keydisplay();
}
if(num==0)
{
timedisplay();
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
tt++;
if(tt==20)
{
tt=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
}
}
}
if(!num&&fen1==fen&&miao1==miao)
{
warm();
}
settime++;
if(settime==10)
{
flag=1;
}
if(settime==20)
{
settime=0;
flag=0;
}
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
t1++;
if(t1==60)
{
t1=0;
beep=1;
}
}

定时器你会不?
数码管扫描显示你会不?

如果这个都不会的话,去看书吧。

一天就足够了

如果上面的会的话,你可以配置定时器为t时间中断。假如中断N次是1秒,你就每次中断一次,把一个变量加1,直到等于N,这就是1秒,分,时 同理

用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的程序



给你个建议:问在校大学生、

电路不搞清楚,写多少程序都是无用的。


如何保证钻孔的位置精度
苦等5分钟: 请问 哪里还能看2018俄罗斯世界杯赛事? 回答 苦等5分钟: 最近小偷太猖狂了 大家出门还是小心点的好 回答 苦等5分钟: 今年最流行的芭蕾平底鞋怎么搭配好看 回答 苦等20分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 更多等待求助问题 > 登录...

汽车出现ICV
苦等15分钟: 各位宾得K3和索尼A7买哪个更好 回答 苦等15分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 苦等20分钟: 吧里有没有在阳台养藤本月季的,养的怎么样,分享一下 回答 苦等22分钟: 为什么现在球场上很少看到长发飘飘的球员了 回答 更多等待求助问题 > 登录...

班会《批评与自我批评》主持词怎么写??
苦等6分钟: 系统更新的角标如何去除 回答 苦等10分钟: 全脸填充为什么要体检 回答 苦等11分钟: 有没有人知道 张爱平老师的篮球选修课什么 回答 苦等18分钟: 你结婚了吗,你觉得结婚好吗?婚姻是什么? 回答 苦等19分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 更多等待求助问题 > 登...

热血三国里面怎么算将领的统帅可以带多少兵?
苦等1分钟: 最近小偷太猖狂了 大家出门还是小心点的好 回答 苦等16分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 苦等20分钟: 怎样挑选水果和嫠 回答 苦等22分钟: 景安服务器如何选择? 回答 苦等26分钟: 如何开个烤鱼店 要注意什么问题 回答 更多等待求助问题 > 登录...

水泥制品凝固后还会释放什么有害物质?
苦等12分钟: 有没有人知道 张爱平老师的篮球选修课什么 回答 苦等18分钟: 常用国内VPS推荐 回答 苦等19分钟: 你结婚了吗,你觉得结婚好吗?婚姻是什么? 回答 苦等20分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 苦等26分钟: 景安服务器如何选择? 回答 更多等待求助问题 > 登录...

魔兽世界地精新手任务要做多久
苦等5分钟: 最近小偷太猖狂了 大家出门还是小心点的好 回答 苦等6分钟: 《雍正王朝》里面雍正为什么含泪杀亲子 回答 苦等20分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 苦等22分钟: 咖啡因真的能提高运动活力吗 回答 更多等待求助问题 > 登录...

QQ上我删除了好友或者被好友删除,之前的聊天记录还有吗?
10 回答 苦等5分钟: 我觉得还是蛮不错的,是不 回答 苦等7分钟: 魅族为什么不用高通芯片了 回答 苦等11分钟: 说真的,为什么现在蛇和青蛙越来越少了,基 回答 苦等16分钟: 哪个城市的婆婆最难相处 回答 苦等19分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 更多等待求助问题 > 登录...

男生身高186CM腿长110CM达到标准比例了麽?标准腿长应该是多少?怎么计 ...
苦等9分钟: 有没有人知道 张爱平老师的篮球选修课什么 回答 苦等14分钟: 哪个城市的婆婆最难相处 回答 苦等17分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 苦等18分钟: 为什么某些历史阴谋论会这么流行 回答 苦等27分钟: 如何开个烤鱼店 要注意什么问题 回答 更多等待求助问题 > 登...

人性用英语怎么说
苦等16分钟: 基于AT8写9C51单片机的简单计算器c语言编程怎... 回答 苦等21分钟: 吧里有没有在阳台养藤本月季的,养的怎么样,分享一下 回答 苦等24分钟: 这款表没有发条,人们管它叫“自动跳码手表”。各位大... 回答 苦等27分钟: 如何开个烤鱼店 要注意什么问题 回答 更多等待求助问题 > 登录...

广西壮族自治区19255672145: 急求基于单片机AT89C51的数字温度报警器,具有上下限的在 - 20度到70度之间的汇编程序或C语言程序!拜托 -
咎梦复方: ;单片机DS18B20温度计C语言程序 #include<reg51.h>#include<intrins.h>#include <math.H> //要用到取绝对值函数abs() //通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度sbit wela = P2^7...

广西壮族自治区19255672145: 用AT89C51单片机构成一简单的方波发生器 急求!
咎梦复方:ORG 0000H LJMP start ORG 000BH LJMP aaaa ;3个周期 ORG 0030H start: MOV TMOD,#01H MOV TH0,#0FFH MOV TL0,#3AH SETB TR0 SETB ET0 SETB EA SJMP $ aaaa: MOV TH0,#0FFH ;197个周期 MOV TL0,#3AH CPL P1.7 bbbb: RETI END 共延时200个周期 也就是25us取反P1.7脚,P1.7输出为方波,周期为200us*2=400us 12M晶振为Ius周期

广西壮族自治区19255672145: 基于AT89C51单片机的电子万年历设计,能够显示日期,时间,温度湿度,最好是闹钟.急急急,求大神指点 -
咎梦复方: 单片机读取时钟芯片和温湿度传感器的数据,然后在1602上面做显示.下载DS1302和LCD1602的数据手册,看看工作时序和寄存器就行了.

广西壮族自治区19255672145: 基于单片机的数字日历时钟 -
咎梦复方: 多功能数字时钟的设计与制作 http://ww1.tabobo.cn/soft/20/233/2008/152201615128.html 摘 要 随着人类科技文明的发展,人们对于时钟的要求在不断地提高.时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现...

广西壮族自治区19255672145: 基于AT89C51单片机,利用定时器设计一个两位数码 管显示电路.求详细的设计过程. -
咎梦复方: 硬件很简单,我就不画图了,简单描述一下吧.在单片机最小系统的基础上,P0口接数码管的数据端,P2.6,P2.7接数码管的控制端. 程序如下: #include #define uint unsigned int #define uchar unsigned char sbit s1=P2^6;//十位 ...

广西壮族自治区19255672145: 急求单片机编程高手帮我编一个AT89C51的时钟+万年历的程序! -
咎梦复方: 基于单片机的数字钟(电子万年历) http://hi.baidu.com/dsu5566/blog/item/7cfe0fa480cd14fe9152eec8.html

广西壮族自治区19255672145: 急..急求单片机at89c51的.用汇编语言:单片机p0(p0.0,p0.1,p0.2,p0.3)4个端口接有4个开关 -
咎梦复方: ORG 0000H LJMP MAIN ORG 0030H MAIN: ORL p0,#0FH ;在读P0口时先对P0口写1 MOV A,p0 ANL A,#0FH MOV DPTR,#LED7 ;根据从P0口读到的数据查表,TAB中存放数码管的显示码表 MOVC A,@A+DPTR MOV p1,A ;把码表值送数码管显示 AJMP MAIN;共阳数码管显示码表 LED7: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,86H,0A1H,86H,8EH

广西壮族自治区19255672145: 基于51单片机设计一个多功能电子时钟,以及相关功能的扩展.系统由按键、发光二极管、数码管或LCD显示屏幕 -
咎梦复方: 用一个51和一片DS12887就可以了,这个时钟是并口的,而且自带电池,比较方便,其他的串口时钟相对麻烦一点.资料上网找找有很多,汇编和C都有,硬件连接也有的是.至于按键功能,自己动手写写看,对于这个单一功能很简单.想学好单片机的话就得多动手啊,每次完成一个东西的时候都会有所收获的.希望对你有帮助.

广西壮族自治区19255672145: 急求基于单片机89c51的汇编程序和电路图 -
咎梦复方: ORG 0000H LJMP MAIN ORG 0030H MAIN: CPL P1.0 LCALL DELAY SJMP MAIN DELAY: MOV R2,#200 DELAY1: MOV R3,#250 DJNZ R3,$ DJNZ R2,DELAY1 RET END

广西壮族自治区19255672145: 求程序用AT89C51单片机.
咎梦复方:#include "reg51.h" #define uint unsigned int #define uchar unsigned char unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uchar sec=30,min=20,hour=10; bit secup=00; uchar n=0; void delay(unsigned int ms)...

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