资源简介
基本要求:利用定时计数器,设计一个电子时钟,可以先编写显示子程序。从左到右依次显示时分秒。有两种方法实现,一种是在中断程序中计数,产生时分秒计数,送显示缓冲区。另一种是中断程序每一秒清除一个位变量,而主程序通过监视位变量的变化来知道每秒的时间。
进而要求:
1. 加入时间调整程序,使用两个或三个按钮,调节当前的时间。类似平常使用的 电子表。可以让正在调整的位闪烁显示。
2. 可以加入一个闹钟钟设置,当所定的时间到时,产生断续的蜂鸣声。
可以加入日历的功能。
郑旅军原创,谢绝抄袭,可以借鉴
进而要求:
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
- 上一篇:改进的BP神经网络算法
- 下一篇:单片机做的6位时分秒数字钟
相关资源
- 单片机做的6位时分秒数字钟
- 音乐代码转换软件 单片机编程时用
- 单片机课程设计 篮球计分器
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- DAS1302蜂鸣 独立按键 闹钟设定 IIC存储
- 单片机与温度传感器DS18B20的程序设计
- 51单片机基于protues的几个仿真实例
- 基于52单片机的直流电压测量
- 38k单片机红外发送代码、keil
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
- 51单片机控制舵机程序
- 武汉理工大学 单片机课程设计 16*16点
- 51单片机读取温度数据存储到SD卡中并
- 【单片机】51单片机数码管显示万年历
- 浙江工业大学2005-2006学年单片机习题
- 单片机与PC机串口通讯仿真
- 毕业设计 单片机 对讲机 protues仿真
- 数据采集系统——ADC0808的应用,单片
- 直流伺服电机电路原理图(内附单片
- PIC 单片机定时器初值计算器
- 430系列单片机USBFET下载驱动
- 单片机 DS18B20 温度控制系统
- 单片机AT89s52控制GSM模块TC35i发短信,
- 单片机数字时钟包附电路图 源程序
- STC12C系列单片机函数库
- MCGS与单片机通信
- 基于proteus的单片机仿真--交通灯控制
评论
共有 条评论