基于51单片机的多功能数字时钟(仿真)

        基于51单片机的多功能数字时钟设计利用AT89C51为主控,LCD12864为显示器件,使用DS1302作为时间单元,DHT11温湿度传感器获取环境温湿度,蜂鸣器和LED作为提示器件,使用按键进行模式选择等一系列功能。

一、硬件设计

1、LCD12864

        本次设计有中文显示的需求,所以普通的LCD1602、LCD1604已经无法再满足需求,目前在仿真中还剩下两个方案,一个是利用OLED,一个是LCD12864,综合考虑51单片机的性能等各方面因素,本次设计使用LCD12864实现中文显示。在Proteus中,LCD12864叫做 AMPIRE128X64。电路如下:

2、DHT11

        DHT11是一款经典的温湿度传感器,它利用单总线节省了IO口,在实际使用中大大节省了硬件资源。Proteus中提供有DHT11,如下图:

3、DS1302

        DS1302为本次系统的时间单元器件,DS1302由于在仿真系统中,如果不设置其时间,这个DS1302的时间是会和电脑时间同步的,显然会非常方便本次项目的使用,DS1302使用 SPI 的通信协议,在实际使用中我们利用SPI读写寄存器,便可以完成时间的获取。

4、串口终端 

        由于Proteus并没有语音模块,所以这次决定使用串口终端打印中文来表示语音播报。

二、软件设计

1、硬件驱动设计

        (1)DS1302使用 SPI 协议进行驱动,通过对年、月、日、时、分、秒的寄存器的读寄存器进行读操作,便可以方便的获得其值,参考代码如下:

DS1302.c

#include <REGX52.H>
sbit DS1302_SCLK=P1^0;
sbit DS1302_IO=P1^1;
sbit DS1302_CE=P1^2;
//Write:
#define DS1302_SECOND  0x80
#define DS1302_MINUTE  0x82
#define DS1302_HOUR    0x84
#define DS1302_DATA    0x86
#define DS1302_MONTH   0x88
#define DS1302_DAY     0x8a
#define DS1302_YEAR    0x8c
#define DS1302_WP      0x8e

