一、 任务和要求

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

二、方案论证

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

三、 系统硬件电路设计

该系统分为两个部分,主控电路和扫描电路,其中键盘扫描和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,日期是2009-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++;

}

}

}[page]

else

{

if(month==2)

{

if(day==28)

{

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;

year1++;

if(year1==100)

{

year2++;

}

}

}

else day++;

}

}

}

hour=0;

week++;

}

if(sw1==0&&week>=7)

week=0;

}

void delay(ms)

{

uchar i, k;

while(ms--)

for(k=0;k<123;k++);

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

}

void scan_key(void)

{

if(cnt==7&&P3_4==0)

{

delay(3);

if(cnt==7&&P3_4==0)

{

key4 =0;

key1 =1; //检查是第一个键按下

}

}

if(sw5==0&&key1==1&&cnt==7&&P3_4==1) //按键松手时表示真的按下,sw5判断此时是什么显示状态,时间还是年月日

{

sw1 =1; //闪烁分针

}

if(sw5==1&&key1==1&&cnt==7&&P3_4==1) //若为年月日则闪烁第一二位

{

sw1 =9;

}

if(sw1==1&&P3_4==0&&cnt==7) //在时间状态第一个键又一次按下

{

delay(3);

if(sw1==1&&P3_4==0&&cnt==7)

{

key1 =2; //在时间状态第一个键的第二种状态

}

}

if(sw1==9&&P3_4==0&&cnt==7) //在年月日状态第一个键第二次按下

{

delay(3);

if(sw1==9&&P3_4==0&&cnt==7)

{

key1 =9; //在年月日状态第一个键的第二种状态

}

}

if(key1==2&&cnt==7&&P3_4==1) //在时间确认第一个键第二次按下

{

sw1 =2; // 并闪烁时针

}

if(key1==9&&cnt==7&&P3_4==1) //年月日状态确认第一个键第二次按下

{

sw1 =8; // 并闪烁月分

}

if(sw1==8&&P3_4==0&&cnt==7) //在年月日状态第一个键第三次按下

{

delay(3);

if(sw1==8&&P3_4==0&&cnt==7)

{

key1 =8; //在年月日状态第一个键的第三种状态

}

}

if(key1==8&&cnt==7&&P3_4==1) //年月日状态确认第一个键第三次按下

{

sw1 =7; // 并闪烁年的后两位 ///

}

if(sw1==2&&P3_4==0&&cnt==7)

{

delay(3);

if(sw1==2&&P3_4==0&&cnt==7)

{

key1 =3;

}

}

if(sw1==7&&P3_4==0&&cnt==7) //在年月日状态第一个键第四次按下

{

delay(3);

if(sw1==7&&P3_4==0&&cnt==7)

{

key1 =7; //在年月日状态第一个键的第四种状态

}

}

if(key1==7&&cnt==7&&P3_4==1) //年月日状态确认第一个键第四次按下

{

sw1 =6; // 并闪烁年的前两位 ///

}

if(sw1==2&&P3_4==0&&cnt==7)

{

delay(3);

if(sw1==2&&P3_4==0&&cnt==7)

{

key1 =3;

}

}

if(key1==3&&cnt==7&&P3_4==1)

{

sw1 =3; // 并闪烁星期

}

if(sw5==0&&P3_4==0&&cnt==6) //检查第二个键是否按下

{

delay(3);

if(sw5==0&&P3_4==0&&cnt==6)

{

key2 =1;

}

}

if(key2==1&&cnt==6&&P3_4==1)

{

key2 =0;

sw2 =1; //在时间状态确认第二个键按下

if(sw2==1&&sw1==1) //和sw1的值对比,加分

{

min++;

if(min>=60)

min =0;

}

if(sw2==1&&sw1==2) //和sw1的值对比,加时

{

hour++;

if(hour>=24)

hour =0;

}

if(sw2==1&&sw1==3)

{

week++;

if(week>6)

week =0;

}

}

if(sw5==1&&P3_4==0&&cnt==6) //在年月日检查第二个键是否按下

{

delay(3);

if(sw5==1&&P3_4==0&&cnt==6)

{

key2 =7;

}

}

if(key2==7&&cnt==6&&P3_4==1)

{

key2 =0;

sw2 =1; //确认第二个键按下

if(sw2==1&&sw1==9) //和sw1的值对比,加day

{

day++;

if(day>31)

day =0;

}

if(sw2==1&&sw1==8) //和sw1的值对比,加month

{

month++;

if(month>12)

month =0;

}

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

{

year1++;

if(year1>100)

year1 =0;

}

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

{

year2++;

if(year2>100)

year2 =20;

}

} //检查时间状态第三个键是否按下

if(sw5==0&&P3_4==0&&cnt==5) //检查第三个键是否按下

{

delay(3);

if(sw5==0&&P3_4==0&&cnt==5)

{

key3 =1;

}

}

if(key3==1&&cnt==5&&P3_4==1)

{

key3 =0;

sw3 =1;

if(sw3==1&&sw1==1)

{

if(min<=0)

min =60;

min--; //分针减

}

if(sw3==1&&sw1==2)

{

if(hour<=0)

hour =24;

hour--; //时针减

}

if(sw3==1&&sw1==3)

{

if(week<=0)

week =7;

week--;

}

}

if(sw5==1&&P3_4==0&&cnt==5) //在年月日检查第三个键是否按下

{

delay(3);

if(sw5==1&&P3_4==0&&cnt==5)

{

key3 =7;

}

}

if(key3==7&&cnt==5&&P3_4==1)

{

key3 =0;

sw3 =7;

if(sw3==7&&sw1==9)

{

if(day<=0)

day =32;

day--; //day减

}

if(sw3==7&&sw1==8)

{

if(month<=0)

month =13;

month--; //month减

}

if(sw3==7&&sw1==7)

{

if(year1<=0)

year1 =100; //year减

year1--;

}

if(sw3==7&&sw1==6)

{

if(year2<=20)

year2 =100; //year减

year2--;

}

}

if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0)

