用51单片机设计一个电子钟

作者&投稿:伏琛 (若有异议请与网页底部的电邮联系)
用51单片机做一个LED显示的电子钟~

#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-400-A clock";
uchar code table1[]=" --:--:-- ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]=" ";
uchar clk_time[3]; //秒,分,时寄存器初始值
sbit T_RST=P2^2;//ds1302-5
sbit T_IO=P2^3;//ds1302-6
sbit T_CLK=P2^4;//ds1302-7
sbit en=P2^5; //参照LCD1602说明档,使能信号
sbit rw=P2^6; //。。。。。。。。,读写信号端(输入高电频时为读,低电为写)
sbit rs=P2^7; //。。。。。。。。,数据/命令选择端(H/L)
sbit led=P1^0;
sbit dula=P1^1;
sbit wela=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit up=P3^3;
sbit down=P3^4;
sbit set=P3^2;
sbit did=P1^4;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,smie;
/******************DS1302:写入操作(上升沿)*********************/

void write_byte(uchar da)
{
uchar i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}

/******************DS1302:读取操作(下降沿)*****************/
uchar read_byte(void)
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);

}

/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(uchar addr,uchar da)
{
T_RST=0; //停止工作
T_CLK=0; //只有在CLK为低电平时,才能将RST置为高电平,然后才能传输数据
T_RST=1; //重新工作
write_byte(addr); //写入地址

write_byte(da);
T_RST=0;
T_CLK=1;
}

/******************DS1302:读取数据(先送地址,再读数据)**************************/
uchar read_1302(uchar addr)
{
uchar temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}





