用AT89C51单片机设计一电子闹钟,C语言程序和仿真

作者&投稿:骆先 (若有异议请与网页底部的电邮联系)
用at89s52单片机怎样设计一个电子时钟的c语言程序?~

你好 对于你的问题我特意写了一篇文章请访问

http://hi.baidu.com/lyzhangxiang/blog/item/0c316e238af80ca84623e883.html

如果你不满意请邮件联系 lyzhangxiang.love@163.com

不是为了分数 希望你们认真的做好这个单片机设计 记住不要照搬别人的东西!

#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;
}
}

你好!

  这个一个时钟的仿真效果,可以调整时间,同时具有闹钟功能




可以用单片机内部定时器来完成,
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
/* 函数申明 -----------------------------------------------*/
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(uint n);
void DisplayLine(uchar line1,uchar line2);
void DisplayGraphic(uchar code *adder);
void delay(uint m);
void lcd_mesg(uchar code *adder1);
unsigned char Convert(unsigned char In_Date);
void initinal(void);
void initina2(void) ;
void lcd_m(uchar adder1,uchar adder2,uchar a);
/* 变量定义 -----------------------------------------------*/
uchar scnt = 0 ;
uchar last_scnt = 0 ;
uchar updat_vision = 0 ;
sbit key1 = P3^5 ;
sbit key2 = P3^7 ;
sbit key3 = P3^6 ;
sbit gnd = P3^0 ;
sbit spk = P1^0 ;
uchar timer_miao = 0 ;
uchar timer_fen = 0 ;
uchar timer_shi = 0 ;
uchar cnt = 0 ;
uchar sw = 0 ;
uchar spk_on = 0 ;
uchar noise_shi = 0 ;
uchar noise_fen = 0 ;
uint count = 0 ;
uint count1 = 0 ;
uint count2 = 0 ;
uchar time_rch = 0 ;
sbit datacs=P2^6;
sbit chipcs=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x07,
0x39,0x5e,0x79,0x71
};
/*
********************************************************************************
** 函数名称 : Init_Timer0(void)
** 函数功能 : 定时器初始化子程序
********************************************************************************
*/
void Init_Timer0(void) //定时器初始化子程序
{
TMOD |= 0x11; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0x3c; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0xaf;
TH1=0x03; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=0xe8;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
ET1=1;
TR0=1;
}
/*
********************************************************************************
** 函数名称 : Timer0_isr(void) interrupt 1 using 1
** 函数功能 : 定时器中断程序
********************************************************************************
*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x3c; //重新赋值,方式1是16位计数器,不能硬件重装初始值
TL0=0xaf;

if(cnt<20)
{
cnt ++ ;
}else
{
cnt = 0 ;
if(sw==0)
{
if(timer_miao<59)
{
timer_miao++;
}else
{
timer_miao = 0 ;
if(timer_fen<59)
{
timer_fen++;
}else
{
timer_fen = 0 ;
if(timer_shi<23)
{
timer_shi++;
}else
{
timer_shi = 0 ;
}
}
}
}
}
}
void Timer1_isr(void) interrupt 3
{
TH1=0x03; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=0xe8;
if(scnt<7)
{
scnt ++ ;
}else
{
scnt = 0 ;
}
switch(scnt)
{
case 0 : P0 = 0xfe ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_miao%10] ;datacs=1;datacs=0; break ;
case 1 : P0 = 0xfd ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_miao/10] ;datacs=1;datacs=0; break ;
case 2 : P0 = 0xfb ;chipcs = 1 ; chipcs = 0 ; P0= 0x40 ;datacs=1;datacs=0; break ;
case 3 : P0 = 0xf7 ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_fen%10] ;datacs=1;datacs=0;break ;
case 4 : P0 = 0xef ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_fen/10] ;datacs=1;datacs=0;break ;
case 5 : P0 = 0xdf ;chipcs = 1 ; chipcs = 0 ; P0= 0x40 ;datacs=1;datacs=0; break ;
case 6 : P0 = 0xbf ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_shi%10] ;datacs=1;datacs=0;break ;
case 7 : P0 = 0x7f ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_shi/10] ;datacs=1;datacs=0;break ;
}
}
void key(void)
{
if(key1==0)
{
if(count<8000)
count ++ ;
}else
{
if(count>5000)
{
if(sw<3)
sw++;
else
sw=0;
}
count = 0 ;
}
if(key2==0)
{
if(count1<8000)
count1 ++ ;
}else
{
if(count1>5000)
{
switch(sw)
{
case 0 : spk_on = 1 ; time_rch=0;break ;
case 1 : if(timer_shi<23)timer_shi++;else timer_shi = 0 ; break ;
case 2 : if(timer_fen<59)timer_fen++;else timer_fen = 0 ; break ;
case 3 : if(timer_miao<59)timer_miao++;else timer_miao = 0 ; break ;
}
}
count1 = 0 ;
}
if(key3==0)
{
if(count2<8000)
count2 ++ ;
}else
{
if(count2>5000)
{
switch(sw)
{
case 0 : spk_on = 0 ; time_rch=0; break ;
case 1 : if(timer_shi>0)timer_shi--;else timer_shi = 23 ; break ;
case 2 : if(timer_fen>0)timer_fen--;else timer_fen = 59 ; break ;
case 3 : if(timer_miao>0)timer_miao--;else timer_miao = 59 ; break ;
}
}
count2 = 0 ;
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{
sw=0;
noise_shi = 0 ;
noise_fen = 2 ;
Init_Timer0();
while(1)
{
key();
}
}

是proteus的吗


51单片机的区别
89S51在工艺上进行了改进,89S51采用0.35新工艺,成本降低,而且将功能提升,增加了竞争力。89SXX可以向下兼容89CXX等51系列芯片。同时,Atmel不再接受89CXX的定单,大家在市场上见到的89C51实际都是Atmel前期生产的巨量库存而以。如果市场需要,Atmel当然也可以再恢复生产AT89C51。89S51相对于89C51增加的新功能...

at89c51单片机由哪些主要功能部件组成
◆ 2 、控制器:由指令寄存器 IR 、指令译码器 ID 、定时及控制逻辑电路、程序计数器 PC 组成,使单片机的运行控制中心。 PC 的结构与功能: 16 位的程序寄存器,控制程序的执行。 IR , ID 的功能;二、 8051 的片内存储器 ◆ ROM : 4KB ,地址 0000H--0FFFH (使用时) ◆ RAM : 12...

stc89c51与stc89c52有什么区别?
FLASH PERAM,而。AT89C52 的内部FLASH PERAM 增加1倍,达到8K。3、52还多了一个定时器,所以可以说52是51(这个51是指stc89c51,不是51内核)的增强型;4、中断源增加:AT89C52 除了具备 AT89C51 的定时器\/计数器 T0 和定时器\/计数器 T1,还额外增加了一个定时器\/计数器 T2。单机片:...

单片机AT89C51各个引脚的作用有哪些?
在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:既可用于标准输入输出I\/O,也可用于外部程序存储器或数据存储器访问时的高八位地址。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:既可以作标准输入输出I\/O,也可作为AT89C51的一些特殊功能口, 管脚 备选功能 P3.0 RXD(...

单片机AT89c51和AT89S51有什么不一样?
AT89S51与AT89C51相比,外型管脚完全相同,AT89C51的HEX程序无须任何转换可直接在AT89S51运行,结果一样。AT89S比AT89C51新增了一些功能,支持在线编程和看门狗是其中主要特点。它们之间主要区别在于以下几点:1.引脚功能:管脚几乎相同,在AT89S51中P1.5,P1.6,P1.7具有第二功能,即这3个引脚的第二功能组成了...

AT89C51片高128单元是什么区
AT89C51 的高128单元,仅仅有 21 个单元可用,称为特殊功能寄存器。AT89C52 的高128单元,除了特殊功能寄存器,还有 128 字节的内部 RAM。

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
适用于单片工作。告警搜索命令 0xEC 执行后只有温度超过设定值上限或下限的片子才做出响应。温度变换 0x44 启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。读暂存器 0xBE 读内部RAM中9字节的内容写暂存器 0x4E 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该...

以AT89C51 单片机为核心,制作一个 LCD 显示的智能电子钟
include"lcd.h"\/ 函 数 名 : Lcd1602_Delay1ms 函数功能 : 延时函数,延时1ms 输 入 : c 输 出 : 无 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。\/ void Lcd1602_Delay1ms(uint c) \/\/误差 0us { uchar a,b;for (; c>0; c--){ for (b=...

关于AT89C51单片机P0引脚的疑惑
单片机的引脚输出电压电流一般有多少 :IO口的置1时一般输出3.3-5V的电压(这和给单片机供电的电压一样得的)能否把单片机某个管脚置1 使其输出高电平点亮一盏LED灯:这个要看需要驱动的LED的工作电压和工作电流 如果单片某个引脚置1 但是在其输出口接地 这个引脚单片机内部识别是0还是1:单片...

AT89C51与AT89S51的区别
它们之间主要区别在于以下几点:1.引脚功能 引脚几乎相同,改变是,在AT89S51 P1.5中,P1.6,P1.7具有第二功能,即这三个引脚的第二功能构成一个串行ISP编程接口。2.编程功能 AT89C51仅支持并行编程,而AT89S51不仅支持并行编程,还支持ISP在线编程。在编程电压方面,AT89C51除5V外还需要12V Vpp才能...

莱州市15212124884: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. -
钱欣那格: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.

莱州市15212124884: 电子钟的设计(带按键调整) 任务要求:利用AT89C51单片机设计简易电子钟(六位),通过6位共阴 -
钱欣那格: #include#define uchar unsigned char...要是PROTEUS的话差不多是这样,要是不想麻烦搞个74595的话P1就直接连(有没有都一样有的话比较整洁,没有的话程序上省点脑筋)主按键就用INT0,我没用P0口是因为懒得加上拉电阻,高低电平暂时先设成低的,思路就是P2口片选,当INT0触发时,你可以用while循环兜住不让出去,第一次是片选前两位“时”,第二次分第三次秒,如果第四次按下P32,也就是进入中断后第三次按下按键,结束中断,调到main.思路应该是这样当然肯定漏洞很多,先吃个饭再看看.

莱州市15212124884: 51单片机 可编程作息时间控制器设计 -
钱欣那格: 本设计是可编程作息时间控制器设计,由单片机AT89C51芯片和LCD、LED显示器,辅以必要的电路,构成一个单片机四路可调闹钟.电子钟可采用数字电路实现,也可以采用单片机来完成.LCD显示“时”,“分”,LED亮灯来表示闹钟的到来...

莱州市15212124884: 谁有用AT89C51单片机来设计电子钟的设计 -
钱欣那格: .;有秒、分钟:14 此电子钟主要选用AT89C51单片机控制..你可以看 一下下面的参考资料,便于使用;市电断电后能继续保持时间的正常运行,来电后恢复显示.,外形美观、大方: hnmegpkmoi31328377562011-10-13 6:17,每年的时间误差小于三分钟;还可用遥控来对电子钟进行调整..,并采用数字显示、小时及星期的显示,计时准确,显示醒目、直观

莱州市15212124884: 求1个利用51单片机AT89c51做一个简易电子钟的程序,仿真图如下.求大神帮忙. -
钱欣那格: 好评哦,亲//======================================//数码时钟#include#include typedef unsigned char uint8; uint8 smgdate[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; uint8 smgbit[8]={...

莱州市15212124884: 51单片机设计一个电子钟,如何实现闹钟功能? -
钱欣那格: 简单啊,你肯定是用定时中断来做实时时钟的吧,每次中断计数到了秒之后,判断一下当前的时间是否等于闹钟时间,相等的话就驱动蜂鸣器响一定时间就可以了,不相等的话什么都不做

莱州市15212124884: 基于AT89C51单片机的电子万年历设计,能够显示日期,时间,温度湿度,最好是闹钟.急急急,求大神指点 -
钱欣那格: 单片机读取时钟芯片和温湿度传感器的数据,然后在1602上面做显示.下载DS1302和LCD1602的数据手册,看看工作时序和寄存器就行了.

莱州市15212124884: 跪求一个用at89c51实现的数字电子钟c语言程序. -
钱欣那格: 这样滴问题应该自己慢慢尝试,才有提高,我看下,一会发你 程序没错,只是把端口值改下就可以啦 case 1: P0=0xfe; //第一个LED亮 break; case 2: P0=0xfc; //二个LED亮 break; case 3:P0=0xf8

莱州市15212124884: 用AT89C51设计电子时钟并画电路图? -
钱欣那格: 89C51 LED电子钟 参考链接: http://www.51picavr.com/news/c8/2009-01/109.htm *APPLICATION NOTE E6000 ICEXPLORER *************** * Title: FOR colk_time * * Version: 00 * * Last Updated: * * MCU: AT89C91 * * FOR: WWW.PICAVR....

莱州市15212124884: 基于单片机设计的电子钟 -
钱欣那格: 555时基电路+ATM51

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