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

求c51单片机电子钟程序(c语言),第1张

#include <reg51h>

#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数据线为P26端口

sbit D_SCL = P2^7; //定义74HC164数据线为P27端口

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); //延时05秒

}

}

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

#include <timeh>

#include <stdioh>

#include <stdlibh>

#define BUF_SIZE 80

int main()

{

time_t t;

struct tm tm;

char s[BUF_SIZE];

if(time(&t) == ((time_t)-1)) return 1;

tm = localtime(&t);

if(!tm) return 1;

strftime(s, sizeof(s), ":%H:%M:%S", tm);

printf("%s\n", s);

system("pause");

return 0;

}

#include<reg52h>

#include<absacch>

#include<intrinsh>

#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) //到一秒 10ms100

{

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

}

}

两个参看啊:

第一个:

算法:将当前时间显示到屏幕,当时间发生变化时,清屏,显示新的时间(当有键盘 *** 作时退出程序)。

显示时间格式:小时:分钟:秒

/ DEV C++ Win XP/

#include <stdioh>

#include <stdlibh>

#include <conioh>

#include <timeh>

typedef struct

{

int x;

int y;

}Point;

time_t now;

struct tm pt,t1,t2;

int printpoint(Point p)

{

Point p1;

p1x=px+2; p1y=py+4;

gotoxy(p1x,p1y); printf("%c%c",2,2);

gotoxy(p1x, p1y+1); printf("%c%c",2,2);

p1y+=4;

gotoxy(p1x,p1y); printf("%c%c",2,2);

gotoxy(p1x,p1y+1); printf("%c%c",2,2);

return 0;

}

int print0(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else

printf("%c%4s%c",2," ",2);

}

return 0;

}

int print1(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

printf("%5s%c"," ",2);

}

return 0;

}

int print2(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%5s%c"," ",2);

else

printf("%c",2);

}

return 0;

}

int print3(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else

printf("%5s%c"," ",2);

}

return 0;

}

int print4(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i<6) printf("%c%4s%c",2," ",2);

else if(i==6)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else printf("%5s%c"," ",2);

}

return 0;

}

int print5(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%c",2);

else

printf("%5s%c"," ",2);

}

return 0;

}

int print6(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%c",2);

else

printf("%c%4s%c",2," ",2);

}

return 0;

}

int print7(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0) printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else printf("%5s%c"," ",2);

}

return 0;

}

int print8(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else printf("%c%4s%c",2," ",2);

}

return 0;

}

int print9(Point p)

{

int i=0;

for(;i<13;i++)

{

gotoxy(px+1, py+i);

if(i==0||i==6||i==12)

printf("%c%c%c%c%c%c",2,2,2,2,2,2);

else if(i>0&&i<6)

printf("%c%4s%c",2," ",2);

else

printf("%5s%c"," ",2);

}

return 0;

}

int clear(Point p)

{

int i=0;

for(;i<13;i++)

gotoxy(px,py+i); printf("%16s"," ");

return 0;

}

int printtime(Point p, int n)

{

int a,b;

Point pp;

a=n/10, b=n%10;

ppx=px+8, ppy=py;

switch(a)

{

case 0: print0(p); break;

case 1: print1(p); break;

case 2: print2(p); break;

case 3: print3(p); break;

case 4: print4(p); break;

case 5: print5(p); break;

}

switch(b)

{

case 0: print0(pp); break;

case 1: print1(pp); break;

case 2: print2(pp); break;

case 3: print3(pp); break;

case 4: print4(pp); break;

case 5: print5(pp); break;

case 6: print6(pp); break;

case 7: print7(pp); break;

case 8: print8(pp); break;

case 9: print9(pp); break;

}

return 0;

}

int main()

{

Point phour, pmin, psec,point1,point2;

phourx=9, pminx=32, psecx=55;

phoury=pminy=psecy=7;

point1x=25, point2x=49;

point1y=point2y=7;

clrscr();

textbackground(BLUE);

textcolor(YELLOW);

now=time(0);

pt=localtime(&now);

t1=pt;

printtime(phour, t1tm_hour);

printpoint(point1);

printtime(pmin, t1tm_min);

printpoint(point2);

printtime(psec, t1tm_sec);

while(1)

{

now=time(0);

pt=localtime(&now);

t2=pt;

if(t2tm_sec!=t1tm_sec)

{

t1=t2;

clrscr();

printtime(phour, t1tm_hour);

printpoint(point1);

printtime(pmin, t1tm_min);

printpoint(point2);

printtime(psec, t1tm_sec);

}

if(bioskey(1)==0) continue;

else exit(0);

}

return 0;

}

晕,还有一份字数限制了

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar aa,h,hh,hl,m,mh,ml,s,sh,sl,ah,am,as,

ahh,ahl,amh,aml,ash,asl,a,b,c;

sbit fm=P1^7;

sbit dian=P2^7;