{

delay(3);

if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0)

{

sw1=0;sec=0;key4=1;key1=0;

}

}

if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1)

{

delay(3);

if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1)

{

sw1=0;key4=1;key1=0;

}

}

if(P3_4==0&&cnt==3)

{

delay(3);

if(P3_4==0&&cnt==3)

{

key5 =1;

}

}

if(key5==1&&P3_4==1&&cnt==3)

{

sw5 =1;

}

if(P3_4==0&&sw5==1&&cnt==3)

{

delay(3);

if(P3_4==0&&sw5==1&&cnt==3)

{

key5 =0;

}

}

if(P3_4==1&&key5==0&&cnt==3)

{

sw5 =0;

}

}

void main(void)

{

PCA0MD =0 ;

XBR1 =0x40 ;

P0MDOUT =0xFF ;

P1MDOUT =0xFF ;

init();

while(1)

{

conv();

year=year1+year2*100;

}

}

五、调试及性能分析

5.1 硬件调试:主要检查电路的焊接,有无虚焊,漏焊,然后检查电路与单片机的联线,为了方便自己做了一根数据线,然后用万用表测试,全部导通后进行通电检测,上电后排查电路板的各点电平是否正常,测试完毕后进行软件调试。

5.2 软件调试:主要以以编程序为主,并进行单片机输出口线高低电平的检验。本程序采用C语言编写,用Keil C51编译器编程调试,本程序的难点之一在于让它闪烁,也就是再其它灯不变的情况下闪烁需要调整的部分。

经过测试,任务以及要求全部达到,初始化时,时间是1-00:00:00,切换后是20096.08.15,由于时间关系没能经过长时间的验证性测试,短期测试发现每一个小时快一秒钟,只进行了粗调。