/***********************延时程序=a*1ms**************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void fn()
{
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(320);
did=1;
delay(400);
}
void write_com(uchar com)
{
led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
dula=1;
delay(1);
dula=0;
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}

void write_data(uchar date)
{
led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
dula=1;
delay(1);
dula=0;
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void morning()
{ shour=clock_ss*10+clock_sg;
smie=clock_fs*10+clock_fg;
if(b==0)
{
if(nhour==shour)
{
if(smie>=nmie)
{
fn();
}
}
}


}
void init()
{
b=0;
P0=0xff;
delay(5);
led=1;
delay(5);
P0=0xff;
led=0;
dula=0;
wela=1;
delay(5);
wela=0;//关ME-400开发板数码管
nhour=0;
nmie=0;
rw=0;
en=0;
write_com(0x38);//设置液晶
write_com(0x0c);//设光标等
write_com(0x06);//写一个字符地址指针加1且光标加1
write_com(0x01);//清屏
write_com(0x80);//设置s地址指针
}
void display(uchar add,date)
{
if(b==0)
{
clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;
led=0;
clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;
led=0;
clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;
write_com(0x80+0x44);
write_data(0x30+clock_ss);
write_com(0x80+0x45);
write_data(0x30+clock_sg);
write_com(0x80+0x47);
write_data(0x30+clock_fs);
write_com(0x80+0x48);
write_data(0x30+clock_fg);
write_com(0x80+0x4a);
write_data(0x30+clock_ms);
write_com(0x80+0x4b);
write_data(0x30+clock_mg);

}
if(b!=0)
{
clock_s=date/ 10; clock_g=date%10;
write_com(0x80+0x40+add);
write_data(0x30+clock_s);
write_data(0x30+clock_g);
}

}
void key()
{
uchar clock_s1, clock_s2, clock_f1, clock_f2;
rw=0;

if(set==0)
{
delay(10);
if(set==0)
{
did=0;
delay(10); did=1;
b++;

}
while(!set);

if(b==1)
{
hour=clock_ss*10+clock_sg;
mie=clock_fs*10+clock_fg;
write_com(0x80+0x45);
write_com(0x0f);

}
if(b==2)
{
write_com(0x80+0x48);


}
if(b==3)
{
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table2[num]);

}


write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45);
}
if(b==4)
{

write_com(0x80+0x48);
display(7,nmie); write_com(0x80+0x48);

}
if(b==5)
{
write_com(0x80+0x40);
for(num=0;num<4;num++)
{
write_data(table3[num]);

}
write_com(0x80+0x45);
write_com(0x0c);
b=0;
clock_s1=hour/10;//十进制转十六进制
clock_s2=hour%10;//十进制转十六进制
clock_s1=clock_s1&0xff;//十进制转十六进制
clock_s2=clock_s2&0xff;//十进制转十六进制
clock_s1<<=4;//十进制转十六进制
clock_s1=clock_s1|clock_s2;//十进制转十六进制

clock_f1=mie/10;//十进制转十六进制
clock_f2=mie%10;//十进制转十六进制
clock_f1=clock_f1&0xff; //全1出1 与运算
clock_f2=clock_f2&0xff;//十进制转十六进制
clock_f1<<=4;//十进制转十六进制
clock_f1=clock_f1|clock_f2;//十进制转十六进制

write_1302(0x8e,0x00); //WP=0 写操作
write_1302(0x80,0x00);//写秒
write_1302(0x82,clock_f1);//写分
write_1302(0x84,clock_s1);//写时
write_1302(0x86,0x14);//写日
write_1302(0x88,0x02);//写月
write_1302(0x8a,0x06);//写星期
write_1302(0x8c,0x09);
write_1302(0x8e,0x80); //WP=1 写保护


}
}
if(b!=0)
{
if(up==0)
{
delay(10);
if(up==0)
{
did=0;
delay(10);
did=1;
while(!up);
if(b==1)
{

hour++;
if(hour>=24)
{
delay(1);
hour=0;
}
display(4,hour);
write_com(0x80+0x45);

}
if(b==2)
{
mie++;

if(mie>=60)
{
mie=0;
}
display(7,mie);
write_com(0x80+0x48);
}
if(b==3)
{

nhour++;
if(nhour>=24)
{
delay(1);
nhour=0;
}
display(4,nhour);
write_com(0x80+0x45);

}
if(b==4)
{
nmie++;

if(nmie>=60)
{
nmie=0;
}
display(7,nmie);
write_com(0x80+0x48);
}
}

}

if(down==0)
{
delay(10);
if(down==0)
{
did=0;
delay(10);
did=1;
while(!down);
if(b==1)
{
hour--;
if(hour<0)
{

hour=23;
}
display(4,hour);
write_com(0x80+0x45);

}
if(b==2)
{
mie--;
if(mie<0)
{
mie=59;
}
display(7,mie);
write_com(0x80+0x48);
}
if(b==3)
{
nhour--;
if(nhour<0)
{

nhour=23;
}
display(4,nhour);
write_com(0x80+0x45);

}
if(b==4)
{
nmie--;
if(nmie<0)
{
nmie=59;
}
display(7,nmie);
write_com(0x80+0x48);
}

}

}
}
}

void main()
{
uchar temp=0x80;
uchar i;
init();
for(num=0;num<14;num++)
{
write_data(table[num]);
delay(100);
}

write_com(0x80+0x40); // 设置数据地址指针为0X40
for(num=0;num<15;num++)
{
write_data(table1[num]);

}
/*for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}*/
write_1302(0x8e,0x00);
write_1302(0x90,0xa4);
write_1302(0x8e,0x80);
while(1)
{

if(b==0)

{ temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}
display(0x4b,0x00);
}

morning();
key();

}
}

1602做的时钟

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



巧了,国亲无聊做了一个玩玩,给你看看把,其实电子钟挺简单的,下面是程序:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit ch=P3^2;

sbit key=P3^5;

sbit key1=P3^4;

uchar t0,numn,numy,numr,nums,numf,numm,sw,w,q,b,s,g,sw1,w1,q1,b1,s1,g1,rq,temp,x;

uint u;

void init();

void display(uchar,uchar,uchar,uchar,uchar,uchar);

void delay(uint z)

