导航:首页 > 操作系统 > 基于单片机的电子时钟设计

基于单片机的电子时钟设计

发布时间:2022-04-29 19:15:45

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

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

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitch=P3^2;

sbitkey=P3^5;

sbitkey1=P3^4;

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

uintu;

voidinit();

voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);

voiddelay(uintz)

{

uintx,y;

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

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

}

voidmain()

{

init();

while(1)

{

if(rq==1)

{

if(rq==1)

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

}

elseif(rq==2)

{

if(rq==2)

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

}

elseif(rq==3)

{

if(rq==3)

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

}

elseif(rq==4)

{

uchari;

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;

}

}

voidinit()

{

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开中断

}

voidtimer0()interrupt1

{

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);

}

}

elseif(x==3&rq==1)

{

//P0=0xfc;

if(key1==0)

{

nums++;

while(key1==0);

}

}

elseif(x==2&rq==2)

{

//P0=0xcf;

if(key1==0)

{

numr++;

while(key1==0);

}

}

elseif(x==3&rq==2)

{

//P0=0xf3;

if(key1==0)

{

numy++;

while(key1==0);

}

}

elseif(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;

}

voidexert0()interrupt0

{

delay(50);

rq++;

while(ch==0);

}

voidt0int()interrupt3

{

TR1=0;

bell=!bell;

TH1=timer0h;

TL1=timer0l;

TR1=1;

}

voidexert1()interrupt2

{

rq=100;

}

voiddisplay(ucharsw,ucharw,ucharq,ucharb,uchars,ucharg)

{

P2=tab[sw];

P0=tabwe[0];

delay(5);

P0=0xff;

P2=tab[w];

P0=tabwe[1];

delay(5);

P0=0xff;

P2=tab[q];

P0=tabwe[2];

delay(5);

P0=0xff;

P2=tab[b];

P0=tabwe[3];

delay(5);

P0=0xff;

P2=tab[s];

P0=tabwe[4];

delay(5);

P0=0xff;

P2=tab[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电容如图连接,你自己去写方案把,分数给那么少,就只帮你那么多了

② 基于单片机基础的指针式电子时钟设计

您好,方案一:静态显示。所谓静态显示,就是每个数码管的每一个段码都由一个单片机的I/O端口进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动。故实际应用时必须增加驱动器进行驱动,增加了硬体电路的复杂性。
方案二:动态显示。数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp "的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

③ 单片机电子时钟设计

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};//共阳极数码管数据表0--F
uchar code scan_con[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选码表右-->左
uchar data timedata[]={0x00,0x00,0x00,0x00,0x00,0x00};//计时单元数据初值,共6个
uchar data dis[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示单元数据,共8个数据
uchar data con1s=0x00,con04s=0x00,con=0x00;//秒定时用
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
//
void delay(uint t) //延时子函数
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<110;j++);
}
//
keyscan()//键盘扫描子程序
{
EA=0;
if(key0==0)
{
delay(10);
while(key0==0);
if(dis[con]==10)
{dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}
con++;
TR0=0;
ET0=0;
TR1=1;
ET1=1;
if(con>=6)
{
con=0;
TR1=0;
ET1=0;
TR0=1;
ET0=1;
}
}
//
if(con!=0)
{
if(key1==0)
{
delay(10);
while(key1==0);
timedata[con]++;
if(timedata[con]>=10)
{timedata[con]=0;}
dis[con]=timedata[con];dis[6]=0x0a;
}
}
//
if(con!=0)
{
if(key2==0)
{
delay(10);
while(key2==0);
if(timedata[con]==0)
{timedata[con]=0x09;}
else
{
timedata[con]--;
}
dis[con]=timedata[con];dis[6]=0x0a;
}
}
EA=1;
}
//
void scan()//扫描程序
{
char k;
for(k=0;k<6;k++)
{
P0=table[dis[k]];
P2=scan_con[k];
delay(1);
P2=0xff;
}
}
//

④ 用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设计的电路图

其实不用定时中断也能实现功能:
#include<reg51.h> 主函数
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定义0-9数组
unsigned int tmp;定义变量
void delay(unsigned int xms)定义延时函数
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定义子函数
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{

unsigned char z,s=00,m=00,h=00;给时钟初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小时显示

disp();
P2=tab[h%10];

disp();
P2=tab[m/10];分钟显示

disp();
P2=tab[m%10];

disp();
P2=tab[s/10];秒显示

disp();
P2=tab[s%10];

disp();

}
s++;
while(s==60)秒进一位,到60清0
{
m++;
s=00;
}
while(m==60)分钟进一位,到60清0

{
h++;
m=00;
}
while(h==24)小时进一位,到24清0
{
h=00;
}

}

}

