#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语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)