{

 uint x,y; 

 for(x=z;x>0;x--)

  for(y=70;y>0;y--);

}

void main()

{

 init();

 while(1)

 {

  if(rq==1)

  {

   if(rq==1)

      display(sw,w,q,b,s,g);

  }

  else if(rq==2)

  {

   if(rq==2)

   display(sw1,w1,q1,b1,s1,g1);

  }

  else if(rq==3)

   {

    if(rq==3)

     display(w,w,w,w,w,w);

   }

  else if(rq==4)

  {

   uchar i;

   temp=0x01;

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

    {

    P1=~temp; 

    delay(100);   

    temp<<=1; 

    }

   temp=0x80;

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

    {

    P1=~temp; 

    delay(100);    

    temp>>=1;

    }

   temp=0x01;

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

    {

    P1=temp;

    delay(100);    

    temp<<=1;

    }

   temp=0x7F;

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

    {

    P1=temp;

    delay(100); 

    temp>>=1;

   }

  }

  else

   rq=1;

 }

}

void init()

{

 rq=1;

 x=1;

 nums=22;

 numf=0;

 numm=0;

 numn=9;

 numy=10;

 numr=15;

 TMOD=0x11;

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 IT0=1;

 IT0=2;

 EA=1;

 EX0=1;

 EX1=1;

 ET0=1; 

  TR0=1;

 ET1=1;//IE=0x82 //CPU开中断,CT0开中断 

}

void timer0() interrupt 1

{

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 t0++;

 if(key==0)

 {

  delay(50);

  if(key==0)

  { 

   x++;

   while(key==0);

  }

 }

  if(x==2&rq==1)

  {

   //P0=0xf3;

   if(key1==0)

    {

     numf++;

     while(key1==0);

    }

  }

  else if(x==3&rq==1)

  {

  // P0=0xfc;

   if(key1==0)

    {

     nums++;

     while(key1==0);

    }

  }

  else if(x==2&rq==2)

  {

  // P0=0xcf;

   if(key1==0)

    {

     numr++;

     while(key1==0);

    }

  }

  else if(x==3&rq==2)

  {

  // P0=0xf3;

   if(key1==0)

    {

     numy++;

     while(key1==0);

    }

  }

  else if(x==4&rq==2)

  {

  // P0=0xfc;

   if(key1==0)

    {

     numn++;

     while(key1==0);

    }

  }

  else

  {

   x=1;

  }

 if(t0==20)

  {

   t0=0;

   numm++;

  }

  if(numm==60)

  {

   numm=0;

   numf++;

  }

  if(numf==60)

  {

   for(u=500;u>0;u--)

   {

    bell=0;

    delay(1);

    bell=1;

    delay(1);

   }

   numf=0;

   nums++;

  }

  if(nums==24)

  {

   nums=0;

   numr++;

  }

  if(numr==30)

  {

   numr=0;

   numy++;

  }

  if(numy==12)

  {

   numy=0;

   numn++;

  }

  if(numn==100)

  {

   numn=0;

  }

   g=numm%10;

   s=numm/10;

   b=numf%10;

   q=numf/10;

   w=nums%10;

   sw=nums/10;

   g1=numr%10;

   s1=numr/10;

   b1=numy%10;

   q1=numy/10;

   w1=numn%10;

   sw1=numn/10;

}

void exert0() interrupt 0

{

 delay(50);

 rq++;

 while(ch==0);

}

void t0int() interrupt 3

{

 TR1=0;

 bell=!bell;

 TH1=timer0h;

 TL1=timer0l;

 TR1=1;

}

void exert1() interrupt 2

{

 rq=100;

}

void display(uchar sw,uchar w,uchar q,uchar b,uchar s,uchar g)

