51单片机LCD1602 定时器时钟 实现年月日时分秒显示

实现功能:利用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)      
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值