char DS1302_Time[]={22,1,24,20,01,40,1}; 
void DS1302_Init()
{
	DS1302_CE=0;
	DS1302_SCLK=0;
}	
void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=Data&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_CE=0;	
}	
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Data=0x00;
	Command|=0x01;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(i=0;i<8;i++)
	{
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO){Data|=(0x01<<i);}
	 }
	DS1302_IO=0;
	DS1302_CE=0;

	return Data;
}	
void DS1302_SetTime()
{
	DS1302_WriteByte(DS1302_WP,0x00);
	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	DS1302_WriteByte(DS1302_DATA,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	DS1302_WriteByte(DS1302_WP,0x80);
}	

void DS1302_ReadTime()
{
	unsigned char temp;
	temp=DS1302_ReadByte(DS1302_YEAR);
	DS1302_Time[0]=temp/16*10+temp%16;
	temp=DS1302_ReadByte(DS1302_MONTH);
	DS1302_Time[1]=temp/16*10+temp%16;
	temp=DS1302_ReadByte(DS1302_DATA);
	DS1302_Time[2]=temp/16*10+temp%16;
	temp=DS1302_ReadByte(DS1302_HOUR);
	DS1302_Time[3]=temp/16*10+temp%16;
	temp=DS1302_ReadByte(DS1302_MINUTE);
	DS1302_Time[4]=temp/16*10+temp%16;
	temp=DS1302_ReadByte(DS1302_SECOND);
	DS1302_Time[5]=temp/16*10+temp%16;
	temp=DS1302_ReadByte(DS1302_DAY);
	DS1302_Time[6]=temp/16*10+temp%16;
}	

DS1302.h

#ifndef __DS1302_H__
#define __DS1302_H__

extern char DS1302_Time[];
void DS1302_Init();
void DS1302_WriteByte(unsigned char Command,Data);
unsigned char DS1302_ReadByte(unsigned char Command);
void DS1302_ReadTime();
void DS1302_SetTime();

#endif

        LCD12864有两个CS引脚,分别控制着显示左边、右边两个部分,所以在程序运行时候,也可以看到,LCD1602会左右依次向下显示,直到显示完最后一行。LCD12864代码如下:

LCD12864.c

#include "12864.h"
#include "ziku.h"

void Delay_ms(unsigned int xms)  //@11.0592MHz
{
  unsigned int i,j;
	  for(i=xms;i>0;i--)    
		for(j=112;j>0;j--);  
}

static void LCD12864_Write(bit COM_Data,unsigned char  dat)  //12864操作函数 
{
  LCD12864_RS=COM_Data;   //指令 0 数据 1
	LCDData_Pro=dat;        //数据传输至P0扣
	LCD12864_EN=1;          //置1
	_nop_();
	LCD12864_EN=0;          //置0   产生下降沿
}

void LCD12864_Init(void)   //12864初始化
{
	Delay_ms(300);   //等待系统上电稳定
/******************************************************************************/
  LCD12864_EN=1;                       
  LCD12864_RS=1;                       
	LCD12864_CS1=1;  //仿真 0 实物 1   
	LCD12864_CS2=1;  //仿真 0 实物 1   
	Delay_ms(10);
/******************************************************************************/
	LCD12864_Write(LCD12864_COM,0x3f);   //开显示
	/*
	LCD12864_Write(LCD12864_COM,0xc0);   //这段不写也可以正常显示
	LCD12864_Write(LCD12864_COM,0xb8);
	LCD12864_Write(LCD12864_COM,0x40);
	*/
	LCD12864_Write(LCD12864_COM,0x30);   //打开基本指令
	LCD_Clear();                         //清屏
}
/*****************************************************************************
函数功能:清平函数
入口参数:空
说    明:清空整个屏幕数据
版    本:V1.0
时    间:2020年5月9日
*****************************************************************************/
void LCD_Clear(void)
{
	unsigned char  i,j; 
#if LCD_Mode
  LCD12864_CS1=1;   //选中左半屏
	LCD12864_CS2=1;   //选中右半屏
#else 
  LCD12864_CS1=0;   //选中左半屏
	LCD12864_CS2=0;   //选中右半屏
#endif
	LCD12864_Write(LCD12864_COM,0xc0);  //行
  for(i=0;i<8;i++)
	{
	  LCD12864_Write(LCD12864_COM,0xb8+i); //页
		for(j=0;j<64;j++)
		{
		  LCD12864_Write(LCD12864_COM,0x40+j); //列
			LCD12864_Write(LCD12864_DATA,0x00);
			Delay_ms(5);    //方便看清屏效果
		}
	}
}
/*****************************************************************************
函数功能:地址写入函数
入口参数:X,Y
说    明:根据地址自动切换左、右屏
版    本:V1.0
时    间:2020年5月9日
*****************************************************************************/
void LCD12864_X_Y(unsigned char X,unsigned char Y)
{
  Y=Y&0x7f;   //限定范围,列不能超过127     
	X=X&0x07;	  //限定范围,行不能超过7
	if(Y<64)
	{
#if LCD_Mode
		 LCD12864_CS1=1;   //选中左半屏
		 LCD12864_CS2=0;	 //关闭右半屏
#else
		 LCD12864_CS1=0;   //选中左半屏
		 LCD12864_CS2=1;	 //关闭右半屏
#endif
		 LCD12864_Write(LCD12864_COM,0x40+Y);  //选择列基地址+Y 一共64行
		 if(Y==63) Y=64;
	}
	else
	{
#if LCD_Mode
	  LCD12864_CS1=0;   //关闭左半屏
		LCD12864_CS2=1;	  //选中右半屏
#else
    LCD12864_CS1=1;   //关闭左半屏
		LCD12864_CS2=0;	  //选中右半屏
#endif
		Y&=0x3f;
	  LCD12864_Write(LCD12864_COM,0x40+Y);  //选择列基地址+Y   一共64列
	}
	  LCD12864_Write(LCD12864_COM,0xb8+X);  //选择页基地址+X   一共7页  
}
/*****************************************************************************
函数功能:6*16数值写入函数
入口参数:X,Y,num,*dat
说    明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
版    本:V1.5
修改时间:2022年7月10日
新    增:可实现跨左右屏
*****************************************************************************/
void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
{
	unsigned char  i; 
  for(i=0;i<6;i++)                
	{
	  LCD12864_X_Y(X,Y+i);                          //每写一个字节 更新一次Y 防止不能出现跨屏
		LCD12864_Write(LCD12864_DATA,dat[num*12+i]);  //写上半字 共写6个字节
	} 
  for(i=0;i<6;i++) 
	{
	  LCD12864_X_Y(X+1,Y+i);                         //同上
		LCD12864_Write(LCD12864_DATA,dat[num*12+6+i]); //写下半字 共写6个字节
	}
}
/*****************************************************************************
函数功能:变量显示函数
入口参数:X,Y,num,len
说    明:在第X行的第Y个位置显示len个num数值
版    本:V1.2
修改时间:2022年7月10日
新    增:自动计算变量长度 最大计数99999
*****************************************************************************/
void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num)
{
	unsigned char i; 
  unsigned char Len;	
  unsigned char Dis[5];
	unsigned char Buf[5];
	
	sprintf(Buf,"%d",num);   //将数值转换成字符串
	Len=strlen(Buf);         //计算字符串长度
	
  if(Len>4)Dis[Len-5]=num/10000     ;    //若数据更大 按照规律写即可
  if(Len>3)Dis[Len-4]=num%10000/1000;
  if(Len>2)Dis[Len-3]=num%1000/100  ;
  if(Len>1)Dis[Len-2]=num%100/10    ;
  if(Len>0)Dis[Len-1]=num%10        ;
	
  for(i=0;i<Len;i++) LCD12864_Write_Number(X,Y+(i*6),Dis[i],Num);
}

/*****************************************************************************
函数功能:12*16汉字写入函数
入口参数:X,Y,num,*dat
说    明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
版    本:V1.5
修改时间:2022年7月10日
新    增:左右跨屏
*****************************************************************************/
void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
{
	unsigned char  i;
  for(i=0;i<12;i++) 
	{
		LCD12864_X_Y(X,Y+i);                         //跨屏重要函数  勿删除
		LCD12864_Write(LCD12864_DATA,dat[num*24+i]); //写上半字 共写12个字节
	}
  for(i=0;i<12;i++) 
	{
	  LCD12864_X_Y(X+1,Y+i);                          //同上
		LCD12864_Write(LCD12864_DATA,dat[num*24+12+i]); //写下半字 共写12个字节
	}
}
/*****************************************************************************
函数功能:英文字母显示函数
入口参数:X,Y,*dat
说    明:X_横坐标 Y_纵坐标 *dat_需要显示的英文字母
版    本:V1.0
修改时间:2022年7月10日
注    明:带字库索引功能
*****************************************************************************/
void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat)
{
	unsigned char i,j;
	unsigned char Len;
	
	Len=strlen(dat);        //获取数据长度
		
  for(j=0;j<Len;j++)      
	{
	  for(i=0; ;i++)  if(English_Buf[i]==*dat) {dat++; break;}  //查找字库索引列表
	  LCD12864_Write_Number(X,Y+(j*6),i,English);               //写数据
	}
}
///*****************************************************************************
//函数功能:汉字显示函数
//入口参数:X,Y,*dat
//说    明:X_横坐标 Y_纵坐标 *dat_需要显示的汉字
//版    本:V1.0
//修改时间:2022年7月10日
//注    明:带字库索引功能

