求单片机日历时钟C语言源程序

求单片机日历时钟C语言源程序,第1张

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0xff};

uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0};

uchar Scan_BIT;

uchar DSY_IDX;

uchar Key_State;

uchar h,m,s,s100;

void DelayMS(uchar x)

{

uchar i;

while(x--) for(i=0;i<120;i++);

}

void Increase_Hour()

{

if(++h>23)h=0;

DSY_BUFFER[0]=DSY_CODE[h/10];

DSY_BUFFER[1]=DSY_CODE[h%10];

}

void Increase_Minute()

{

if(++m>59)

{

m=0;Increase_Hour();

}

DSY_BUFFER[3]=DSY_CODE[m/10];

DSY_BUFFER[4]=DSY_CODE[m%10];

}

void Increase_Second()

{

if(++s>59)

{

s=0;Increase_Minute();

}

DSY_BUFFER[6]=DSY_CODE[s/10];

DSY_BUFFER[7]=DSY_CODE[s%10];

}

void T0_INT()interrupt 1

{

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

P3=Scan_BIT;

P0=~DSY_BUFFER[DSY_IDX];

Scan_BIT=_crol_(Scan_BIT,1);

DSY_IDX=(DSY_IDX+1)%8;

}

void T1_INT()interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(++s100==20)

{

s100=0;Increase_Second();

}

}

void main()

{

P0=P3=0xFF;

TMOD=0x11;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

TH1=0xDC;

TL1=0;

TCON=0x01;

EA=1;

ET0=1;

ET1=1;

h=12;m=s=s100=0;

DSY_BUFFER[0]=DSY_CODE[h/10];

DSY_BUFFER[1]=DSY_CODE[h%10];

DSY_BUFFER[3]=DSY_CODE[m/10];

DSY_BUFFER[4]=DSY_CODE[m%10];

DSY_BUFFER[6]=DSY_CODE[s/10];

DSY_BUFFER[7]=DSY_CODE[s%10];

Scan_BIT=0xFE;

DSY_IDX=0;

TR0=TR1=1;

Key_State=0xFF;

while(1)

{

if(P1^Key_State)

{

DelayMS(10);

if(P1^Key_State)

{

Key_State=P1;EA=0;

if((Key_State&0x01)==0)Increase_Hour();

else if((Key_State&0x02)==0)

{

m=(m+1)%60;

DSY_BUFFER[3]=DSY_CODE[m/10];

DSY_BUFFER[4]=DSY_CODE[m%10];

}

EA=1;

}

}

}

}

分给我吧,我不知道您要的是液晶时钟还是数码管的,但是我给你的是时钟,日历很好加,自己根据理解家上吧。希望对你有帮助。

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

}

}

楼上的程序运行了一下,发现数字不会动。原因是参数只能传进去,出不来。用一个结构体指针就可以了。

这种方法比较简单,对资源的占用率很大。但是电脑资源还是很充足滴。其实可以调用<windowsh>的time函数来实现功能。

#include<stdioh>

#include<stdlibh>

struct clock

{

int hour;

int minute;

int second;

};

typedef struct clock CLOCK;

void Update(CLOCK c)

{

c->second++;

if (c->second == 60)

{

c->second = 0;

c->minute++;

}

if (c->minute == 60)

{

c->minute = 0;

c->hour++;

}

if (c->hour == 24)

{

c->hour = 0;

}

}

void Display(CLOCK c)

{

printf("%2d:%2d:%2d\r", c->hour, c->minute, c->second);

}

void Delay(void)

{

long t;

while(++t<50000000);

}

void main()

{

CLOCK c,P;

P=&c;

chour = cminute = csecond = 0;

while(1)

{

Update(P);

Display(P);

Delay();

}

}

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit QB1=P1^0;

sbit QB2=P1^1; //数码管段选

sbit QB3=P1^2;

sbit QB4=P1^3;

sbit QB5=P1^4;

sbit QB6=P1^5;

sbit fm=P1^6; //蜂鸣器

sbit s1=P2^4; //s5按键,切换显示

sbit s2=P2^3; //s2按键,设置调时

sbit s3=P2^2; //s3按键,加1

