导航:首页 > 操作系统 > 电子钟单片机

电子钟单片机

发布时间:2022-02-12 12:29:04

Ⅰ 求c51单片机电子钟程序(c语言)

#include <reg51.h>
#define uchar unsigned char //定义unsigned int为uint
#define uint unsigned int //定义unsigned uchar为uchar

sbit LCD_RS = P2^0 ;
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
sbit D_SDA = P2^6; //定义74HC164数据线为P2.6端口
sbit D_SCL = P2^7; //定义74HC164数据线为P2.7端口
sbit CLK = P1^3; /*实时时钟时钟线引脚 */
sbit IO = P1^4; /*实时时钟数据线引脚 */
sbit RST = P1^5; /*实时时钟复位线引脚 */

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};

//========= 延时函数 ============
//延时时间以1ms为单位
//s决定延时时间长短
void delay_ms(uint s)
{
uint x;
for(s;s>0;s--)
{
x = 200;
while(x--);
}
}

//========= 送出一个字节给74HC164(实现串并转换) ==========
void send_out(unsigned char out)//传送一个字节8位
{
uchar i;
D_SCL = 0;
for (i=8;i>=1;i--)
{
D_SDA = out&0x80; //送数据到数据口
D_SCL = 1; //时钟线置1
D_SCL = 0; //送一时钟
out<<=1; //左移
}
}

//========= 写命令函数 ==========
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
send_out(cmd);
LCD_EN = 1;
LCD_EN = 0 ;
}

//========= 写数据函数 ==========
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
send_out(dat);
LCD_EN = 1;
LCD_EN = 0;
}

//========= LCD初始化函数 ==========
void lcd_init()
{
lcd_wcmd(0x38);
delay_ms(1);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(1);
lcd_wcmd(0x06); //向右移动光标
delay_ms(1);
lcd_wcmd(0x01); //清除LCD显示屏
delay_ms(1);
}

//========== 往DS1302写入1Byte数据 (内部函数) =============
void w_byte(uchar dat)
{
uchar i;
for(i=8; i>0; i--)
{
IO = dat & 0x01;
CLK = 1;
CLK = 0;
dat = dat >> 1;
}
}

//======== 从DS1302读取1Byte数据 (内部函数) ===================
uchar r_byte(void)
{
uchar i;
for(i=8; i>0; i--)
{

ACC = ACC >> 1;
ACC7 = IO;
CLK = 1;
CLK = 0;

}
return(ACC);
}

//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============
void write_byte(uchar addr, uchar dat)
{
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
w_byte(dat);
CLK = 1;
RST = 0;
}

//========== 指定地址往DS1302读1Byte数据 (内部函数) =============
uchar read_byte(uchar addr)
{
uchar ucData;
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
ucData = r_byte();
CLK = 1;
RST = 0;
return(ucData);
}

//============ 设置ds1302日期和时间 =============
void write_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x80;
write_byte(0x8e,0x00); // 控制命令,WP=0,写操作
for(i =7; i>0; i--)
{
write_byte(addr,*p); // 秒 分 时 日 月 星期 年
p++;
addr +=2;
}
write_byte(0x8e,0x80); // 控制命令,WP=1,写保护
}

//============ 读ds1302当前日期和时间 =============
void read_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x81;
for (i=0; i<7; i++)
{
*p = read_byte(addr); //格式为: 秒 分 时 日 月 星期 年
addr += 2;
p++;
}
}

//============ 显示函数 ===================
void lcd_disp()
{
uchar addr = 4;
lcd_wcmd(0x80 + addr);
lcd_wdat(((time[2]>>4)&0x0f)+0x30); //显示小时
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[2]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //显示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[1]>>4)&0x0f)+0x30); //显示分
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[1]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //显示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[0]>>4)&0x0f)+0x30); //显示秒
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[0]&0x0f)+0x30);

addr = 2;
lcd_wcmd(0xc0 + addr); //在第二行显示年月日和星期
lcd_wdat('2'); //显示2
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat('0'); //显示0
addr++;