//注意:存在Bug 暂未修复
//*****************************************************************************/
//void LCD12864_Write_String(unsigned char X,unsigned char Y,unsigned char *dat)
//{
//	unsigned char i,j;
//	unsigned char Len;
//	
//	Len=(strlen(dat))/2;  //1个汉字2个字节  所以要除以2
//	
//   for(j=0;j<Len;j++) 
//	{
//	  for(i=0; ;i++)  if(Chinese_Buf[i]==*dat) {dat++; break;}   //存在Bug不能显示第4个汉字
//	  LCD12864_Write_Chinese(X,Y+(j*12),i,Chinese);
//	}
//}

LCD12864.h

#ifndef  __12864_H__
#define  __12864_H__

#include <REGX52.H>
#include <INTRINS.H>
#include <STRING.H>
#include <STDIO.H>

#define LCD_Mode 0   //0 仿真模式  1 实物模式

#define LCDData_Pro  P0   //数据端口

#define LCD12864_COM  0   //指令
#define LCD12864_DATA 1   //数据

/***************************字库名称***********************************/
extern unsigned char code Num[];  
extern unsigned char code English[];
extern unsigned char code Chinese[];
extern unsigned char code BMP_Dat[];
/*******************************************************************/

sbit LCD12864_RW =P2^3;   //写数据 0 读数据 1   只写数据可以不用这个端口
sbit LCD12864_EN =P2^4;   //下降沿时操作有效
sbit LCD12864_RS =P2^5;   //指令 0 数据 1
sbit LCD12864_CS2=P2^6;   //右半屏
sbit LCD12864_CS1=P2^7;   //左半屏

extern void Delay_ms(unsigned int xms);
extern void LCD12864_Init(void);
extern void LCD_Clear(void);
extern void LCD12864_X_Y(unsigned char X,unsigned char Y);
extern void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num);
extern void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat);
extern void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat);
extern void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat);
//extern void LCD12864_Write_String(unsigned char X,unsigned char Y,unsigned char *dat);
#endif

        DHT11使用单总线协议,读出的数据大致有五位,分别是湿度高八位、湿度低八位、温度高八位、温度低八位、校验位,DHT11使用和校验的方式,即前四个字节之后等于第五个字节,若成立,数据正确,若不成立,则数据不正确。

DHT11.c

#include "DHT11.h"

sbit Data=P3^7; //数据线
uchar rec_dat[9]; //储存数据
void DHT11_delay_us(uchar n)
{
    while(--n);
}
void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

/*
主机(单片机)发送起始信号:
1.主机先拉高data。
2.拉低data延迟18ms。
3.拉高data并延迟等待(通过此操作将单片机引脚设置为输入)。
*/
void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(25);   //拉低延时18ms以上
   Data=1;
   DHT11_delay_us(30);   //拉高 延时 20~40us,取中间值 30us
}

/*------------------------------------------------
              接收八位二进制
------------------------------------------------*/
uchar DHT11_rec_byte()      //接收一个字节
{
  unsigned char i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {          
      while(Data);   //等待进入低电平
      while(!Data);   //等待50us低电平过去
      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
      dat<<=1;//移位(低位补零)使正确接收8位数据,数据为0时直接移位
      if(Data==1)    //数据为1时,使dat加1来接收数据1
        dat+=1;
      while(Data);  //等待数据线拉低    
   }  
    return dat;
}


/*------------------------------------------------
              接收40bit数据(具体的温湿度)
1.主机先把data线拉高(io设置为输入)。
2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
  从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
3.继续重复上述1,2步骤累计40次。
------------------------------------------------*/
uchar T_H;
uchar tem, hum;
void DHT11_receive()      //接收40位的数据
{
    uchar R_H,R_L,T_L,RH,RL,TH,TL,revise; 
    DHT11_start();//发送起始信号:
    if(Data==0)
    {
        while(Data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时80us
			
        R_H=DHT11_rec_byte();    //接收湿度高八位  
        R_L=DHT11_rec_byte();    //接收湿度低八位  
        T_H=DHT11_rec_byte();    //接收温度高八位  
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位

        DHT11_delay_us(25);    //结束

        if((R_H+R_L+T_H+T_L)==revise)      //最后一字节为校验位,校验是否正确
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        } 
		
		tem	= TH;
		hum = RH;
        /*数据处理,转换为字符,方便显示*/
			  //湿度
		rec_dat[0]=(RH/10);
        rec_dat[1]=(RH%10);
				rec_dat[2]=' ';
				rec_dat[3]=' ';
				
				//温度
        rec_dat[4]=(TH/10);
        rec_dat[5]=(TH%10); 
		    rec_dat[6]=' ';
			
    }
}

DHT11.h

#ifndef __DHT11_H__
#define __DHT11_H__

#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
extern uchar rec_dat[9]; //储存数据
extern uchar tem, hum;
void DHT11_delay_us(uchar n);
void DHT11_delay_ms(uint z);
void DHT11_start();
uchar DHT11_rec_byte();
void DHT11_receive();

#endif

2、设计思路

        本次设计采用模式隔离的方式进行运行模式、显示温湿度、调整模式等的隔离,通过按键进行调节,按下模式选择按键,三个模式循环进行切换,实现我们需要的功能。代码如下:

#include <REGX52.H>
#include <stdio.H>
#include "12864.H"
#include "delay.h" 
#include "DS1302.h" 
#include "KEY.h"
#include "DHT11.h"
#include "UART.h"

sbit led = P1^6;
sbit buz = P1^7;

typedef unsigned int u16;	//对数据类型进行声明定义
typedef unsigned char u8;


char str[20];
u8 mode=0;
u8 keyNum=0;

