用51单片机做一个LED显示的电子钟

作者&投稿:吁凡 (若有异议请与网页底部的电邮联系)
51单片机 制作一个 led点阵电子时钟~

1将文字和图形存储在RAM中,占用空间32个字节,按照BMP位图形式存储,需显示时对应高的逻辑位显示亮,对应低的逻辑位显示灭即可。如下
B00 01 02 03 04 05 06 07 B10 11 12 13 14 15 16 17
B20 21 22 23 24 25 26 27 B30 31 32 33 34 35 36 37
…………………………………………………………………………
Be0 e1 e2 e3 e4 e5 e6 e7 Bf0 f1 f2 f3 f4 f5 f6 f7
2水平滚动显示时间就是逐位的从右向左移动位图
3使用定时器完成秒计时功能,调整时对秒计数器进行增、减操作

这个就是在你的数码管显示语句中,任意加入一个即可

像你说的在小时和分钟之间加一个小数点,那么就加一个小时个位数显示的语句

只是这个增加的语句不是显示数字,是单独显示那个小点而已

循环中,不断的依次点亮四个数字和一个小数点,人眼是分不出来的,就可以达到效果了

另外,你需要一个LED闪烁,代表秒的显示,可以利用定时器来完成

观察你的程序,实在是不敢恭维,尤其是数码管的显示部分太乱了

程序中好像还没有自动加时的部分,并且按键处理还没有消抖措施

不多说了,上程序,俺刚刚为你编写的,测试的时候使用的端口和你的不一样

在我的开发板上测试成功后,按照你的板子端口做了修改

如果你直接复制到你的程序中不能使用,检查及更改一下端口即可

如果满意记得采纳哦,若有疑问可以随时向我提问

/***************************************************************************/
//#include
#include
sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;
char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
unsigned int h,m,s,t,n;
/***************************************************************************/
void delay(char hs)//延时函数
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
/***************************************************************************/
void XS(unsigned int xh,unsigned int xs) //显示子函数
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xh/1)%10; d4=(xh/10)%10;

