根据提供的文件信息,我们可以归纳出以下相关知识点: ### 1. 使用C51语言进行单片机编程 - **C51语言简介**:C51是一种基于ANSI C的扩展编程语言,专为8051系列微控制器设计。它在标准C的基础上增加了对特殊功能寄存器、位操作等的支持,使程序员可以更方便地控制单片机的各种资源。 - **代码示例**: - 包含头文件:`#include "at89x52.h"`,这里指明了使用的单片机型号为AT89X52。 - 数据类型定义:如`#define uchar unsigned char`和`#define uint unsigned int`,定义了无符号字符型和整型变量。 ### 2. 数码管显示控制 - **数码管编码表**:通过数组`tab[]`存储0~9以及空格的BCD码,用于数码管显示数字。 - **数码管动态显示**:通过循环显示各个位上的数字,实现数字的连续滚动显示效果。 - **具体实现**:使用`P0`端口输出数据,`P2`端口控制位选信号(例如`P2_7=0;`控制最左边的数码管亮起)。 ### 3. 时间管理与闹钟设置 - **时间格式化**:将小时、分钟、秒拆分为十位和个位,分别存储以便于数码管显示。 - **闹钟设置**:使用`set_alarm()`函数设置闹钟时间,并通过按键控制。 - **时间调整**:通过`set_time()`函数实现时间的手动调整。 ### 4. 日期管理和星期计算 - **月份天数表**:通过`table1[]`和`table2[]`两个数组来区分平年和闰年的每月天数。 - **日期计算**:根据当前的年份、月份和日期计算星期,涉及到闰年的判断和日期的加减操作。 ### 5. 按键处理 - **按键扫描**:使用`sbit`定义外部按键引脚,并通过`key_change()`函数进行按键状态的读取。 - **按键功能分配**:通过不同的按键实现时间显示模式切换、时间调整等功能。 ### 6. 定时器中断控制 - **定时器配置**:使用`TMOD`寄存器配置定时器工作模式,并通过`TH0`和`TL0`设置初值。 - **定时器中断**:通过`timer0()`中断服务函数实现每秒中断一次,更新时间计数器。 - **时间更新**:在中断服务函数中调用`jishi()`函数来更新系统时间。 ### 7. 主函数流程 - **初始化配置**:包括定时器的配置、中断的开启等。 - **主循环**:在主循环中不断调用各种子函数,如`key_change()`、`key_set()`、`set_time()`、`set_mdw()`等,实现按键检测、时间显示和调整等功能。 该文件展示了一个完整的基于C51语言的单片机程序,实现了可调电子时钟的功能,包括时间显示、闹钟设置、日期计算和按键控制等。通过对上述知识点的学习,读者可以更好地理解并掌握单片机编程的基础知识和技术细节。
//*******P0段选,P2位选*******//
#include "at89x52.h"
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar n;
uchar hh,mm,ss;
uchar nhh,nmm,nss;
uint year;
uchar day,mon,week;
uchar hhs,hhg,mms,mmg,sss,ssg;
uchar days,dayg,mons,mong;
uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;
uchar set1=1,set2=1;
sbit fm=P3^2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void jishi();
void baoshi();
void alarm();
void set_time();
void set_alarm();
void set_mdw();
void key_change();
void key_set();
void delay(int m) //延时程序,延时m*0.5ms
{
uint i;
uint j;
for (i=0;i<m;i++)
{
for(j=0;j<500;j++){}
}
}
void timer0() interrupt 1
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb1;
n++;
jishi();
}
main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb1;
TR0=1;
EA=1;
ET0=1;
剩余26页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助