char Hour_set1=20, Min_set1=20;
char Hour_set2=9, Min_set2=30;
char Hour_set3=10, Min_set3=30;

u8 n1=0,n2=0,n3=0;
u8 set_cnt=0;
u8 set_pos=0;

char Mon_set=5, Date_set=17;

u8 cnt_flag=0;
u16 cnt=0;

u8 n_flag=0;
u8 tim_flag=0;
u8 temp=0;

void main()
{
	led=1;
	buz=0;
	//DS1302初始化
	DS1302_Init();
	//LCD初始化 
	LCD12864_Init(); 
	//串口初始化
	UART_Init();
	while(1)
    {  	
		//获取实时时间
		DS1302_ReadTime();
		keyNum = KEY();	
		//按键1翻页
		if(keyNum == 1){
			mode++;
			mode%=3;
			LCD_Clear();
			set_pos=0;
		}
		
		//12/24小时切换
		if(keyNum == 7){
			tim_flag = !tim_flag;
		}
		
		//闹钟提醒
		if(n1 == 0){
			if(Hour_set1 == DS1302_Time[3] && Min_set1 == DS1302_Time[4] && DS1302_Time[5] == 0){
				n_flag=1;
			}
		}
		
		if(n2 == 0){
			if(Hour_set2 == DS1302_Time[3] && Min_set2 == DS1302_Time[4] && DS1302_Time[5] == 0){
				n_flag=1;
			}			
		}
		
		if(n3 == 0){
			if(Hour_set3 == DS1302_Time[3] && Min_set3 == DS1302_Time[4] && DS1302_Time[5] == 0){
				n_flag=1;
			}			
		}
			
		
		//整点报时
		if(DS1302_Time[4] == 0 && DS1302_Time[5] == 0){
			cnt_flag=1;				
		}
		
		
		//开启闹钟,直到响应按键按下
		if(n_flag == 1){
			led=0;
			buz=1;	
			if(keyNum == 6){
				n_flag=0;
				cnt_flag=0;
				led=1;
				buz=0;
			}
		}
		
		else if(n_flag==0){
			//延时关闭
			if(cnt_flag == 1){
				led=0;
				buz=1;
				if(++cnt >= 20){
					cnt=0;
					cnt_flag=0;
				}				
			}
			else{
				led=1;
				buz=0;			
			}			
		}
		
		//模式0
		if(mode == 0){
			
			//生日提醒
			if(DS1302_Time[1] == Mon_set && DS1302_Time[2] == Date_set){
				LCD12864_Write_Chinese(6,0,17,Chinese);
				LCD12864_Write_Chinese(6,16,2,Chinese);
				LCD12864_Write_Chinese(6,32,21,Chinese);
				LCD12864_Write_Chinese(6,48,22,Chinese);
				if((DS1302_Time[3] == 6 || DS1302_Time[3] == 12 || DS1302_Time[3] == 18) && (DS1302_Time[4] == 0 && DS1302_Time[5] == 0)){
					Serial_SendString("生日快乐\r\n");
				}
				
			}
			else{
				LCD12864_Write_English(6,0,"            ");
			}
			
			//设置位置切换
			if(keyNum==3){
				set_pos++;
				set_pos%=2;
			}
			
			//设置生日日期
			if(set_pos == 0){
				if(keyNum==4){
					Date_set--;
					if(Date_set<0)Date_set=0;
				}
				if(keyNum==5){
					Date_set++;			
				}					
			}
			else if(set_pos == 1){
				if(keyNum==4){
					Mon_set--;
					if(Mon_set<0)Mon_set=0;
				}
				if(keyNum==5){
					Mon_set++;
					if(Mon_set>12)Mon_set=12;
				}					
			}
			
			//月份设置逻辑
			if( Mon_set==1||Mon_set==3||Mon_set==5||Mon_set==7
			||Mon_set==8||Mon_set==10||Mon_set==12)
			{
				if(Date_set>31){Date_set=31;}
			}
			else if(Mon_set==4||Mon_set==6||Mon_set==9||Mon_set==11)
			{
				if(Date_set>30){Date_set=30;}
			}
			else if(Mon_set==2)
			{
				if(Date_set%4==0)
				{
					if(Date_set>29){Date_set=29;}
				}
				else
				{
					if(Date_set>28){Date_set=28;}
				}		
			}
			
			//显示日期			
			if(DS1302_Time[0]/10>=1)LCD12864_Num(0,0,DS1302_Time[0]);	
			else{
				LCD12864_Num(0,0,DS1302_Time[0]);
				LCD12864_Write_English(0,6," ");
			}			 
			LCD12864_Write_Chinese(0,16,0,Chinese);
			
			if(DS1302_Time[1]/10>=1)LCD12864_Num(0,32,DS1302_Time[1]);	
			else{
				LCD12864_Num(0,32,DS1302_Time[1]);
				LCD12864_Write_English(0,38," ");
			}			 
			LCD12864_Write_Chinese(0,48,1,Chinese);
			if(DS1302_Time[2]/10>=1)LCD12864_Num(0,64,DS1302_Time[2]);	
			else{
				LCD12864_Num(0,64,DS1302_Time[2]);
				LCD12864_Write_English(0,70," ");
			}			  
			LCD12864_Write_Chinese(0,80,2,Chinese);
			
			
			//24小时制时间
			if(tim_flag==0){
				//显示时分秒
				if(DS1302_Time[3]/10>=1)LCD12864_Num(2,0,DS1302_Time[3]);	
				else{
					LCD12864_Num(2,0,DS1302_Time[3]);
					LCD12864_Write_English(0,6," ");
				}
				LCD12864_Write_English(2,16,":");
				if(DS1302_Time[4]/10>=1)LCD12864_Num(2,24,DS1302_Time[4]);	
				else{
					LCD12864_Num(2,24,DS1302_Time[4]);
					LCD12864_Write_English(2,30," ");
				}				
				LCD12864_Write_English(2,36,":");
				if(DS1302_Time[5]/10>=1)LCD12864_Num(2,44,DS1302_Time[5]);	
				else{
					LCD12864_Num(2,44,DS1302_Time[5]);
					LCD12864_Write_English(2,50," ");
				}				
			}
			//12小时制时间
			else{
				
				//显示时分秒
				if((DS1302_Time[3]%12)/10>=1)LCD12864_Num(2,0,DS1302_Time[3]%12);	
				else{
					if(DS1302_Time[3] == 12){
						LCD12864_Num(2,0,DS1302_Time[3]);
					}else{
						LCD12864_Num(2,0,DS1302_Time[3]%12);
						LCD12864_Write_English(2,6," ");						
					}
				}
				LCD12864_Write_English(2,16,":");
				if(DS1302_Time[4]/10>=1)LCD12864_Num(2,24,DS1302_Time[4]);	
				else{
					LCD12864_Num(2,24,DS1302_Time[4]);
					LCD12864_Write_English(2,30," ");
				}				
				LCD12864_Write_English(2,36,":");
				if(DS1302_Time[5]/10>=1)LCD12864_Num(2,44,DS1302_Time[5]);	
				else{
					LCD12864_Num(2,44,DS1302_Time[5]);
					LCD12864_Write_English(2,50," ");
				}					
			}

			
			//显示星期
			LCD12864_Write_Chinese(0,96,18,Chinese);
			LCD12864_Write_Chinese(0,112,DS1302_Time[6]+4,Chinese);	
			
			//显示上午和下午
			if(DS1302_Time[3] < 12){
				LCD12864_Write_English(2,64,"AM");
			}
			else{
				LCD12864_Write_English(2,64,"PM");
			}
			
			//显示生日中文
			LCD12864_Write_Chinese(4,0,17,Chinese);
			LCD12864_Write_Chinese(4,16,2,Chinese);
			LCD12864_Write_English(4,32,":");	
	
			//显示生日数据
			if(Mon_set >= 10)LCD12864_Num(4,40,Mon_set);  
			else{
				LCD12864_Write_English(4,40," ");
				LCD12864_Num(4,44,Mon_set); 
			}		
			LCD12864_Write_Chinese(4,56,1,Chinese);
			if(Date_set >= 10)LCD12864_Num(4,72,Date_set);  
			else{
				LCD12864_Write_English(4,72," ");
				LCD12864_Num(4,78,Date_set); 
			}
			LCD12864_Write_Chinese(4,88,2,Chinese);	
			
		}
		//显示温度、湿度
		else if(mode == 1){  
			//获取温湿度
			DHT11_receive();
			
			//显示温度
			LCD12864_Write_Chinese(0,0,12,Chinese);  
			LCD12864_Write_Chinese(0,16,14,Chinese);	
			LCD12864_Write_English(0,32,":");
			if(tem/10 >= 1){
				LCD12864_Num(0,48,tem);
			}
			else{
				LCD12864_Num(0,48,tem);
				LCD12864_Write_English(0,54," ");
			}
			 
			//显示湿度
			LCD12864_Write_Chinese(2,0,13,Chinese);  
			LCD12864_Write_Chinese(2,16,14,Chinese);	
			LCD12864_Write_English(2,32,":");
			if(hum/10 >= 1){
				LCD12864_Num(2,48,hum);
			}
			else{
				LCD12864_Num(2,48,hum);
				LCD12864_Write_English(2,54," ");
			}
			
		}
		
		//显示闹钟、生日
		else if(mode==2){
			//显示闹钟中文
			LCD12864_Write_Chinese(0,0,15,Chinese);
			LCD12864_Write_Chinese(0,16,16,Chinese);
			LCD12864_Write_English(0,32,":");		
			//进行多组闹钟的设置
			if(keyNum==2){
				set_cnt++;
				set_cnt%=3;
				set_pos=0;
			}
			//调节设置的时分位置
			if(keyNum==3){
				set_pos++;
				set_pos %= 2;
			}
			//通过变量进行三个闹钟的设置
			if(set_cnt == 0){
				if(keyNum==6){
					n1 = !n1;
				}
				//显示提示
				LCD12864_Write_English(2,96,"*");	
				LCD12864_Write_English(4,96," ");	
				LCD12864_Write_English(6,96," ");	
				//调节逻辑
				if(set_pos == 0){
					if(keyNum==4){
						Min_set1--;
						if(Min_set1<0)Min_set1=59;
					}
					if(keyNum==5){
						Min_set1++;
						Min_set1%=60;
					}					
				}
				if(set_pos == 1){
					if(keyNum==4){
						Hour_set1--;
						if(Hour_set1<0)Hour_set1=23;
					}
					if(keyNum==5){
						Hour_set1++;
						Hour_set1%=24;
					}					
				}
			}
			//调节闹钟2
			if(set_cnt == 1){
				if(keyNum==6){
					n2 = !n2;
				}
				LCD12864_Write_English(2,96," ");	
				LCD12864_Write_English(4,96,"*");	
				LCD12864_Write_English(6,96," ");
				if(set_pos == 0){
					if(keyNum==4){
						Min_set2--;
						if(Min_set2<0)Min_set2=59;
					}
					if(keyNum==5){
						Min_set2++;
						Min_set2%=60;
					}					
				}
				if(set_pos == 1){
					if(keyNum==4){
						Hour_set2--;
						if(Hour_set2<0)Hour_set2=23;
					}
					if(keyNum==5){
						Hour_set2++;
						Hour_set2%=24;
					}					
				}				
			}
			//调节闹钟3
			if(set_cnt == 2){
				if(keyNum==6){
					n3 = !n3;
				}
				LCD12864_Write_English(2,96," ");	
				LCD12864_Write_English(4,96," ");	
				LCD12864_Write_English(6,96,"*");
				if(set_pos == 0){
					if(keyNum==4){
						Min_set3--;
						if(Min_set3<0)Min_set3=59;
					}
					if(keyNum==5){
						Min_set3++;
						Min_set3%=60;
					}					
				}
				if(set_pos == 1){
					if(keyNum==4){
						Hour_set3--;
						if(Hour_set3<0)Hour_set3=23;
					}
					if(keyNum==5){
						Hour_set3++;
						Hour_set3%=24;
					}					
				}				
			}
			
			//判断闹钟1状态
			if(n1 == 0){
				LCD12864_Write_Chinese(2,64,19,Chinese);	
			}
			else{
				LCD12864_Write_Chinese(2,64,20,Chinese);
			}
			//判断闹钟2状态
			if(n2 == 0){
				LCD12864_Write_Chinese(4,64,19,Chinese);	
			}
			else{
				LCD12864_Write_Chinese(4,64,20,Chinese);
			}
			//判断闹钟3状态
			if(n3 == 0){
				LCD12864_Write_Chinese(6,64,19,Chinese);	
			}
			else{
				LCD12864_Write_Chinese(6,64,20,Chinese);
			}
			
			//显示闹钟数据
			if(Hour_set1/10>=1)LCD12864_Num(2,0,Hour_set1);	
			else{
				LCD12864_Num(2,0,Hour_set1);
				LCD12864_Write_English(2,6," ");
			}	
			LCD12864_Write_English(2,16,":");
			
			if(Min_set1/10>=1)LCD12864_Num(2,24,Min_set1);	
			else{
				LCD12864_Num(2,24,Min_set1);
				LCD12864_Write_English(2,30," ");
			}	

			if(Hour_set2/10>=1)LCD12864_Num(4,0,Hour_set2);	
			else{
				LCD12864_Num(4,0,Hour_set2);
				LCD12864_Write_English(4,6," ");
			}		
			LCD12864_Write_English(4,16,":");
			if(Min_set2/10>=1)LCD12864_Num(4,24,Min_set2);	
			else{
				LCD12864_Num(4,24,Min_set2);
				LCD12864_Write_English(4,30," ");
			}				
			
			if(Hour_set3/10>=1)LCD12864_Num(6,0,Hour_set3);	
			else{
				LCD12864_Num(6,0,Hour_set3);
				LCD12864_Write_English(6,6," ");
			}	
			LCD12864_Write_English(6,16,":");	
			if(Min_set3/10>=1)LCD12864_Num(6,24,Min_set3);	
			else{
				LCD12864_Num(6,24,Min_set3);
				LCD12864_Write_English(6,30," ");
			}				
		}
		
		delay(10);
    }
}     

        另外,对于中文的显示,也需要注意进行取模,一般不带字库的LCD只能显示中文,使用取模软件取得汉字的图形模才可正常显示,以下是正点原子的取模软件:

附上本次项目的取模数据:

#ifndef  __ZIKU_H__
#define  __ZIKU_H__

unsigned char code Num[]={
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  0  --*/
0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*--  文字:  1  --*/
0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,/*--  文字:  2  --*/
0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  3  --*/
0xC0,0xA0,0x98,0xFC,0x80,0x00,0x00,0x00,0x02,0x03,0x02,0x00,/*--  文字:  4  --*/
0x7C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  5  --*/
0xF0,0x48,0x24,0x24,0xC8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  6  --*/
0x00,0x04,0xC4,0x34,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*--  文字:  7  --*/
0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  8  --*/
0x38,0x44,0x44,0x24,0xF8,0x00,0x01,0x02,0x02,0x01,0x00,0x00,/*--  文字:  9  --*/
0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00,/*--  文字:  *  --*/
0x90,0xFC,0x90,0xFC,0x90,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*--  文字:  #  --*/
0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*--  文字:  -  --*/
};

unsigned char code English[]={
0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*--  文字:  a  0--*/
0x02,0xFE,0x20,0x20,0xC0,0x00,0x00,0x03,0x02,0x02,0x01,0x00,/*--  文字:  b  1--*/
0x00,0xC0,0x20,0x20,0x60,0x00,0x00,0x01,0x02,0x02,0x01,0x00,/*--  文字:  c  2--*/
0x00,0xC0,0x20,0x22,0xFE,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*--  文字:  d  3--*/
0x00,0xC0,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x02,0x00,/*--  文字:  e  4--*/
0x00,0x20,0xFC,0x22,0x22,0x04,0x00,0x02,0x03,0x02,0x02,0x00,/*--  文字:  f  5--*/
0x00,0x40,0xA0,0xA0,0x60,0x20,0x00,0x05,0x0A,0x0A,0x0A,0x04,/*--  文字:  g  6--*/
0x02,0xFE,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*--  文字:  h  7--*/
0x00,0x20,0xE6,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*--  文字:  i  8--*/
0x00,0x00,0x20,0xE6,0x00,0x00,0x08,0x08,0x08,0x07,0x00,0x00,/*--  文字:  j  9--*/
0x02,0xFE,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x01,0x02,0x00,/*--  文字:  k  10--*/
0x02,0x02,0xFE,0x00,0x00,0x00,0x02,0x02,0x03,0x02,0x02,0x00,/*--  文字:  l  11--*/
0xE0,0x20,0xE0,0x20,0xC0,0x00,0x03,0x00,0x03,0x00,0x03,0x00,/*--  文字:  m  12--*/
0x20,0xE0,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*--  文字:  n  13--*/
0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00,/*--  文字:  o  14--*/
0x20,0xE0,0x20,0x20,0xC0,0x00,0x08,0x0F,0x0A,0x02,0x01,0x00,/*--  文字:  p  15--*/
0x00,0xC0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x0A,0x0F,0x08,/*--  文字:  q  16--*/
0x20,0xE0,0x40,0x20,0x20,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*--  文字:  r  17--*/
0x00,0x60,0xA0,0xA0,0x20,0x00,0x00,0x02,0x02,0x02,0x03,0x00,/*--  文字:  s  18--*/
0x00,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x03,0x02,0x02,0x00,/*--  文字:  t  19--*/
0x20,0xE0,0x00,0x20,0xE0,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*--  文字:  u  20--*/
0x20,0xE0,0x00,0xE0,0x20,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*--  文字:  v  21--*/
0x60,0x80,0xE0,0x80,0x60,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*--  文字:  w  22--*/
0x20,0x60,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x03,0x02,0x00,/*--  文字:  x  23--*/
0x20,0xE0,0x00,0x00,0xE0,0x20,0x08,0x08,0x05,0x03,0x00,0x00,/*--  文字:  y  24--*/
0x00,0x20,0xA0,0x60,0x20,0x00,0x00,0x02,0x03,0x02,0x02,0x00,/*--  文字:  z  25--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*--  文字:     52--*/
0x00,0xE0,0x9C,0xF0,0x80,0x00,0x02,0x03,0x00,0x00,0x03,0x02,/*--  文字:  A  26--*/
0x04,0xFC,0x24,0x24,0xD8,0x00,0x02,0x03,0x02,0x02,0x01,0x00,/*--  文字:  B  27--*/
0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  C  28--*/
0x04,0xFC,0x04,0x04,0xF8,0x00,0x02,0x03,0x02,0x02,0x01,0x00,/*--  文字:  D  29--*/
0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x02,0x03,0x00,/*--  文字:  E  30--*/
0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*--  文字:  F  31--*/
0xF0,0x08,0x04,0x44,0xCC,0x40,0x00,0x01,0x02,0x02,0x01,0x00,/*--  文字:  G  32--*/
0x04,0xFC,0x20,0x20,0xFC,0x04,0x02,0x03,0x00,0x00,0x03,0x02,/*--  文字:  H  33--*/
0x04,0x04,0xFC,0x04,0x04,0x00,0x02,0x02,0x03,0x02,0x02,0x00,/*--  文字:  I  34--*/
0x00,0x04,0x04,0xFC,0x04,0x04,0x0C,0x08,0x08,0x07,0x00,0x00,/*--  文字:  J  35--*/
0x04,0xFC,0x24,0x50,0x8C,0x04,0x02,0x03,0x02,0x00,0x03,0x02,/*--  文字:  K  36--*/
0x04,0xFC,0x04,0x00,0x00,0x04,0x02,0x03,0x02,0x02,0x02,0x02,/*--  文字:  L  37--*/
0xFC,0x3C,0xC0,0x3C,0xFC,0x04,0x03,0x00,0x03,0x00,0x03,0x02,/*--  文字:  M  38--*/
0x04,0xFC,0x30,0xC4,0xFC,0x04,0x02,0x03,0x02,0x00,0x03,0x00,/*--  文字:  N  39--*/
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  O  40--*/
0x04,0xFC,0x24,0x24,0x18,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*--  文字:  P  41--*/
0xF8,0x84,0x84,0x04,0xF8,0x00,0x01,0x02,0x02,0x07,0x05,0x00,/*--  文字:  Q  42--*/
0x04,0xFC,0x24,0x64,0x98,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*--  文字:  R  43--*/
0x18,0x24,0x24,0x44,0x8C,0x00,0x03,0x02,0x02,0x02,0x01,0x00,/*--  文字:  S  44--*/
0x0C,0x04,0xFC,0x04,0x0C,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*--  文字:  T  45--*/
0x04,0xFC,0x00,0x00,0xFC,0x04,0x00,0x01,0x02,0x02,0x01,0x00,/*--  文字:  U  46--*/
0x04,0x7C,0x80,0xE0,0x1C,0x04,0x00,0x00,0x03,0x00,0x00,0x00,/*--  文字:  V  47--*/
0x3C,0xC0,0x7C,0xC0,0x3C,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*--  文字:  W  48--*/
0x04,0x9C,0x60,0x9C,0x04,0x00,0x02,0x03,0x00,0x03,0x02,0x00,/*--  文字:  X  49--*/
0x04,0x3C,0xC0,0x3C,0x04,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*--  文字:  Y  50--*/
0x0C,0x84,0x64,0x1C,0x04,0x00,0x02,0x03,0x02,0x02,0x03,0x00,/*--  文字:  Z  51--*/
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  0  52--*/
0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*--  文字:  1  53--*/
0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,/*--  文字:  2  54--*/
0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  3  55--*/
0xC0,0xA0,0x98,0xFC,0x80,0x00,0x00,0x00,0x02,0x03,0x02,0x00,/*--  文字:  4  56--*/
0x7C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  5  57--*/
0xF0,0x48,0x24,0x24,0xC8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  6  58--*/
0x00,0x04,0xC4,0x34,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*--  文字:  7  59--*/
0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*--  文字:  8  60--*/
0x38,0x44,0x44,0x24,0xF8,0x00,0x01,0x02,0x02,0x01,0x00,0x00,/*--  文字:  9  61--*/
0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00,/*--  文字:  *  62--*/
0x90,0xFC,0x90,0xFC,0x90,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*--  文字:  #  63--*/
0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*--  文字:  -  64--*/
0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,/*--  文字:  :  65--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,/*--  文字:  .  66--*/

};
unsigned char code English_Buf[]=
{"abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789*#-:.\n"}; //顺序要与字库顺序相同