sbit key1=P3^4;

sbit key2=P3^5;

sbit key3=P3^6;

sbit key4=P3^7;

sbit d1=P1^0;

uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl);//显示函数

void delay(uint z) ;//延时函数

void init() ;//初始化话函数

void chan();//调时函数

uchar alarm(uchar ah1,uchar am1);//调闹铃函数

uchar trans(uchar h,uchar m,uchar s);//显示转换函数

void time(); //时间函数

void main()

{

init(); //初始化

while(1)

{

alarm( ah, am); //调闹钟

chan(); //调时

time(); //时间

//if(a==h&&b==m)

//{

//if(s%2==0)

//fm=~fm;

//else

//fm=1;

// fm=~fm;

//}

//if(!(ah==h&&am==m))

//fm=1;

}

}

uchar trans(uchar h,uchar m,uchar s)//时间转换

{

hh=h/10;

hl=h%10;

mh=m/10;

ml=m%10;

sh=s/10;

sl=s%10;

return (hh,hl,mh,ml,sh,sl) ;

}

void time()//时间函数

{

if(aa==20)

{

aa=0;

s++;

if(s==60)

{

s=0;

m++;

if(m==60)

{

m=0;

h++;

if(h==24)

h=0;

}

}

}

trans(h,m,s);

display(hh,hl,mh,ml,sh,sl);

//return (h,m,s);

}

void chan() //调时行数

{

if(key1==0)

{

h++;

while(key1==0);

if(h==24)

h=0;

}

if(key2==0)

{

m++;

while(key2==0);

if(m==60)

{

m=0;

h++;

if(h==24)

h=0;

}

}

}

uchar alarm(uchar ah,uchar am)//调闹钟函数

{

if(key3==0)

{

while(1)

{

if(key1==0)

{

ah++;

a=ah;

while(key1==0);

if(ah==24)

ah=0;

}

if(key2==0)

{

am++;

while(key2==0);

if(am==60)

{

am=0;

ah++;

if(ah==24)

ah=0;

}

b=am;

}

trans(a,b,as);

display(hh,hl,mh,ml,sh,sl);

if(key4==0)

break;

}

}

return 0;

}

void delay(uint z) //延时函数

{

uint x,y;

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

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

}

void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl)//显示函数

{

P0=table[hh];

P2=0x01;

delay(2);

P0=0xff;

P0=table[hl];

dian=0;

P2=0x02 ;

delay(2);

P0=0xff;

P0=table[mh];

P2=0x04;

delay(2);

P0=0xff;

P0=table[ml];

dian=0;

P2=0x08;

delay(2);

P0=0xff;

P0=table[sh];

P2=0x10 ;

delay(2);

P0=0xff;

P0=table[sl];

P2=0x20;

delay(2);

P0=0xff;

}

void init() //初始化函数

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void timer0() interrupt 1 //中断函数

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

if(a==h&&b==m) //以下部分为闹铃

{ c++;

if(0<=c<=5)

fm=~fm;

if(5<c<10)

fm=1;

if(10<=c<=15)

fm=~fm;

if(c==20)

c=0;

}

if(!(ah==h&&am==m))

fm=1;

}

#include<reg52h>

sbit ksec=P3^0; //定义P30端口

sbit kmin=P3^1;

sbit khour=P3^2;

unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;

unsigned int num=0,sec=0,min=0,hour=0; //时分秒的初值

unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(unsigned int z) //延时程序,

{

unsigned int x,y;

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

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

}

void keyscan();

void display();

void main()

{TMOD=0x01; //T/CO 工作在定时器方式1

TH0=(65536-50000)/256; //预置计数初值

TL0=(65536-50000)%256;

EA=1; //CPU开中断

ET0=1; //T/CO开中断

TR0=1; //启动T/CO开始定时

while(1)

{display();

keyscan();

}

}

void time0() interrupt 1 //T/CO中断服务程序入口

{num++;

TH0=(65536-50000)/256; //计数初值重装载

TL0=(65536-50000)%256;

}

void display()

{if(num==20) //当时间计数到1秒,秒数加一

{num=0;

sec++;

if(sec==60) //秒数计数到60,分钟数加一,秒钟数返0

{sec=0;

min++;

if(min==60)

{min=0;

hour++;

if(hour==24)

{hour=0;

min=0;

sec=0;

}

}

}

}

#include<stdioh>

#include<windowsh>

int main()

{

for(int i=0;i<24;i++)

for(int j=0;j<60;j++)

for(int k=0;k<5;k++)

{

system("cls");

printf("%02d:%02d:%02d",i,j,k);

Sleep(1000);

}

}

以上就是关于求c51单片机电子钟程序(c语言)全部的内容,包括:求c51单片机电子钟程序(c语言)、c语言 数字时钟程序 要求显示格式为:HH:MM:SS、求!!!数字时钟种中的单片机的C语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9451113.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存