时钟电路程序设计c语言,单片机C语言电子时钟加日历显示编程相关推荐

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

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

  2. 单片机c语言编程 时钟加日历转换,单片机C语言电子时钟加日历显示编程

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

  3. keil c语言 1602时钟代码,基于单片机的LCD1602电子时钟设计.doc

    基于单片机的LCD1602电子时钟设计 设计任务和目的 1.1.设计任务 (1):用单片机设计基于LCD1602的电子时钟,显示时间和日期: (2):误差精度控制在1s/天: (3):具有时间和日期的 ...

  4. 基于51单片机的数字电子时钟

    基于51单片机的数字电子时钟 单片机课程设计要求使用51单片机完成一个电子时钟,要求满足基本功能的同时增添丰富的功能参考了很多大佬的方案代码才勉强完成,工程文件下载点击此链接欢迎交流.如遇下载问题可以 ...

  5. livechart 只显示 y 值_基于Python语言的SEGY格式地震数据读取与显示编程

    敬请关注<地学新视野> 摘要:本文简单介绍了SEG-Y地震数据文件格式,以及如何用Python语言编写读写SEG-Y格式的地震数据并绘制地震剖面,其中用到了Segyio和matplotli ...

  6. 基于51单片机的简易电子计算器——有温度显示和万年历等额外功能

    基于51单片机的简易电子计算器--有温度显示和万年历等额外功能 设计实际所实现的功能 模式一可显示日期.时钟.温度,模式二可进行计算器的计算,且显示日期温度模式和计算器模式可随意切换,模式三可以滚动显 ...

  7. 时钟电路程序设计c语言,STC89C52单片机简易时钟程序电路设计(附源代码和电路图)...

    51(STC89C52)单片机简易时钟程序电路设计(附源代码和电路图) 上一篇做了一个温湿度采集电路,觉得这东西玩起来还是挺有意思,然后就想做一个时钟,于是就有了下文 1.成品图 51hei图片_20 ...

  8. c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...

    基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...

  9. c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式

    原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...

最新文章

  1. Codeforces 997D Cycles in Product (点分治、DP计数)
  2. FFMPEG结构体分析:AVCodecContext(转)
  3. Java EE 7批处理和魔兽世界–第2部分
  4. 云端设计平台Coohom在生产环境中使用istio的经验与实践
  5. 设计干货素材模板|常见的UI设计手法
  6. CentOS配置主机名和主机映射
  7. HDU2090 算菜价【水题】
  8. 【深度优先搜索】计蒜客:最大蛋糕(最大连通块)
  9. android beam 第三方 aar,NFC通讯之Beam方式
  10. django ForeignKey的swappable属性
  11. 安装SQL2000时弹出“以前的某个程序安装已在安装计算机上创建挂起的文件操作、、、”...
  12. Mysql数据库优化方案
  13. 如何让自己电脑的鼠标指针变的更炫酷来看看这个吧
  14. ORACLE通过身份证号计算年龄
  15. 贝叶斯统计与变分推断
  16. 微信小程序调试webview_微信小程序内嵌webview相关知识点整理
  17. 登录注册 图片验证码生成
  18. nlp-with-transformers实战-01_transformers简介
  19. jquery 动态添加标签而且指定样式
  20. 硬盘容量单位有哪些?

热门文章

  1. 自学Python-tkinter-飞机大战(简易版)
  2. 在word中打开visol图,导致visol图的比例发生变化,怎么办?
  3. 简单典型二阶系统_城市轨道交通弱电系统集中UPS容量的计算
  4. 安卓应用/APP商店上架所需资质发布步骤
  5. 【拜小白opencv】14-只去除RGB的某一颜色通道
  6. `英语` 2022/8/8
  7. 结构方程模型(SEM)的假设(2)
  8. 错落年华,轮转一生。不知所却,望断天涯
  9. 人工智能行业背景与相关统计数字(index)
  10. 618来临,我们有超10000名“机器人雇员”在全国上岗!