sbit s4=P2^1; //s4按键,减1

sbit led1=P0^0;

sbit led2=P0^1;

sbit led3=P0^2;

uchar count;

uchar sec,minu,hour,day,week,mon;

uchar n_sec,n_minu,n_hour;

uint year;

uchar set_2=1,set_1=1;

uchar hs,hg,mis,mig,ss,sg;

uchar nhs,nhg,nms,nmg,nss=0,nsg=0;

uchar ms,mg,ds,dg,w;

uchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,

0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf}; //0~F,-,共阳

//uchar code tableyi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//0-F,-,共阴

uchar code table_d[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}; //0~9数组,带小数点

uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年

uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年

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

void timer0(); //走时中断函数

void jishi(); //计时函数

void key_change(); //切换显示按键函数

void key_set(); //设置时间按键函数

void disp(uchar,uchar,uchar,uchar,uchar,uchar); //显示函数

void zd_clock(); //整点报时函数

void nz_clock(); //闹钟函数

uchar incone(uchar); //加1函数

uchar decone(uchar); //减1函数

void set_time(); //设置时间函数

void set_clock(); //设置闹钟函数

void set_mdw(); //设置月日星期函数

void main() //主函数

{

EA=1;

ET0=1;

TR0=1;

TMOD=0x01;

TH0=0x4c; //50ms初值 晶振110592

TL0=0x00;

hour=23;minu=59;sec=49; //赋初值:11点59分0秒

n_hour=12;n_minu=56;n_sec=0; //闹钟赋初值12点1分0秒

year=2008;mon=5;day=14;week=3;//年月日星期赋初值2008年5月11日星期天;祝天下所有母亲节日快乐

while(1)

{

hs=hour/10; //时分秒HHMMSS

hg=hour%10;

mis=minu/10;

mig=minu%10;

ss=sec/10;

sg=sec%10;

ms=mon/10; //月日-星期MMDD-W

mg=mon%10;

ds=day/10;

dg=day%10;

w=week;

nhs=n_hour/10; //闹钟定时HHMMSS

nhg=n_hour%10;

nms=n_minu/10;

nmg=n_minu%10;

nss=n_sec/10;

nsg=n_sec%10;

key_change(); //s4按键扫描

key_set(); //s2按键扫描

set_time(); //设置时间

set_mdw(); //设置月日星期

set_clock(); //设置闹钟

if(set_1==1) //正常走时显示

{

disp(hs,hg,mis,mig,ss,sg);

}

if(set_1==2) //设置时间,LED1闪亮

{

disp(hs,hg,mis,mig,ss,sg);

if(sec%2==0)

{led2=1;led3=1;led1=~led1;}

// else

// {led1=1;}

}

if(set_1==3) //正常显示月日-星期

{

disp(ms,mg,ds,dg,16,w);

}

if(set_1==4) //设置月日-星期,LED2闪亮

{

disp(ms,mg,ds,dg,16,w);

if(sec%2==0)

{led1=1;led3=1;led2=~led2;}

// else

// {led2=1;}

}

if(set_1==5) //正常显示定时

{

disp(nhs,nhg,nms,nmg,nss,nsg);

}

if(set_1==6) //设置闹钟定时,LED3闪亮

{

disp(nhs,nhg,nms,nmg,nss,nsg);

if(sec%2==0)

{led1=1;led2=1;led3=~led3;}

// else

// {led3=1;}

}

zd_clock(); //整点报时

nz_clock(); //闹钟

}

}

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

{

TMOD=0x01;

TH0=0x4c; //50ms初值 晶振110592

TL0=0x00;

count++;

if(count==20)

{

count=0;

sec++;

jishi(); //调计时函数

}

}

void jishi() //计时函数

{

if(sec==60)

{

sec=0;

minu++;

if(minu==60)

{

minu=0;

hour++;

if(hour==24)

{ hour=0;

day++;

week++;

if(week==8)

{week=0;}

if(year%4==0&&year%100!=0||year%400==0) //闰年

{

if(day==table1[mon]+1)

{

day=0;

mon++;

if(mon==13)

{mon=0;year++;}

}

}

else //非闰年

{

if(day==table2[mon]+1)

{

day=0;

mon++;

if(mon==13)

{mon=0;year++;}

}

}

}

}

}

}