lcd_wdat(((time[6]>>4)&0x0f)+0x30); //年
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[6]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[4]>>4)&0x0f)+0x30); //显示月
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[4]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[3]>>4)&0x0f)+0x30); //显示日
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[3]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat((time[5]&0x0f)+0x30); //显示星期
}

//=========== 主函数 ===============
void main()
{
lcd_init(); // 初始化LCD
write_ds1302(time);
while(1)
{
read_ds1302(time); //读DS1302数据
lcd_disp(); //LCD显示
delay_ms(500); //延时0.5秒
}
}

这是一个电子时钟,在LCD1602上显示,时钟芯片是DS1302

Ⅱ 如何做一个单片机电子时钟

这个很简单啊,两种思路:1,用单片机定时器来做,优点是外围电路简单,只需要一个单片机最小系统,和一个显示模块(1602液晶比较好);缺点是:定时不是很准,跑的时间长了会有误差,而且主要是程序,要写很多,不过程序不是很难。2,用时钟芯片,一般都用DS1302,还需要单片机最小系统和显示模块,优点是:定时准确,误差很小,在有备用电池的情况下,即使单片机掉电,也可以维持很长时间,程序相对简单。缺点是:外围电路比前者相对复杂一点。如果想做个实际的东西拿来用,建议使用第二种方法,如果是想锻炼自己的编程能力的话,选第一种吧。祝成功!

Ⅲ 51单片机电子钟

看看这个简单的仿真实例,供参考

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

#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 la=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;
la=1;
delay(1);
la=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;
la=1;
delay(1);
la=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;
la=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做的时钟

Ⅳ 单片机电子钟