{

 P2=tabdu[sw];

 P0=tabwe[0];

 delay(5);

 P0=0xff;

 

 P2=tabdu[w];

 P0=tabwe[1];

 delay(5);

 P0=0xff;

 P2=tabdu[q];

 P0=tabwe[2];

 delay(5);

 P0=0xff;

 P2=tabdu[b];

 P0=tabwe[3];

 delay(5);

 P0=0xff;

 P2=tabdu[s];

 P0=tabwe[4];

 delay(5);

 P0=0xff;

 P2=tabdu[g];

 P0=tabwe[5];

 delay(5);

 P0=0xff;

}

下面这个是电路图,图我没有画啊,不过我用仿真去做,应该跟电路图差不多了,你可以参考下,可以实现流水灯,闹铃,日期,时间,等功能,上面给你的是按照你的要求,另外我懒得改了所以多了个功能就是可以看日期,你看上面的程序,第一个按钮ch,按一下查看日期,再按一下查看温度(被删了,随机现在是随机显示一个数字),再按一下是流水灯,再按一下又回到时间,另外两个键key/key1;按key是选择锁定分还是时,如果你当前显示的是日期的话就是顺序锁定日,月,年,按key1调整,图上显示的是22点00分09秒,就这样了

设计方案的话..........呵呵,AT89S52+6个数码管+11.0592晶振+2个30P电容+3个按钮+1个10UF电容如图连接,你自己去写方案把,分数给那么少,就只帮你那么多了




如何设计51单片机系统最小系统?
1、时钟电路51 单片机上的时钟管脚:XTAL1(19 脚) :芯片内部振荡电路输入端。XTAL2(18 脚) :芯片内部振荡电路输出端。2、复位电路在单片机系统中,复位电路是非常关键的,当程序跑飞(运行不正常)或死机(停止运行)时,就需要进行复位。MCS-5l 系列单片机的复位引脚RST( 第9 管脚) 出现2个...

51单片机中怎样编写一个程序??
编写程序的步骤:(1)引入头文件;(2)宏定义;(3)函数初始化定义;(4)主程序;(5)各子程序初始化或功能子程序编写;(6)中断程序(如有)。