void key_change() //s1按键扫描

{

if(s1==0)

{

delay(200);

if(s1==0)

{

set_1++;

while(!s1);

if(set_1==7)

{set_1=1;}

}

}

}

void key_set() //s2按键扫描

{

if(s2==0)

{

delay(10);

if(s2==0)

{

set_2++;

while(!s2);

if(set_2==4)

{set_2=1;}

}

}

}

void disp(uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6) //显示函数

{

QB1=1;

QB2=0;

QB3=0;

QB4=0;

QB5=0;

QB6=0;

P3=table[a1]; //段码送P0口

delay(10); //延时一小会

QB1=0;

QB2=1;

QB3=0;

QB4=0;

QB5=0;

QB6=0;

P3=table[a2]; //第2个数码管显示,带小数点

delay(10);

QB1=0;

QB2=0;

QB3=1;

QB4=0;

QB5=0;

QB6=0;

P3=table[a3]; //第3个数码管显示

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=1;

QB5=0;

QB6=0;

P3=table[a4]; //第4个数码管显示,带小数点

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=0;

QB5=1;

QB6=0;

//第5个数码管显示

P3=table[a5];

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=0;

QB5=0;

QB6=1;

P3=table[a6]; //第6个数码管显示

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=0;

QB5=0;

QB6=0;

}

void zd_clock() //整点报时函数

{

if(minu==59&&(sec==53||sec==55||sec==57))

{

fm=0;

delay(5);

fm=1;

delay(5);

}

fm=0;

if(minu==59&&sec==59)

{

fm=0;

delay(5);

fm=1;

delay(5);

fm=0;

}

}

void nz_clock() //闹钟函数

{

if(hour==n_hour&&minu==n_minu&&sec==n_sec)

//if((sec%2==0)&&sec<30)

{

fm=0;

delay(1);

fm=1;

delay(1);

}

}

void set_time() //设置时间函数

{

if(set_1==2)

{

if(set_2==1)

{

hour=incone(hour);

if(hour==24)

{hour=0;}

// if(hour<0)

// {hour=23;}

hour=decone(hour);

}

if(set_2==2)

{

minu=incone(minu);

if(minu==60)

{minu=0;}

// if(minu<0)

// {minu=59;}

minu=decone(minu);

}

}

}

void set_mdw() //设置月日星期函数

{

if(set_1==4)

{

if(set_2==1)

{

mon=incone(mon);

if(mon==13)

{mon=1;}

mon=decone(mon);

// if(mon==0)

// {mon=12;}

}

if(set_2==2)

{

day=incone(day);

if(day==32)

{day=0;}

day=decone(day);

// if(day==0)

// {day=0;}

}

if(set_2==3)

{

week=incone(week);

if(week==8)

{week=0;}

week=decone(week);

// if(week==0)

// {week=7;}

}

}

}

void set_clock() //设置闹钟函数

{

if(set_1==6)

{

if(set_2==1)

{

n_hour=incone(n_hour);

if(n_hour==24)

{n_hour=0;}

n_hour=decone(n_hour);

if(n_hour==0)

{n_hour=0;}

}

if(set_2==2)

{

n_minu=incone(n_minu);

if(n_minu==60)

{n_minu=0;}

n_minu=decone(n_minu);

if(n_minu==0)

{n_minu=0;}

}

}

}

uchar incone(uchar n) //加1函数

{

if(s3==0)

{ delay(200);

if(s3==0)

{

n++;

while(!s3);

}

}

return(n);

}

uchar decone(uchar m) //减1函数

{

if(s4==0)

{

delay(200);

if(s4==0)

{

m--;

while(!s4);

if(m<0)

{m=0;}

}

}

return(m);

}

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

{

uint i,j;

for(i=k;i>0;i--)

for(j=80;j>0;j--);

}

#include<reg51h>

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9

unsigned char sec=0,min=0,hour=12,scanled;

unsigned char key,flashbit,mode,time;

unsigned char disdat[6];

sbit led=P1^0;

void delay(unsigned int x)