⑤ 用51单片机编程:电子时钟(设计电子时钟,用51单片机编程)

如果有问题欢迎到我空间相关文章下留言 乐于回答~~
程序如下:
; 定义管脚
S_SET BIT P1.0 ;数字钟秒控制位
M_SET BIT P1.1 ;分钟控制位
H_SET BIT P1.2 ;小时控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
ORG 00H
SJMP MAIN
ORG 0BH
LJMP INT_T0
MAIN: MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
MOV TMOD,#01H
MOV TH0,#3CH ; 设置初值(定时50毫秒)
MOV TL0,#0B0H
SETB TR0 ;启动定时
SETB ET0
SETB EA
;*******************************************************************************
;判断是否有控制键按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖动
JB S_SET,A1

INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判断是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1

K1: INC MINUTE ;分钟值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判断是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1

K2: INC HOUR ;小时值加1
MOV A,HOUR
CJNE A,#24,J2 ;判断是否加到24小时
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;****************************************************
;等待按键抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定时器中断服务程序,对秒,分钟和小时的计数
INT_T0: MOV TH0,#3CH
MOV TL0,#0B0H
INC R0
MOV A,TCNT
CJNE A,#20,RETUNE ;计时1秒
INC SECOND
MOV R0,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
RETUNE: RETI
;******************************************
;显示控制子程序
DISPLAY: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
CLR P3.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.6
MOV A,B
CLR P3.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.5
MOV A,MINUTE ;显示分钟
MOV B,#10
DIV AB
CLR P3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.3
MOV A,B
CLR P3.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;显示分隔符
LCALL DELAY
SETB P3.2
MOV A,HOUR ;显示小时
MOV B,#10
DIV AB
CLR P3.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.0
MOV A,B
CLR P3.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DELAY: MOV R6,#5
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
这里的程序没用38译码器,若要用则显示子程序要改
如 要显示秒,程序如下

DISPLAY: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
MOV R7,#60H
ORG A,R7
MOV P0,A
LCALL DELAY
MOV A,B
MOV R7,#70H
ORL A,R7
MOV P0,A
LCALL DELAY
其他的一样这样改

⑥ 哪位大神能帮我写一个基于单片机C51的电子时钟设计报告

老师给我的
电子钟设计
1、 电路图:

