实现功能:利用51单片机的定时器原理制作时钟,显示使用LCD1602,可以显示时分秒年月日和星期 ,识别平年闰年,按键可调整时间日期,整点报时。
1、定时器中断实现时钟基本原理
若系统晶振为12MHZ,定时器工作在mode1模式时,每次最多可计数至65536,花费时间约为65ms。若只计数至50000,需要时间50ms,实现1s的定时需要重复上述过程20次。如此就利用
定时器实现了一秒钟的产生。我们仅需对定时器赋初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;代码段如下
TH0 = 0x4c; //高八位赋初值 晶振位11.0592,赋初值位0x4c00
TL0 = 0x00; //低八位赋初值
i++;
if(i == 20){
i = 0; //满一秒清零
miao++; //i = 100 为一,秒标志位加 1
if(miao == 60){
miao = 0; //满一分清零
fen++;
if(fen == 60){
fen = 0; //满一时清零
shi++;
mybeeplongplus(); //整点报时
if(shi == 24){
shi = 0; //24小时制
fen = 0;
miao = 0;
2、LCD1602基本原理介绍
关于lcd1602的介绍网上资源实在太多可以参考这位博主的文章LCD1602介绍。他讲解的挺详细的,其中有关于LCD1602自定义字符的介绍与使用,我在这里推荐一款字符取模软件zimo221,百度直接可以搜索下载。
3、C语言如何利用数组存储“变量”
c语言的数组时不能够直接储存变量的,但是却可以储存变量的地址,再利用指针来间接储存变量。此处引用c语言指针数组的使用介绍。
4、protues仿真图
此处未添加蜂鸣器,需要的可以直接接在P1^5口。
5、完整程序代码
main.c文件
//设计思路 1、利用定时器中断0二十次产生1s时间变量miao增加到60变量分+1并把miao清零,shi同理
// 2、采用4个按键 长按key4进入设置模式后, key1选择调整对象 key2k3加减
//
#include"LCD1602.h"
#include<reg52.h>
void LCD_display(void);
void keykan(void);
int num[10]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39}; // lcd1602 0~9字码
uchar miao=0, fen=0, shi=0 , zhou=1 , yue=7 , nian=21 ; //进位标志位 秒 分 时 周 月 年
uchar ri=9; //进位标志位 日 不知道为啥放在上面会报错,单独定义就可以
uint i=0; //定时器计时标志位
uchar *time[]={&miao , &fen , &shi, &zhou ,&ri ,&yue , &nian}; //指针变量time存放进位标志位的地址,由于数组不能存放标量,但是却可以存放标量的地址,采用指针的方式来间接修改变量的值
//
uchar SetPlace=0; //功能选择标志
bit mod =0; //设置模式标志位
sbit key1=P3^1; //定义四个按键 key1选择需要调整的位
sbit key2=P3^0; //key2加
sbit key3=P3^2; //key3减
sbit key4=P3^3; //长按两秒钟进入或退出设置模式,前面三个按键需要进入设置模式才能使用
void main(void)
{
T0_init(); //定时器初始化
LCD_init(); //lcd1602初始化
IT1=1; //外部中断1初始化 下降沿触发
EX1=1; //启用外部中断1
LCD_disp_char(2,5,0x00); //显示自定义字符“周”
delay(50);
while(1) //死循环
{
keykan();
LCD_display(); //lcd1602显示时分秒年月日周
}
}
void keykan(void)
{
if (mod==0) //如果没有进入设置模式 调整提示区域显示字符串time
{
LCD_row(2);
LCD_DispString("TIME");
delay(50);
}
LCD_disp_char(1,14,' '); //清空第一行第15位的显示内容
delay(50);
if (mod==1) //如果进入设置模式显示一个1602字符库的一个特定字符
{
LCD_disp_char(1,14,0xef);
delay(50);
if(key1==0) //检测按键key1是否按下
{
delay(10); //消除抖动
if(key1==0)
{ //按一下功能选择位就+1,加到7就清零
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
if (SetPlace==0)