愿意出钱的找我`~~980100952

Ⅵ 如何用单片机做电子钟

基本上有两种方法:
1.使用外部时钟芯片,如DS1302,DS12C887等
2.只使用MCU内部晶振提供的时间基准。
郭天祥的那个视频中,两种都有介绍,可以看下。
视频网上流传很多,可方便下载到

Ⅶ 如何用51单片机制作简易电子钟

我自己做的一个课程设计,程序运行已经成功了:

汇编程序如下:

ORG0000H

AJMPmain

ORG000BH;定时器0的中断向量地址

AJMPTIME0;跳转到真正的定时器程序处

ORG30H

main:

movdptr,#k1;

start:

MOVP0,#00H;中断预处理程序

MOVP1,#00H

MOVP3,#00H;关所有灯

MOVR0,#00H;软件计数器预清0

MOVR7,#00H

MOVR6,#00H

MOVTMOD,#00000001B;定时/计数器0工作于方式1

MOVTH0,#3CH

MOVTL0,#0B0H;即数15536

SETBEA;开总中断允许

SETBET0;开定时/计数器0允许

SETBTR0;定时/计数器0开始运行

LOOP:;判断时钟进位程序

MOVA,R1

CJNEA,#60,LOOP1;R1等于60吗?

MOVR1,#0

INCR2;R1等于60那么R2加一,R1清0

MOVA,R2

CJNEA,#60,LOOP1;R2等于60吗?

MOVR2,#0

INCR3;R2等于60那么R3加一,R2清0

MOVA,R3

CJNEA,#24,LOOP1;R3等于24吗?

MOVR3,#0

;R3等于24那么R3清0

LOOP1:

mova,r2;如果分钟显示为0,报警

cjnea,#01H,LOOP2

mova,r1

cjnea,#00H,LOOP3

clrp2.0

LOOP3:

mova,r1;如果秒钟显示为1,取消报警

cjnea,#05H,LOOP2

setbp2.0

LOOP2:;显示数据处理

MOVA,R1;取来8位二进制数

MOVB,#100

DIVAB;除以100

MOVA,B;取回余数

MOVB,#10

DIVAB;再除以10

MOVR4,A;商是十位数,存放到R4

MOVR5,B;余数是个位,存放到R5

MOV42H,R4

mOV41H,R5

;R1的BCD码放入41-42H单元

MOVA,R2;取来8位二进制数

MOVB,#100

DIVAB;除以100

MOVA,B;取回余数

MOVB,#10

DIVAB;再除以10

MOVR4,A;商是十位数,存放到R4

MOVR5,B;余数是个位,存放到R5

MOV44H,R4

MOV43H,R5

;R2的BCD码放入43-44H单元

MOVA,R3;取来8位二进制数

MOVB,#100

DIVAB;除以100

MOVA,B;取回余数

MOVB,#10

DIVAB;再除以10

MOVR4,A;商是十位数,存放到R4

MOVR5,B;余数是个位,存放到R5

MOV46H,R4

mov45H,R5

;R3的BCD码放入45-46H单元

L1:

mova,41h

movca,@a+dptr

mov51h,a

mova,42h

movca,@a+dptr

mov52h,a

mova,43h

movca,@a+dptr

mov53h,a

mova,44h

movca,@a+dptr

mov54h,a

mova,45h

movca,@a+dptr

mov55h,a

mova,46h

movca,@a+dptr

mov56h,a;将显示代码送入51H--56H

display:;显示程序

movp0,#0ffH;一

movp0,51H

movP1,#0feH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;二

movp0,52h

movP1,#0fdH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;三

movp0,53h

movP1,#0fbH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;四

movp0,54h

movP1,#0f7H

acalldelay1S

movp1,#0ffH

movp0,#0ffH;五

movp0,55h

movP1,#0efH

acalldelay1S

movp1,#0ffH

movp0,#0ffH;六

movp0,56h

movP1,#0dfH

acalldelay1S

movp1,#0ffH

;将51H-56H数据显示,

AJMPLOOP;工作处理程序

TIME0:;定时器0的中断处理程序

INCR7

MOVA,R7

CJNEA,#20,T_RET;R7单元中的值到了20了吗?

T_L1:

INCR1;到了20那么R1+1

MOVR7,#0;清软件计数器

T_RET:;二十分之一秒时的程序

incr6

mova,r6

cjner6,#3,T_over;调节时间的延迟时间

movr6,#0

jbp2.1,T_over1

mova,r2

adda,#1

cjnea,#60,T_tiao1

mova,#0

T_tiao1:

movr2,a

T_over1:

jbp2.2,T_over

mova,r3

adda,#1

cjnea,#24,T_tiao2

mova,#0

T_tiao2:

movr3,a

T_over:

MOVTH0,#3CH

MOVTL0,#0B0H;如果没到一秒重置定时常数

reti

delay1s:MOV31H,#100

D1:MOV32H,#30

D2:DJNZ32H,D2

DJNZ31H,D1

RET

delay2s:MOV33H,#255

D3:MOV34H,#255

D4:DJNZ34H,D4

DJNZ33H,D3

RET

K1:db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

Ⅷ 电子钟 单片机

见邮箱

Ⅸ 单片机电子钟

单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统

Ⅹ 51单片机做数字电子钟

这么复杂的东西给这么少分 晕死了 你也太小气了吧,分多的话还可能帮你动动脑

阅读全文

与电子钟单片机相关的资料

热点内容
腰椎第五节压缩性骨折 浏览:89
程序员开会的句子 浏览:990
用哪个app写编程 浏览:643
android通讯录增删改查 浏览:727
车贷解压过户可以同时进行吗 浏览:917
java面向对象编程题目 浏览:876
二次元压缩包 浏览:698
stc仿真器编程器 浏览:155
服务器销售怎么做好 浏览:87
什么是com编程 浏览:848
算法工程师最新资讯 浏览:608
邮政银行卡怎么在app签约绑定 浏览:49
压缩卷一直转 浏览:976
初一编程小程序怎么做 浏览:826
bt软件文件夹名称 浏览:157
unix创建命令 浏览:622
devc是多少位的编译器 浏览:981
怎么样能快点升安卓系统 浏览:977
奇迹mu用什么服务器 浏览:605
如何让软件在多个安卓系统上运行 浏览:575