51单片机,利用0和1两个数字组成16种模式,并用四个开关控制数码显示一...
以下是使用51单片机(如STC89C52)和4个开关来控制数码管显示一位密码的简单示例代码。假设使用的是共阴数码管,并且数码管的引脚连接到了单片机的P0口。include <reg52.h> \/\/ 引入单片机寄存器定义头文件\/\/ 数码管显示的密码模式,共16种,每种模式使用4位二进制表示unsigned char password[16] = { ...

51单片机系列:单片机最小系统
51单片机虽然使用时间最早、应用范围最广,但是在实际使用过程中,一个和典型的问题就是相比其他系列的单片机,51单片机更容易受到干扰而出现程序跑飞的现象,克服这种现象出现的一个重要手段就是为单片机系统配置一个稳定可靠的电源供电模块。 此最小系统中的电源供电模块的电源可以通过计算机的USB口供给,也...

我想问下,我刚学完51单片机,打算自己设计一个小玩意,请问要设计什么比较...
呵呵 刚学完51单片机 做小玩意的目的我想主要是要巩固自己所学的知识。像51单片机 几个主要功能模块1、并口 2、串口通讯 3、并口数据存储 4、LCD显示 5、AD检测 6、IIC总线 7、SPI总线 建议做个电子台历 带LCD显示、带按键输入、带万年历、带备忘录、带温度检测、带SD卡扩展、带串口通信、可...

用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...分内容转自:《51单片机C语言创新教程》温子祺等著。原理:软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮 度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了...

51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示。
ORG000BH LJMPT0INT ORG001BH LJMPT1INT LEDDEQU30H LEDCEQU 36H SECCEQU 37H TCNTEQU 3AH ORG 0030H ;--- TABLE: ; 共阴极数码管显示代码表 DB 0FCH;"0"00H DB 60H;"1"01H DB 0DAH;"2"02H DB 0F2H;"3"03H DB 66H;"4"04H DB 0B6H;"5"05H DB 0BEH;"6"06H DB ...

设计一个由51单片机控制的一到五秒的程序延时程序!再加个数码管显示延时...
include <reg51.h> \/\/调用51单片机的头文件 define uchar unsigned char define uint unsigned int unsigned char code LED[]= { \/\/定义表格一定要使用code,这样会做到程序存储区中 0x3F, \/\/"0"的字形表,0B00111111 0x06, \/\/"1"的字形表,0B00000110 0x5B, \/\/"2"的字形...

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
void timeoff() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65526-50000)%256;a++;if(a%20==0){ num++;if(num==999){ num=0;} } }void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} uint fb(){ bai=num\/100;return bai;} uint fs(){ shi=...

以51单片机为基体 用C语言设计一个计数器 要求显示数据8位 有复位功 ...
void dis_cnter(void) 显示计数器值子程序开始 {uchar i; 定义字符型局部变量i P3_7=1;P3_6=1; 消隐有效,允许显示 for(i=0;i8;i++) 循环8次 {SBUF=SEG7[cnt];while(!TI);TI=0;} 根据8个单元的计数值查表发送显示 P3_7=0; 关闭消隐,正常显示 } 显示计数器值子程序结束 void ...

湘西土家族苗族自治州18417564124: 怎么用51单片机做一个时钟 -
楚独他迪: 一片单片机+一个LED数码模块或LCD液晶模块+一段简单的程序=一个简单的时钟. 一片单片机+一片DS1302或其他的时基芯片+一个LED数码模块或LCD液晶模块+一段简单的程序=一个实用的时钟. 系统构成确定了以后,程序就有现成的了,可以移步到百度网页“百度一下”里搜索,资源多如牛毛.

湘西土家族苗族自治州18417564124: 51单片机制作简易电子钟,求电路图和程序,要求6位显示,24小时制 -
楚独他迪:#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}; uchar sec,min,hour; bit secup=00; uchar n=0; void delay(unsigned int ms) { unsigned int i=...

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

湘西土家族苗族自治州18417564124: 设计一个基于AT89C51单片机的电子钟 -
楚独他迪: #include #define uchar unsigned char sbit k1=P1^0; sbit k2=P1^1; sbit sounder=P3^7; uchar h=12,m=0,s=58,c=0; //延时子程序 void delay(unsigned int a){while(--a); } //数码管显示(共阳): 0 1 2 3 4 5 6 7 8 9 uchar code dArr[]={0xC0,0xF9,0...

湘西土家族苗族自治州18417564124: 51单片机制作电子钟voidtimer0(void)interr
楚独他迪: 农历转换需要以个数据库,我赠送你一C语言的农历转换#define c_sun 0/********阳历... 0x66,0x4B,0x3e, //1930 0x0d,0x4A,0x51, //1931 0x0e,0xA5,0x46, //1932 0x56,0xd4,0...

湘西土家族苗族自治州18417564124: 基于51单片机的数码管设计电子时钟,可以调时间的,怎么弄唉,大家帮帮忙... -
楚独他迪: 说一下步骤吧:1、数码管驱动电路设计.一般用三极管如9013或者锁存器如74HC573来驱动,使其能够正常亮灭.2、使用动态扫描的方式让数码管能够显示你想要的数字,这个可以用中断来扫描也可以不用.3、使用实时时钟芯片如DS1302...

湘西土家族苗族自治州18417564124: 51单片机电子时钟设计
楚独他迪: 可以只用一个按键:长按3s选择调整时、分,短按进行加调整、再长按5s清零

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

湘西土家族苗族自治州18417564124: 求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]={...

湘西土家族苗族自治州18417564124: 以51单片机为核心器件,组成一个电子时钟系统. -
楚独他迪: 调用定时器中断,发出一个频率1s的脉冲,用这个来计数.加上几个按键,按键接收到一个电平信号这个数也+1.满60清零,分钟那个数+1,分钟满60清零,小时加1.在循环中不停的和你设定的定时时间做对比,一旦相同就启动蜂鸣器提醒.

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