{

 unsigned int i,j;

 for(i=0;i<x;i++)

 for(j=0;j<120;j++);

}

void dischg()

{

 disdat[0]=sec%10;

 disdat[1]=sec/10;

 disdat[2]=min%10;

 disdat[3]=min/10;

 disdat[4]=hour%10;

 disdat[5]=hour/10; 

}

void flash()

{

 switch(flashbit)

 {

 case 0:break;

 case 1:

  disdat[4]=0x10;

  disdat[5]=0x10;

  delay(50);

  dischg();

  delay(80);

  break;

 case 2:

  disdat[2]=0x10;

  disdat[3]=0x10;

  delay(50);

  dischg();

  delay(80);

  break;

 case 3:

  disdat[0]=0x10;

  disdat[1]=0x10;

  delay(50);

  dischg();

  delay(80);

  break;

 default:break;

 }

}

void t0isr() interrupt 1 //秒计时

{

 TH0=0x3c;

 TL0=0xb0;

 time++;

 switch(mode)

 {

  case 0:

  if(time==20)

  {

   time=0;

   sec++;

   if(sec>59)

   {

    sec=0;

    min++;

    if(min>59)

    {

     hour++;

     if(hour>23)hour=0;

    }

   }

  }

  break;

  case 1:

  if(time==20)

  {

   time=0;

   if(sec>0)sec--;

    else if(min>0){sec=59;min--;}

     else if(hour>0){sec=59;min=59;hour--;}

      else {hour=0;min=0;sec=0;}

  }

  break;

 }

 dischg();

}

void t1isr() interrupt 3 //显示

{

 TH1=0xec;

 TL1=0x78;

 switch(scanled)

 {

  case 0:

   P2=0x01;

   P0=~ledtab[disdat[5]];

   break;

  case 1:

   P2=0x02;

   P0=~ledtab[disdat[4]];

   break;

  case 2:

   P2=0x04;

   P0=~ledtab[disdat[3]];

   break;

  case 3:

   P2=0x08;

   P0=~ledtab[disdat[2]];

   break;

  case 4:

   P2=0x10;

   P0=~ledtab[disdat[1]];

   break;

  case 5:

   P2=0x20;

   P0=~ledtab[disdat[0]];

   break;

  default:break;

 }

 scanled++;

 scanled%=6;

}

main()

{

 TMOD=0x11;

 TH0=0x3c;

 TL0=0xb0;

 TH1=0xec;

 TL1=0x78;

 EA=1;

 TR1=1;

 ET0=1;

 ET1=1;

 sec=55;

 min=59;

 hour=23;

 flashbit=0;

 scanled=0;

 time=0;

 mode=0;

 dischg();

 while(1)

 {

  flash();//闪烁

//  led=1;

  if((P3&0x0f)!=0x0f){

  key=P3&0x0f;

  while((P3&0x0f)!=0x0f);

  led=0;

  delay(10);

  key|=0xf0;

  switch(~key)

  {

  case 0x01:  //p31选择调时、分、秒

   TR0=0;

   flashbit+=1;

   if(flashbit>3){flashbit=0;TR0=1;}

   break;

  case 0x02:  //p32调数

   if(flashbit==0)break;

   if(flashbit==1)

   {

    hour++;

    if(hour>99)hour=0;

   }

   if(flashbit==2)

   {

    min++;

    if(min>59)min=0;

   }

   if(flashbit==3)

   {

    sec++;

    if(sec>59)sec=0;

   }

   break;

  case 0x04:   //选择正/倒

   TR0=0;

   mode++;

   mode&=0x01;

   if(mode==0){sec=0;min=0;hour=0;}

   dischg();

   break;

  case 0x08: //启动/暂停

   TR0=~TR0;

   break;

  default:break;

  }

  }

 }

}

以上就是关于求单片机日历时钟C语言源程序全部的内容,包括:求单片机日历时钟C语言源程序、求一个关于用C语言编写的电子时钟的程序,内容要有闹钟,可以调整时间、定义一个时钟结构体类型(包括:时,分,秒)用CLOCK结构体变量类型的全局变量编写时钟模拟显示程序,急求!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9341227.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存