P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒个位
P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位
P0=0x7f; P1=0x04; delay(10); P1=0x00;//小数点
P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//时个位
P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//时十位
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定时器初始化
while(1)//主循环
{
if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){delay(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//调用数码管显示函数
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED闪烁
if(n>1000){n=0;s++;}//如果达到一秒,秒加一
if(s>59){s=0;m++;}//如果达到一分,分加一
if(m>59){m=0;h++;}//如果达到一小时,小时加一
if(h>23){h=0;}//如果达到24小时,小时清零
}
/***************************************************************************/

#include<reg52.h>
#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做的时钟


用51单片机设计一个电子钟
巧了,国亲无聊做了一个玩玩,给你看看把,其实电子钟挺简单的,下面是程序: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...

我用51单片机连接L9110驱动电机。单片机的I\/O口本来输出的是高电平,为...
首先,确定你的9110是好的,是否你接的那个引脚对地短路了 其次,你确定你接的L9110的引脚是对的,不是接到其他输出低电平的引脚了 这两个问题都解决了,那可能就是单片机驱动能力不够了,说明你的原理有问题

用51单片机4位数码管显示"H38C”,"L25C",C语言程序分别怎么写?P1口是...
0xc7,0xa4,0x92,0xc6}; \/\/L25C的编码 \/\/延时函数 void delay(uchar t){ uchar i;while(t--){ for(i = 0;i = 50;i++);} } void main(){ uchar i,j,m,n,a;P1 = 0xff;P2 = 0xff;while(1){ for(m = 0;m<10;m++)\/\/显示10次h38c { P2 = 0x10;for(i = 0...

用89c51单片机写一个数码管显示HELLO的程序,是在一个七段数码管上依次...
sbit led1 = P1^0;sbit led2 = P1^1;sbit led3 = P1^2;sbit led4 = P1^3;sbit led5 = P1^4;sbit led6 = P1^5;sbit led7 = P1^6; \/\/看清楚自己的管脚,不一定对应,这里采用P0对应段选 code unsigned char led_paly[5] = {0x76,0x79,0x38,0x38,0x5c};\/\/ H E L L...

求助基于51单片机的RLC测量仪源程序,我是在proteus上做的图
我之前做的是用lcd显示的 改个接口吧,希望能帮到你,有问题交流下的 include <reg52.h> include <stdio.h> include <math.h> include <absacc.h> unsigned char inte=0; \/\/频率值溢出定时器值 unsigned long int uu=0; \/\/频率相对应的计数值 unsigned long int ff=0; \/\/实际频...

51单片机做数字电子钟
51单片机做数字电子钟 设计一个数字电子钟,要求可以进行时、分、秒显示,最大显示时间为23:59:59,并且可以通过按键进行时、分调整。画出硬件连接电路图,说明各个控制信号的作用。᠑...  设计一个数字电子钟,要求可以进行时、分、秒显示,最大显示时间为23:59:59,并且可以通过按键进行时、分调整。

我想问一下用过51单片机做智能小车的朋友们,我用的是l9110s驱动...
电池有电没有,电池和电路间的焊点是否有虚焊,线是否断路,电路的电源部份是否有故障,是否电路功率太大,电池一上去就用完了等等,当年我我们玩智能小车的时候,也是问题多多,一个一个排除就好了

51单片机汇编语言的led亮灯编程题求解,必采纳?
LED1 BIT P3.7 ; 程序没有改动,为了配合仿真图只改了端口。KEY1 BIT P3.2 LJMP MAIN ORG 0030H MOV R1,#1 ; 亮灯个数 MAIN: MOV P1,#0FFH CHECK: JB KEY1,CHECK MOV P1,#11111111B MOV R2,#8 LOOP: INC R1 ; 每次亮灯个数r1+1 MOV A,P1 CLR C RRC A MOV P1,A ;...

朋友们帮忙写个51单片机的按键小程序?汇编的
(1);P3.3小键盘按下P1.3亮再按0.5秒灭。org 0000h ajmp main0 org 0080h MAIN0:CLR 21H ;清标志 main:mov c,p3.3 ;检测按键 jc main MOV R6,#200 ;设定延时 MOV R7,#200 TT0:JNB 21H,TT2 ;检测灯状态 tt:mov c,p3.3 ;检测按键 jnc tt1 JNB 20H,MAIN ;检测...

编程题 设MCS-51单片机系统中晶振频率为12MHz,欲使用定时器\/计数器1...
采用12Mhz晶振的51单片机,软件如下(调试通过)include <reg52.h> define PERIODH (65536l-50000l)\/0X100 \/\/设50ms中断1次TH1初值 define PERIODL (65536l-50000l)%0X100 \/\/设50ms中断1次TL1初值 \/\/如果需要极精确的延时,应根据实际编译后的产生的汇编指令,扣除掉中断响应中重装所占用的...

沂源县15556379203: 如何用51单片机设计16*128点阵的LED显示器
怀柏更昔: 1:Dais-PG206试验箱,这是教学用的,应该是你们学校的实验仪器,建议你到实验室了解一下.2:16*16点阵就是256个LED发光二极管集成在一块上,16个脚接高电平16脚通过限流电阻接地,通电就亮,原理很简单.3:通信原理这个定义很...

沂源县15556379203: 基于单片机的led显示 -
怀柏更昔: 连接好电路,通过软件给led送个低电平(如果数码管是共阳极的前提) 至于显示的内容,0~A的代码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71

沂源县15556379203: 51单片机点阵LED显示. -
怀柏更昔: 作为小白你先不要跨步太大.先从简单的流水灯开始做吧,做出各种闪烁效果,然后数码管,都懂了然后再LED点阵就容易理解多了

沂源县15556379203: 怎么设计单片机控制LED闪烁,并且可以组成一个"LED"灯字! -
怀柏更昔: 可以这样子,把所有LED并联起来,直接接单片机随便哪个IO口,然后再加个1K上拉电阻,用51单片机可以实现,具体程序为 #include"reg51.h" sbit LED=P1^0;//把LED灯接在P1.0口就行 void delay(int ms); void main() {while(1){LED=~...

沂源县15556379203: 急求,51单片机万能LED灯.(显示一个笑脸图案的)1,电路图,2,编程程序,3,电路结构. -
怀柏更昔: 把LED灯在电路板上拼成一个笑脸图案就可以了.把LED的负极连在一起接到电源负极,搭建一个三极管共射电路,LED的正极连在一起经过一个适当阻值的电阻接到三极管共射电路的输出端,三极管的控制端---基极接单片机的IO口,编写程序使该口为高电平,笑脸即点亮.哈哈,很简单的,你试试.

沂源县15556379203: 谁做过用51单片机来做点阵LED滚动字?给个设计思路(不要程序,只要一个思路就行) -
怀柏更昔: 先做一个16X16的LED点阵,一般的教学课本里有这样的电路把.然后你先根据这个电路做个显示静态的字体.比如说要显示1这个汉字,就是中间的第9列从第二行的灯到第15行的灯亮,其他的不亮.然后根据这个一字进行编码.能显示静态的,那动态滚动字就是在静态的基础上把静态的列扫描显示变成列可改变就行了.

沂源县15556379203: 基于51单片机的LED点阵显示屏设计
怀柏更昔: ABSTRACT II 第1章 前言 1 1.1 LED电子显示屏概述 1 1.3 LED显示屏的应用示例 2 第2章 显示原理及控制方式分析 3 2.1 LED点阵模块结构 3 2.2 LED动态显示原理 4 2.3 LED常见的控制方式 4 第3章 方案设计与分析 7 3.1 显示单元 7 3.2 滚屏的...

沂源县15556379203: 制作一个基于51单片机的简单电路怎么通过按键改变LED不同的闪烁效果 -
怀柏更昔: LED的闪烁可以用定时器来做,然后检测按键,检测到了按键就进入中断,并将一个变量+1 然后在定时器中断里面根据变量的取值不同跳到相应的闪烁程序去

沂源县15556379203: 51单片机控制led灯,用c语言编程 -
怀柏更昔: 给你一个矩阵键盘的参考程序 行列扫描:通过高四位全部输出低电平,低四位输出高电平.当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低...

沂源县15556379203: 80c51单片机LED很简单的一个编程 -
怀柏更昔: 以下程序,经过编译、仿真通过,可以满足要求;------------------------ ORG 0000H MOV R2, #0 LOOP: JB P3.3, LOOP INC R2 CJNE R2, #5, LOOP MOV R2, #0 CPL P1.0 SJMP LOOP;完

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