600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C语言电子时钟程序设计 单片机C语言电子时钟加日历显示编程

C语言电子时钟程序设计 单片机C语言电子时钟加日历显示编程

时间:2019-06-04 02:11:56

相关推荐

C语言电子时钟程序设计 单片机C语言电子时钟加日历显示编程

一、 任务和要求

设计制作一个电子表并且能够显示日历,用LED数码管直接显示,并且能够通过按键调整时间、年月日,功能为按第一个键被调整的相应调整区域开始闪烁,第二个键加一,第三个减一,第四个确认,最后一个在时分秒和年月日中间相互切换。

二、方案论证

我们在这里选用了C8051F单片机,它是完全集成的混合信号系统级芯片(SoC),具有与8051兼容的高速CIP-51内核,与MCS-51指令集完全兼容,片内集成了数据采集和控制系统中常用的模拟、数字外设及其他功能部件;内置FLASH程序存储器、内部RAM,大部分器件内部还有位于外部数据存储器空间的RAM,即XRAM。C8051F单片机具有片内调试电路,通过4脚的JTAG接口可以进行非侵入式、全速的在系统调试。本文引用地址:/article/11/321849.htm

三、 系统硬件电路设计

该系统分为两个部分,主控电路和扫描电路,其中键盘扫描和LED扫描为今后节省I/O口线,我将键盘的扫描和LED的扫描共用,在扫描LED的同时也扫描键盘,这样不但方便,而且为今后的扩展留下了相当大的余地。

3.1主控制器

单片机使用c8051f310,并且使用它的开发板易于烧录,改变程序和外围电路。

3.2显示电路

显示板因为常用,是我自己画出来交给工厂做的,采用4个两位共阳数码管,从P0口输出,8位段码分别和P0相接,通过定时器实现秒钟的加一,又因为310有推挽输出,所以不必再加外部电路对数码管进行驱动,直接将它们与P0口相连就可以

3.3键盘电路

键盘是是与数码管的位选相连,通过二极管使它们具有单向性,同时将开头最终通过三极管接单片机的P3.4,只要有按键按下,P3.4就一定会发生变化,通过这个变化在去扫描位就可以得出是哪个按键了。

附电路图:

四、系统程序设计

系统和程序主要包括:显示程序,键盘扫描程序,自动加秒,分,时,日,月,年,

附程序:

#include "c8051f310.h"

#define uchar unsigned char

#define unchar unsigned char

uchar code duan[10] ={0xa0,0xbd,0x26,0x2c,0x39,0x68,0x60,0xad,0x20,0x28};

//段码表 0 1 2 3 4 5 6 7 8 9

uchar code wei[8]={0x02,0x01,0x08,0x04,0x20,0x10,0x80,0x40};//位码表

uchar code week1[7]={0xbd,0x26,0x2c,0x39,0x68,0x60,0xad} ;//星期一到星期日

uchar dataa,sec,min,hour,ymd,year,year1=9,year2=20,month=8,day=22,week=6;//初始值是7-00:00:00,日期是-08-22;

uchar n,cnt,sw1=0,sw2,sw3,cnt1,sw5;

uchar key1,key2,key3,key4=0,key5=0;

sbit P3_4=P3^4;

void scan_key(void);

void delay(ms);

void init(void)

{

IE =0x8A;

TCON =0x50;

TMOD =0x11;

IP =0x0A;

TH0 =(65536-1270)/256;

TL0 =(65536-1270)%256;

TH1 =(65536-500)/256;

TL1 =(65536-500)%256;

}

void time0(void) interrupt 1

{

TH0 =(65536-1270)/256;

TL0 =(65536-1270)%256;

dataa++;

if(sw1!=0&&key4==0) //第一个按键按下,且第四个没有按下

{

if(++cnt1==40)

{

cnt=0;

if(sw5==0&&sw1==1)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0xf3; //闪烁程序

P0 =duan[sec%10];

P1 =wei[0];

delay(8);

P1 =0x00;

P0 =duan[sec/10];

P1 =wei[1];

delay(8);

P1 =0x00;

P0 =duan[hour%10];

P1 =wei[4];

delay(8);

P1 =0x00;

P0 =duan[hour/10];

P1 =wei[5];

delay(8);

P1=0x00;

P0 =0x7f;

P1 =wei[6];

delay(8);

P1=0x00;

P0 =week1[week];

P1 =wei[7];

delay(8);

}

scan_key();

}

if(sw5==0&&sw1==2)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0xcf;

P0 =duan[sec%10];

P1 =wei[0];

delay(8);

P1 =0x00;

P0 =duan[sec/10];

P1 =wei[1];

delay(8);

P1 =0x00;

P0 =duan[min%10];

P1 =wei[2];

delay(8);

P1 =0x00;

P0 =duan[min/10];

P1 =wei[3];

delay(8);

P1 =0x00;

P0 =0x7f;

P1 =wei[6];

delay(8);

P1 =0x00;

P0 =week1[week];

P1 =wei[7];

delay(8);

}

scan_key();

}

if(sw5==0&&sw1==3)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0x7f;

P0 =duan[sec%10];

P1 =wei[0];

delay(8);

P1 =0x00;

P0 =duan[sec/10];

P1 =wei[1];

delay(8);

P1 =0x00;

P0 =duan[min%10];

P1 =wei[2];

delay(8);

P1 =0x00;

P0 =duan[min/10];

P1 =wei[3];

delay(8);

P1=0x00;

P0=duan[hour%10];

P1=wei[4];