2功能实现:
(1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
(3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;
3、程序框图:

6. 汇编源程序
HOURK BIT P1.2
MINITEK BIT P1.1
SECONDK BIT P1.0
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
ORG 0030H
START:
MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#12
MOV R0,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
NEXT: MOV A,#7FH
MOV P3,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0BFH
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY

MOV A,#0DFH
MOV P3,A
mov p2,#40h
call delay

mov a,#0efh
mov p3,a
MOV A,MINITE
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0F7H
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY

MOV A,#0FBH
MOV P3,A
mov p2,#40h
call delay

MOV A,#0FDH
MOV P3,A
MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0FEH
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY

WT: JB SECONDK,NK1
LCALL DELY10MS
JB SECONDK,NK1
JNB SECONDK,$
INC SECOND
MOV A,SECOND
CJNE A,#60,NK1
MOV SECOND,#00H
NK1: JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
JNB MINITEK,$
INC MINITE
MOV A,MINITE
CJNE A,#60,NK2
MOV MINITE,#00H
NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
JNB HOURK,$
INC HOUR
MOV A,HOUR
CJNE A,#24,NK3
MOV HOUR,#00
NK3:
MOV A,R0
CJNE A,#20,NEXT1
MOV R0,#0
INC SECOND
MOV A,SECOND
CJNE A,#60,NEXT1
MOV SECOND,#0
INC MINITE
MOV A,MINITE
CJNE A,#60,NEXT1
MOV MINITE,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXT1
MOV HOUR,#0
next1:JMP NEXT
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
INT_T0: CLR TR0
INC R0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
RETI
DELAY:
MOV R6,#2
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10MS:
MOV R6,#10
DD1: MOV R7,#248
DJNZ R7,$
DJNZ R6,DD1
RET
END

⑦ 基于AT89C51单片机的6位数码管显示的简易电子时钟设计

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds1302_RST =P2^0;
sbit ds1302_IO =P2^1;
sbit ds1302_SCLK=P2^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit A1=P3^0;
sbit A2=P3^1;
sbit A3=P3^2;
sbit A4=P3^3;
sbit A5=P3^4;
sbit A6=P3^5;
sbit key1=P3^6;
sbit key2=P3^7;
uchar now_time[3],wei,d[3]={0,0,0};
uchar code s[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
void delay(uint x)
{
uchar i;
for(x;x>0;x--)
for(i=0;i<100;i++);
}
void disp()
{
P1=s[now_time[2]/16];
A1=d[2];
delay(5);
A1=1;
P1=s[now_time[2]%16];
A2=d[2];
delay(5);
A2=1;
P1=s[now_time[1]/16];
A3=d[1];
delay(5);
A3=1;
P1=s[now_time[1]%16];
A4=d[1];
delay(5);
A4=1;
P1=s[now_time[0]/16];
A5=d[0];
delay(5);
A5=1;
P1=s[now_time[0]%16];
A6=d[0];
delay(5);
A6=1;
}
/***********************************************************************/
uchar read_Byte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=ds1302_IO;
ds1302_SCLK=1;
ds1302_SCLK=0;
}
return(ACC);
}

void write_Byte(uchar tdata)
{
uchar i;
ACC=tdata;
for(i=8;i>0;i--)
{
ds1302_IO=ACC0;
ds1302_SCLK=1;
ds1302_SCLK=0;
ACC=ACC>>1;
}

}
/***********************************************************************************/
void write_data_ds1302(uchar taddr,uchar tdata)
{
ds1302_RST=0;
ds1302_SCLK=0;
ds1302_RST=1;
write_Byte(taddr);
write_Byte(tdata);
ds1302_RST=0;
ds1302_SCLK=1;
}

uchar read_data_ds1302(uchar taddr)
{
uchar tdata;

ds1302_RST=0;
ds1302_SCLK=0;
ds1302_RST=1;
write_Byte(taddr);
tdata=read_Byte();
ds1302_RST=0;
ds1302_SCLK=1;
return(tdata);
}
/***********************************************************************************/

void get_ds1302()
{
uchar k;
uchar taddr = 0x81;
for (k=0; k<3; k++)
{
now_time[k] = read_data_ds1302(taddr);
taddr+=2;

}
}
/***********************************************************************************/

void init_ds1302()
{
ds1302_RST=0;
ds1302_SCLK=0;
A1=1;
A2=1;
A3=1;
A4=1;
A5=1;
A6=1;
write_data_ds1302(0x80,0x00);
}
/***********************************************************************************/
void Time();
/***********************************************************************************/
main()
{
init_ds1302();

while(1)
{
disp();
get_ds1302();
if(key1==0);
{ delay(10);
if(key1==0)
Time();
}

}
}
void timer() interrupt 3
{
uchar i;i++;
TH1=(65535-50000)/256;
TL2=(65535-50000)%256;
if(i==50)
{
d[wei]=1;
}
if(i==100)
{ i=0;
d[wei]=0;
}
}
/***********************************************************************************/

void Time()
{
uchar temp;
uint r=0,p=1;
wei=2;
TMOD=0x01;
EA=1;
ET1=1;
TH1=(65535-50000)/256;
TL2=(65535-50000)%256;
TR1=1;
for(r=0;r<50;r++)
disp();

while( key1 )
{
wei=2;
disp();
if(key2==0)
{
disp();
if(key2==0)
{
temp=now_time[2]/16*10+now_time[2]%16;
temp++;
if(temp>=24)
temp=0;
now_time[2]=temp/10*16+temp%10;
write_data_ds1302(0x84,now_time[2]);
}
while(!key2);

}

}
wei=1;
d[2]=0;
for(r=0;r<50;r++)
disp();

while(key1 )
{ disp();
if(key2==0)
{
disp();
if(key2==0)
{
temp=now_time[1]/16*10+now_time[1]%16;
temp++;
if(temp>=60)
temp=0;
now_time[1]=temp/10*16+temp%10;
write_data_ds1302(0x82,now_time[1]);
}
while(!key2);
}
}
wei=0;
d[1]=0;

for(r=0;r<50;r++)
disp();

while(key1 )
{
disp();
if(key2==0)
{
now_time[0]=0;
write_data_ds1302(0x80,now_time[0]);
}

} TR1=0;

d[0]=0;
for(r=0;r<30;r++)
disp();

}

/*********************************************************************************/

⑧ 基于STC89C52单片机的电子时钟系统的设计

就弄个AT24C02读写程序,注释详细看这个也应该用不到专门的时钟芯片,思路:开机进入主循环之前读取芯片中的数据,设置个标志位没30秒取反一次。或者但秒=0或为60时取反一次也是半分种吸和或断开,利用单片机本身的定时器,例如每个50ms中断一次20次就是一秒,bit ack; //应答标志位sbit SDA=P2^1;
sbit SCL=P2^0;/*------------------------------------------------
启动总线
------------------------------------------------*/
void Start_I2c()
{
SDA=1; //发送起始条件的数据信号
_Nop();
SCL=1;
_Nop(); //起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //发送起始信号
_Nop(); //起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/*------------------------------------------------
结束总线
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------*/
void SendByte(unsigned char c)
{
unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<<BitCnt)&0x80)SDA=1; //判断发送位
else SDA=0;
_Nop();
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop(); //保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}

_Nop();
_Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判断是否接收到应答信号
SCL=0;
_Nop();
_Nop();
} /*----------------------------------------------------------------
字节数据传送函数
函数原型: unsigned char RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
------------------------------------------------------------------*/
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;