unsigned char code Chinese[]={

0x00,0x10,0x08,0xCC,0x4A,0x48,0xF8,0x48,0x48,0x48,0x08,0x00,0x02,0x02,0x02,0x03,
0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x02,/*"年",0*/

0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x40,0x60,0x3F,0x04,
0x04,0x04,0x04,0x24,0x64,0x7F,0x00,0x00,/*"月",1*/

0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,0x3F,0x20,
0x20,0x20,0x20,0x20,0x20,0x3F,0x00,0x00,/*"日",2*/

0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x3E,0x00,0x00,0x02,0x41,0x41,0x49,
0x49,0x49,0x7F,0x49,0x49,0x41,0x41,0x00,/*"星",3*/

0x08,0xFE,0xA8,0xA8,0xFE,0x08,0x00,0xFE,0x22,0x22,0xFE,0x00,0x42,0x33,0x1E,0x02,
0x1F,0x32,0x42,0x1F,0x01,0x41,0x7F,0x00,/*"期",4*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"一",5*/

0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x04,0x04,0x04,0x04,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,/*"二",6*/
	
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,/*"三",7*/

0x00,0xF8,0x08,0x08,0xF8,0x08,0xF8,0x88,0x08,0x08,0xF8,0x00,0x00,0x3F,0x24,0x27,
0x21,0x20,0x20,0x21,0x22,0x22,0x3F,0x00,/*"四",8*/

0x00,0x00,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0xC4,0x00,0x00,0x08,0x08,0x08,0x08,
0x08,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,/*"五",9*/

0x40,0x40,0x40,0x40,0x4C,0x5C,0x58,0x40,0x40,0x40,0x40,0x40,0x00,0x20,0x30,0x0C,
0x07,0x00,0x00,0x03,0x06,0x1C,0x30,0x00,/*"六",10*/

0x40,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x44,0x40,0x20,0x20,0x30,0x1C,
0x07,0x01,0x03,0x06,0x0C,0x38,0x20,0x20,/*"天",11*/

0x44,0xCC,0x98,0x00,0x3E,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x10,0x08,0x06,0x20,
0x3F,0x21,0x3F,0x21,0x3F,0x21,0x3F,0x20,/*"温",12*/

0x44,0xCC,0x80,0x7C,0x54,0x54,0x54,0x54,0x54,0x7C,0x00,0x00,0x30,0x1C,0x42,0x58,
0x50,0x7F,0x40,0x7F,0x50,0x4C,0x40,0x00,/*"湿",13*/

0x00,0x00,0xFC,0x04,0x14,0xFC,0x57,0x54,0xFC,0x14,0x04,0x00,0x40,0x60,0x3F,0x00,
0x8C,0x55,0x35,0x35,0x55,0x8C,0x00,0x00,/*"度",14*/

0xF6,0x06,0x20,0xA4,0xA4,0xF4,0xA4,0xA4,0x24,0x04,0xFC,0x00,0x3F,0x00,0x00,0x07,
0x00,0x3F,0x00,0x07,0x20,0x60,0x7F,0x00,/*"闹",15*/

0xA8,0xAC,0xEA,0xA8,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x7F,0x20,
0x10,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,/*"钟",16*/

0x60,0x10,0x1C,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x00,0x40,0x42,0x42,0x42,
0x42,0x42,0x7F,0x42,0x42,0x42,0x42,0x40,/*"生",17*/

0x00,0xFE,0x02,0x22,0xAA,0xAA,0xBE,0xAA,0xAA,0x22,0x02,0xFE,0xE0,0x3F,0x00,0x00,
0x07,0x04,0x04,0x04,0x47,0x40,0xC0,0xFF,/*"周",18*/

0x40,0x40,0x44,0x44,0xFC,0x44,0x44,0xFC,0x44,0x44,0x40,0x40,0x00,0x00,0x00,0x00,
0x3F,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,/*"开",19*/

0x00,0x00,0x20,0x24,0x28,0x20,0xF0,0x28,0x24,0x20,0x20,0x00,0x00,0xC1,0x61,0x31,
0x19,0x0D,0x07,0x0D,0x19,0x31,0x61,0xC1,/*"关",20*/

0xF0,0x00,0xFE,0x40,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x01,0x00,0xFF,0x01,
0xE1,0x31,0x0F,0x09,0x31,0x61,0xC1,0x00,/*"快",21*/

0x00,0xF0,0x08,0x04,0x02,0x01,0xF9,0x01,0x00,0x00,0x00,0x00,0x00,0x31,0x19,0x01,
0x21,0x61,0x7F,0x01,0x09,0x19,0x31,0x00,/*"乐",22*/

};
unsigned char code Chinese_Buf[]=
{"系统初始化测试自动化\n"};


#endif

三、设计演示

        程序运行LCD显示时间,生日等信息,如下图:

        本次设计生日是9月8日,如果到生日,LCD会显示生日快乐,并且在指定时间段,虚拟终端会打印生日快乐,这里时间并未到,没有打印。

if((DS1302_Time[3] == 6 || DS1302_Time[3] == 12 || DS1302_Time[3] == 18) && (DS1302_Time[4] == 0 && DS1302_Time[5] == 0)){
    Serial_SendString("生日快乐\r\n");
}

按下模式切换,进入下一个模式,这是温湿度显示页面,如下:

再次按下模式切换,进入设置闹钟界面,可以设置三个闹钟,并且可以关闭或者开启某个闹钟,如下图,并且都可以使用按键进行调整:

另外,还有一些操作例如12/24小时切换等,这里不做过多演示。

四、项目总结

        本次设计,利用LCD12864显示中文,在仿真上设计时钟功能,并且集成了按键,可以进行页面切换,调整等,实现了预期功能,以下是此项目的视频地址,由于录制仓促,效果并不是很好:

参考如下:

基于51单片机的多功能数字时钟_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值