资源简介

基本要求:利用定时计数器,设计一个电子时钟,可以先编写显示子程序。从左到右依次显示时分秒。有两种方法实现,一种是在中断程序中计数,产生时分秒计数,送显示缓冲区。另一种是中断程序每一秒清除一个位变量,而主程序通过监视位变量的变化来知道每秒的时间。
进而要求:
1. 加入时间调整程序,使用两个或三个按钮,调节当前的时间。类似平常使用的 电子表。可以让正在调整的位闪烁显示。
2. 可以加入一个闹钟钟设置,当所定的时间到时,产生断续的蜂鸣声。
可以加入日历的功能。
郑旅军原创,谢绝抄袭,可以借鉴

资源截图

代码片段和文件信息

#include “reg51.h“
#include “absacc.h“

//以下是键码定义
// 键码表                         //    对应键位:
// 0x700x710x720x730x740x75 // 7 8 9 A MODE RESET
// 0xb00xb10xb20xb30xb40xb5 // 4 5 6 B MOVE MON
// 0xd00xd10xd20xd30xd40xd5 // 1 2 3 C HERE LAST
// 0xe00xe10xe20xe30xe40xe5; // 0 F E D EXEC NEXT

unsigned char led[10]={0x3F0x060x5B0x4F0x660x6D0x7D0x070x7F0x6F};//从0~9的LED编码
unsigned char ledchar[3]={0x5c0x540x71};//o n f  闹钟状态指示


//以下是系统地址
#define base_ADDRESS 0x8000 //选通基地址

#define LINE_ADDRESS base_ADDRESS+1 //键盘行线地址
#define COLU_ADDRESS base_ADDRESS+2 //键盘列线地址

#define LED_SEG base_ADDRESS+4 //数码管段选地址
#define LED_BIT base_ADDRESS+2 //数码管位选地址


//以下是3种功能定义
#define CLOCK clockstr //时钟
#define ALART alartstr //闹钟
#define DATE datestr //日期


//以下是所有子函数的声明
void init(void); //系统的初始化函数
void display(void); //刷新一次数码管函数
void clockplus(void); //时间加1S的子函数

void update_clockstr(void); //更新时间显示编码
void update_alartstr(void); //更新闹钟时间的显示编码
void update_datestr(void); //更新日期显示编码

void deley(int); //延时子程序
void update_dispbuf(unsigned char *); //更新显示缓冲区

unsigned char getkeycode(void); //获取键值子程序
void keyprocess(unsigned char); //键值处理子程序

unsigned char getmonthdays(unsigned intunsigned char);//计算某月的天数子程序

//功能键功能子函数
void MODE(void); //切换3种工作模式
void MOVE(void); //设置位选择
void NEXT(void); //当前设置位+1
void LAST(void); //当前设置位-1


struct{ //时间结构体变量
unsigned char s;
unsigned char m;
unsigned char h;
}clock={000};

struct{ //闹铃时间结构体变量
unsigned char m;
unsigned char h;
}alart={00};


struct{ //日期结构体变量
unsigned int year;
unsigned char month;
unsigned char day;
}date={9611};

unsigned char dispbuf[6]; //显示缓冲区数组
unsigned char clockstr[6]; //时间显示的数码管编码数组
unsigned char alartstr[6]; //闹钟显示的数码管编码数组
unsigned char datestr[6]; //日期显示的数码管编码数组

unsigned int itime=0; //定时器0中断计数

sbit alarm=P1^0; //外接蜂鸣器的管脚


bdata bit Alart_EN=0; //闹铃功能允许位 0:禁止闹铃 1:允许闹铃

bdata bit IsBeep=0; //响铃标志位 0:未响铃 1:正在响铃

bdata bit IsSet=0; //设置模式标志位 0:正常走时 1:设置模式

#define SECOND 0 //对应数码管右边两位
#define MINUTE 1 //对应数码管中间两位
#define HOUR 2 //对应数码管左边两位
unsigned char SetSelect=0; //在设置模式IsSet=1时,正在被设置的位对应上面3个宏定义


unsigned char *Fun; //标志当前正设置的功能




//*************************函数部分************************
void main(void)
{
init();
while(1)
{
XBYTE[COLU_ADDRESS0x00]; //给键盘列线赋全零扫描码,判断是否有键按下
while((XBYTE[LINE_ADDRESS]&0x0f)==0x0f) //检测是否有键按下,无则一直进行LED的刷新显示
{
if(Alart_EN&&(clock.h==alart.h)&&(clock.m==alart.m)) 
{
IsBeep=1;
}

else

IsBeep=0;
alarm=0;
}

display();
}
keyprocess(getkeycode()); //有键按下时得到键值,并送入键值处理程序

}
}



void init(void)
{
TMOD=0x02; //定时器0设置为工作方式2基准定时250×2=500us=0.5ms
TH0=0x06; //定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲
TL0=0x06;
ET0=1;
EA=1;
TR0=1;
update_clockstr(); //初始化时钟显示编码数组
update_alartstr(); //初始化闹钟显示编码数组
update_datestr(); //初始化日期显示编码数组


Fun=CLOCK; //默认的显示摸式为时钟
update_dispbuf(Fun);//初始化显示缓冲数组
alarm=0; //蜂鸣器接线引脚复位
}

void time

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     343040  2009-06-17 12:57  郑旅军 实验六 秒表程序报告.doc

     文件      10361  2009-06-10 21:26  e_clock.c

----------- ---------  ---------- -----  ----

               353401                    2


评论

共有 条评论