retc=0;
SDA=1; //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //置时钟线为低,准备接收数据位
_Nop();
_Nop(); //时钟低电平周期大于4.7us
_Nop();
_Nop();
_Nop();
SCL=1; //置时钟线为高使数据线上数据有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
} /*----------------------------------------------------------------
应答子函数
原型: void Ack_I2c(void);

----------------------------------------------------------------*/
void Ack_I2c(void)
{

SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}/*----------------------------------------------------------------
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
for(i=0;i<no;i++)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(suba); //发送器件子地址
if(ack==0)return(0);

SendByte(*s); //发送数据
if(ack==0)return(0);
Stop_I2c(); //结束总线
DelayMs(1); //必须延时等待芯片内部自动处理数据完毕
s++;
suba++;
}
return(1);
}/*----------------------------------------------------------------
向无子地址器件读字节数据函数
函数原型: bit IRcvByte(unsigned char sla,ucahr *c);
功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
址sla,返回值在c.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
/*bit IRcvByte(unsigned char sla,unsigned char *c)
{
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)return(0);
*c=RcvByte(); //读取数据
NoAck_I2c(); //发送非就答位
Stop_I2c(); //结束总线
return(1);
}*/
/*----------------------------------------------------------------
向有子地址器件读取多字节数据函数
函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i; Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(suba); //发送器件子地址
if(ack==0)return(0); Start_I2c();
SendByte(sla+1);
if(ack==0)return(0); for(i=0;i<no-1;i++)
{
*s=RcvByte(); //发送数据
Ack_I2c(); //发送就答位
s++;
}
*s=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(1);
}

⑨ C51单片机电子时钟设计思路

用定时器,设置定时时间为20毫秒,50次累加=1秒,累加秒数据60次=1分,依次类推。每次中断完成累加和显示(动态,刷新频率50HZ,应该不会闪烁)

⑩ 跪求!基于单片机的数字时钟设计

#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
//#define HZ 12
sbit key0=P0^0; // 分钟调整
sbit key1=P0^1; // 小时调整

sbit P2_0=P2^7; //秒 指示灯
sbit MN_RXD=P3^6;
sbit MN_TXD=P3^7;

uchar data CLOCK[4]={0,0,0,12};//存放时钟时间(百分秒,秒,分,和时位)

//数码管显示表0-f 灭
uchar code TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};
//**********************************
//模拟串口发送一个字节数据 函数
//**********************************
void SendData(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((senddata&0x01)==0)
MN_RXD=0;
else
MN_RXD=1;
_nop_();
MN_TXD=0;
_nop_();
MN_TXD=1;
senddata=senddata>>1;
}
}

//**********************************
//显示程序函数
//**********************************
void display(void)
{
// unsigned int n;
uchar temp;
temp=CLOCK[1]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[1]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp/10; SendData(TABLE[temp]);

/*
for(n=0;n<5000;n++);

for(n=0;n<6;n++)
{
SendData(TABLE[10]);
}
*/
}