delay(8);

P1 =0x00;

P0 =duan[hour/10];

P1 =wei[5];

delay(8);

P1 =0x00;

P0 =0x7f;

P1 =wei[6];

delay(8);

}

scan_key();

}

if(sw5==1&&sw1==9)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0x3f;

P0 =duan[month%10];

P1 =wei[2];

delay(8);

P1 =0x00;

P0 =duan[month/10];

P1 =wei[3];

delay(8);

P1 =0x00;

P0 =duan[year1%10];

P1 =wei[4];

delay(8);

P1 =0x00;

P0 =duan[year1/10];

P1 =wei[5];

delay(8);

P1 =0x00;

P0 =duan[year2%10];

P1 =wei[6];

delay(8);

P1 =0x00;

P0 =duan[year2/10];

P1 =wei[7];

delay(8);

}

scan_key();

}

if(sw5==1&&sw1==8)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0xf3;

P0 =duan[day%10];

P1 =wei[0];

delay(8);

P1 =0x00;

P0 =duan[day/10];

P1 =wei[1];

delay(8);

P1 =0x00;

P0 =duan[year1%10];

P1 =wei[4];

delay(8);

P1 =0x00;

P0 =duan[year1/10];

P1 =wei[5];

delay(8);

P1 =0x00;

P0 =duan[year2%10];

P1 =wei[6];

delay(8);

P1 =0x00;

P0 =duan[year2/10];

P1 =wei[7];

delay(8);

}

scan_key();

}

if(sw5==1&&sw1==7)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0xc3;

P0 =duan[day%10];

P1 =wei[0];

delay(8);

P1 =0x00;

P0 =duan[day/10];

P1 =wei[1];

delay(8);

P1 =0x00;

P0 =duan[month%10];

P1 =wei[2];

delay(8);

P1 =0x00;

P0 =duan[month/10];

P1 =wei[3];

delay(8);

P1 =0x00;

P0 =duan[year2%10];

P1 =wei[6];

delay(8);

P1 =0x00;

P0 =duan[year2/10];

P1 =wei[7];

delay(8);

}

scan_key();

}

if(sw5==1&&sw1==6)

{

for(n=0;n<20;n++)

{

P1 =0x00;

P1 =P1&0xc3;

P0 =duan[day%10];

P1 =wei[0];

delay(8);

P1 =0x00;

P0 =duan[day/10];

P1 =wei[1];

delay(8);

P1 =0x00;

P0 =duan[month%10];

P1 =wei[2];

delay(8);

P1 =0x00;

P0 =duan[month/10];

P1 =wei[3];

delay(8);

P1 =0x00;

P0 =duan[year1%10];

P1 =wei[4];

delay(8);

P1 =0x00;

P0 =duan[year1/10];

P1 =wei[5];

delay(8);

}

scan_key();

}

}

}

}

void time1(void) interrupt 3

{

TH1 =(65536-500)/256;

TL1 =(65536-500)%256;

if(++cnt>8) cnt=0;

if(sw5==0) //显示时分秒

{switch(cnt)

{

case 0: P1 =0x00;

P0 =duan[sec%10];

P1 =wei[cnt]; break;

case 1: P1 =0x00;

P0 =duan[sec/10];

P1 =wei[cnt];break;

case 2: P1 =0x00;

P0 =duan[min%10];

P1 =wei[cnt]; break;

case 3: P1 =0x00;

P0 =duan[min/10];

P1 =wei[cnt];

scan_key(); break;

case 4: P1 =0x00;

P0 =duan[hour%10];

P1 =wei[cnt];

scan_key();break;

case 5: P1 =0x00;

P0 =duan[hour/10];

P1 =wei[cnt];

scan_key();break;

case 6: P1 =0x00;

P0 =0x7f;

P1 =wei[cnt];

scan_key(); break;

case 7: P1 =0x00;

P0 =week1[week];

P1 =wei[cnt];

scan_key();break;

default: break;

}

}

if(sw5==1) //显示年月日

{switch(cnt)

{

case 0: P1 =0x00;

P0 =duan[day%10];

P1 =wei[cnt]; break;

case 1: P1 =0x00;

P0 =duan[day/10];

P1 =wei[cnt];break;

case 2: P1 =0x00;

P0 =duan[month%10];

P1 =wei[cnt]; break;

case 3: P1 =0x00;

P0 =duan[month/10];

P1 =wei[cnt];

scan_key(); break;

case 4: P1 =0x00;

P0 =duan[year1%10];

P1 =wei[cnt];

scan_key();break;

case 5: P1 =0x00;

P0 =duan[year1/10];

P1 =wei[cnt];

scan_key();break;

case 6: P1 =0x00;

P0 =duan[year2%10];

P1 =wei[cnt];

scan_key(); break;

case 7: P1 =0x00;

P0 =duan[year2/10];

P1 =wei[cnt];

scan_key();break;

default: break;

}

}

}

void conv(void)

{

if(dataa>=201)

{dataa=0;sec++;}

if(sec>=60)

{sec=0;min++;}

if(sw1==0&&min>=60)

{min=0;hour++;}

if(sw1==0&&hour>=24)

{

if(year%4==0)

{

if(month==2)

{

if(day==29)

{

day =1;

month++;

}

else day++;

}

else

{

if(month==4||month==6||month==9||month==11)

{

if(day==30)

{

day =1;

month++;

}

else day++;

}

else

{

if(day==31)

{

day =1;

month++;

if(month==13)

{

month =1;

year++;

}

}

else day++;

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。