51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
电子时钟加日历显示
作者:叶思奇  发布时间:2009/10/14  阅读次数:4718  字体大小: 【】 【】【
一、 任务和要求
设计制作一个电子表并且能够显示日历,用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就一定会发生变化,通过这个变化在去扫描位就可以得出是哪个按键了。
附电路图:

四、系统程序设计
系统和程序主要包括:显示程序,键盘扫描程序,自动加秒,分,时,日,月,年,
附程序:
/***************************************************************************
从左至右键盘依次为key1——key5;
key1:预制键
key2:加1
key3:减1
key4:确认
key5:时间和年月日相互切换
段码备注: 位码备注 : (从右往左 )
a...........P0.5 一位...........P1.2
b...........P0.7 二位 ..........P1.1
c...........p0.2 三位...........P1.4
d...........p0.1 四位...........P1.3
e...........p0.4 五位 ..........P1.6
f...........p0.3 六位...........P1.5
g...........p0.8 七位 ..........P1.8
按键........P3.4 八位...........P1.7
******************************************************************************/
#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;
}
/*************************定时器1的中断,秒表,并且有键盘按下的时候做相应的闪烁处理**********************************/
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();
}
}

}
}

来源:甘肃省天水师范学院
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号