//**********************************
//按键控制函数
//**********************************
void keycan()
{
unsigned int n;
EA=0;
if(key0==0) // 分钟调整
{
for(n=0;n<10000;n++); //延时去抖动
while(key0==0);
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一时
{
CLOCK[2]=0;
}
display();

}
if(key1==0) // 小时调整
{
for(n=0;n<10000;n++); //延时去抖动
while(key1==0);
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
display();

}
EA=1;
}

//**********************************
//T0中断服务函数
//**********************************
void time0() interrupt 1 //using 1
{
TH0=0xD8; TL0=0xF0; //重置初值
// TH0=0xB1; TL0=0xE0;
//时钟处理
CLOCK[0]=CLOCK[0]+1;

}
//**********************************
//主函数
//**********************************
void main()
{
EA=1;
ET0=1;
TMOD=0x01; //T0方式1定时
TH0=0xD8; TL0=0xF0; //D8F0 定时10ms
// TH0=0xB1; TL0=0xE0; //定时 20ms
TR0=1;
for(;;)
{
if(CLOCK[0]==100) //到一秒 10ms*100
{
CLOCK[0]=0;
P2_0=~P2_0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60) //到一分
{
CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一时
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
display();
}

keycan();
}

}

阅读全文

与基于单片机的电子时钟设计相关的资料

热点内容
台湾图纸加密软件费用 浏览:40
程序员那么可爱车祸集正片 浏览:447
被点名app哪个好 浏览:942
c启动进程Linux 浏览:115
突破前期高点源码 浏览:596
c语言农历算法 浏览:325
32位单片机语言 浏览:979
安卓全服是什么意思 浏览:147
程序员那么可爱陆漓和姜逸城吻戏 浏览:802
android获取窗口大小 浏览:182
程序员为世界带来的贡献 浏览:216
程序员招聘自荐信 浏览:693
魔兽键位设置命令宏 浏览:647
程序员没有目标了 浏览:830
抢答器c程序编程 浏览:705
什么app可以自己玩 浏览:76
刨客app是什么 浏览:965
cad输入命令栏不见了 浏览:834
做故事集可以用什么app 浏览:692
qq邮箱发送压缩包 浏览:672