普中51开发板利用1602LCD与1302时钟芯片来显示时间的程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

跟着B站江科大的单片机视频学了一段时间了,今天决定写一下学到的内容,方便与朋友们交流学习一下,有单片机学习群的朋友请留言告诉我,谢谢。

提示:以下是本篇文章正文内容,下面案例可供参考

一、如何使用DS1302时钟芯片

1302芯片中自带存储时间的寄存器,并且会自动计时。

二、使用步骤

1.引入库

主代码如下:

/*
此程序的大体思路是:
1.先将1302芯片进行初始化,此处信息都要从手册中获取
2.要想要芯片工作要先给一个初始的时间,也就是上电后显示的时间,这需要我们把想要设置的时间写入到芯片中,
也就是学会编写写入指令和数据的函数,此处将不同寄存器地址都给列了出来,再通过读取函数中的给指令字节或上0x01来达到
给指令最低位置1的效果,这个做法比较巧妙,最好掌握
3.完成了写入函数,那么就要通过读取函数来将寄存器中的数据获取出来了,从而才能通过1602液晶显示出来,并且读取函数是个不断循环的函数
原因在于1302芯片中的时间寄存器会自动加1,来不断刷新时间,也就要求程序要不断循环读取芯片中寄存器的数据,来刷新1602显示
4.在写入与读取函数都写完之后,为了程序进一步精简化,再设置一个设置时间的函数,负责将年月日时分秒这些数据写入到寄存器中,并且设置时间这个
函数只需要设置一次初始值即可,数据由数组中获取
5.为了方便也给读取时间数据设置了新的函数,分别获取寄存器的数据,因为1302自动计时增加的特点,寄存器中的数据会不断地更新,那么这个新添加
的读取函数就是一下子读年月日时分秒这些数据,这里要注意的是数据写入与存储都是以BCD格式进行的,要进行换算;将获取的值重新赋给数组,再供
LCD显示
6.最后根据需要将星期用英文缩写进行
*/

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"

void main()
{
   
	LCD_Init();
	DS1302_Init();
	LCD_ShowString(1,1,"20  -  -  ");//这是显示字符串,也就是时钟上分隔符的函数
	LCD_ShowString(2,1,"  :  :  ");
	
	DS1302_SetTime();	
	while(1)
	{
   
		DS1302_ReadTime();
		LCD_ShowNum(1,3,DS1302_Time[0],2);
		LCD_ShowNum(1,6,DS1302_Time[1],2);
		LCD_ShowNum(1,9,DS1302_Time[2],2);
		LCD_ShowNum(2,1,DS1302_Time[3],2);
		LCD_ShowNum(2,4,DS1302_Time[4],2);
		LCD_ShowNum(2,7,DS1302_Time[5],2);
//		LCD_ShowNum(2,10,DS1302_Time[6],1);
		switch(DS1302_Time[6])//为了显示星期几的英文缩写,尝试了一下写入到1302头文件中,有点难。
		{
   
			case 1 :LCD_ShowString(2,10,"Mon");break;
			case 2 :LCD_ShowString(2,10,"Tus");break;
			case 3 :LCD_ShowString(2,10,"Wed");break;
			case 4 :LCD_ShowString(2,10,"Thu");break;
			case 5 :LCD_ShowString(2,10,"Fri");break;
			case 6 :LCD_ShowString(2,10,"Sat");break;
			case 7 :LCD_ShowString(2,10,"Sun");break;
		}
	}
}

2.头文件

1602LCD代码如下:

#include <REGX52.H>

//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是普中51开发板读取红外编码并显示在LCD1602上的代码,已经加上了注释: ```c #include <reg52.h> // 引入 8051 的寄存器定义头文件 #define uchar unsigned char // 定义 uchar 等价于 unsigned char #define uint unsigned int // 定义 uint 等价于 unsigned int sbit RS = P2^6; // 1602 的 RS 引脚接在 P2.6 引脚上 sbit RW = P2^5; // 1602 的 RW 引脚接在 P2.5 引脚上 sbit EN = P2^7; // 1602 的 EN 引脚接在 P2.7 引脚上 sbit IRIN = P3^2; // 红外接收模块的输出引脚接在 P3.2 引脚上 uchar code Init_1602[] = {0x38, 0x0c, 0x06, 0x01, 0x80}; // 初始化 1602 的指令序列 void delay(uint i) // 延时函数 { while(i--); } void Write_1602_Command(uchar command) // 写入命令到 1602 { RS = 0; // 先将 RS 置为 0,表示写入命令 RW = 0; // 将 RW 置为 0,表示写入操作 P0 = command; // 将命令写入 P0 端口 EN = 1; // 将 EN 置为 1,表示向 1602 发送数据 delay(100); // 延时 EN = 0; // 将 EN 置为 0,表示停止向 1602 发送数据 } void Write_1602_Data(uchar dat) // 写入数据到 1602 { RS = 1; // 将 RS 置为 1,表示写入数据 RW = 0; // 将 RW 置为 0,表示写入操作 P0 = dat; // 将数据写入 P0 端口 EN = 1; // 将 EN 置为 1,表示向 1602 发送数据 delay(100); // 延时 EN = 0; // 将 EN 置为 0,表示停止向 1602 发送数据 } void Init_1602() // 初始化 1602 { uchar i; for(i = 0; i < 5; i++) { Write_1602_Command(Init_1602[i]); // 依次写入初始化指令 } } void display(uchar hang, uchar lie, uchar *p) // 在指定位置显示字符串 { uchar i; if(hang == 0) { Write_1602_Command(0x80 + lie); // 如果是第一行,将光标移到对应位置 } else { Write_1602_Command(0xc0 + lie); // 如果是第二行,将光标移到对应位置 } for(i = 0; p[i] != '\0'; i++) { Write_1602_Data(p[i]); // 逐个写入字符 } } uchar IR_get() // 读取红外编码 { uchar i = 0, j = 0; uchar IR_value = 0; while(IRIN && j < 200) // 等待低电平 { delay(1); j++; } delay(30); if(!IRIN) // 判断是否正确接收到了红外信号 { IR_value = 0xff; // 如果正确接收到了信号,将 IR_value 设为 0xff while(!IRIN && i < 80) // 等待高电平开始 { delay(1); i++; } delay(30); for(i = 0; i < 8; i++) { while(IRIN && j < 30) // 等待低电平开始 { delay(1); j++; } delay(18); if(IRIN) // 如果是高电平,将对应位设为 1 { IR_value |= 1 << i; } while(!IRIN); // 等待这一位结束 } } return IR_value; // 返回红外编码 } void main() { uchar IR_value; Init_1602(); // 初始化 1602 display(0, 0, "Welcome to use"); // 显示欢迎界面 display(1, 0, "IR remote control"); // 显示提示信息 while(1) { IR_value = IR_get(); // 读取红外编码 if(IR_value != 0xff) // 如果正确接收到了红外编码 { display(1, 0, "IR:"); // 显示提示信息 Write_1602_Data(IR_value / 100 + '0'); // 显示百位数 Write_1602_Data(IR_value % 100 / 10 + '0'); // 显示十位数 Write_1602_Data(IR_value % 10 + '0'); // 显示个位数 } } } ``` 注释已经在代码中给出,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值