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

文章目录

  • 前言
    • 跟着B站江科大的单片机视频学了一段时间了,今天决定写一下学到的内容,方便与朋友们交流学习一下,有单片机学习群的朋友请留言告诉我,谢谢。
  • 一、如何使用DS1302时钟芯片
  • 二、使用步骤
    • 1.引入库
    • 2.头文件
  • 总结

前言

跟着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;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}

DS1302时钟芯片头文件:

#include <REGX52.H>sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;unsigned char DS1302_Time[]={22,10,8,20,55,0,6};//定义初始时间#define DS1302_SECOND   0x80//把写入的寄存器地址重新定义,方便理解
#define DS1302_MINUTE   0x82
#define DS1302_HOUR     0x84
#define DS1302_DATE     0x86
#define DS1302_MONTH    0x88
#define DS1302_DAY      0x8A
#define DS1302_YEAR     0x8C
#define DS1302_WP       0x8Evoid DS1302_Init(void)//初始化程序
{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);//IO口来输入指令,由低到高输入字节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;//command(写)|0x01=command(读)最低位决定读或者写DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);//通常与是用来清零的,保证串行输入的时候想要的DS1302_SCLK=0;//那一位是准确的,其他都为0,并且在逻辑运算中只要不等0,那么DS1302_SCLK=1;//语句就为真;而或是用来置1的}for(i=0;i<8;i++){DS1302_SCLK=1;//这里的if语句中用时钟芯片IO口是否为0来判断是否进入判断语句,DS1302_SCLK=0;//如果IO口输出了1也就是高电平,例如第一次循环判断IO=1,那么if(DS1302_IO){Data=Data|(0x01<<i);} //Data的值就是0x00或上0x01,那么Data的}//最低位值就变成了1,也就是0x01;如果第二位IO=0那么Data就会用当前0x01的值或DS1302_CE=0;DS1302_IO=0;return Data;
}//上0x02(0000 0010),Data的最新值就是0000 0011。void DS1302_SetTime()//时间设置是通过多次写入数据到寄存器中得以实现的
{DS1302_WriteByte(DS1302_WP,0x00);//十进制转为BCD码写入,1302芯片中不管写入的数据还是读出的数据都是BCD格式的,所以需要进行转换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_DATE,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);//BCD码转为十进制读出,方便我们理解,所以改为十进制DS1302_Time[0]=Temp/16*10+Temp%16;//通过temp这个中间量来给DS1302_Time这个数组赋值,这个写法要掌握,挺巧妙Temp=DS1302_ReadByte(DS1302_MONTH);DS1302_Time[1]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DATE);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;
}

总结

记得加上头文件(.h)的部分,朋友们有疑问或者有指正的还请多多益善,业务学习,主要就是对单片机感兴趣,平时上班也很忙都是晚上抽时间学习,有一起学习的朋友一定要带带我啊。(附上效果图)

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

  1. #普中51开发板# 52单片机数码管显示5201314

    74HC138真值表(H高,L 低,倒着数) #include<reg52.h> #include<intrins.h> #define LED P0 typedef unsi ...

  2. 【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记

    使用74HC595芯片驱动LED点阵屏的使用笔记 1.控制显示LED点阵屏的思路 2.74HC595芯片的学习 2.1.74HC595芯片是什么? 2.2.74HC595芯片各引脚解释以及分析 2.3 ...

  3. 普中PZ6808L-F4开发板TFTLCD显示屏使用笔记

    0x00 开发板介绍 这学期学的STM32开发,实验室里的开发板型号为PZ6808L-F4 整个板子是这样的 这块板子是F103和F407双核的,但我学的一直就是F407,所以本文所有问题只针对F40 ...

  4. 普中A2开发板红绿灯实验

    ```#include"reg52.h" typedef unsigned int u16; typedef unsigned char u8; sbit k3=P3^2; sbi ...

  5. 【51单片机】:关于51单片机仿真器(普中科技开发板STC89C51)的疑惑(做个记录)

    学习目标: 由于一些特殊原因,重学51单片机,真是无力吐槽,学把,认真学.         仿真器,最主要的作用是仿真调试,每次检查代码找不到任何问题比如说debug.先全速运行几秒后点击停止,看程序 ...

  6. 普中科技开发板使用说明书_普中科技单片机实验板使用操作说明.pdf

    普中科技单片机实验板使用操作说明 单片机学习的良师益友 好帮手单片机学习套件 -PRECHIN 用手册 普中科技有限公司 P R E C H I N - V 2 . 0 开发板 Version 1.2 ...

  7. 普中单片机开发板HC6800-EM3 v2.2 3.0无法烧录下载程序解决

    普中科技单片机在淘宝上买了很久了,一直没用,现在要做设计,就拿来看看.这一看不要紧,刚开始就坑死人了写不进程序.研究了一晚上.其实很简单就是短路帽没接对. l 开发板:普中Prechin HC6800 ...

  8. 普中stm32开发板tftlcd显示图片_STM32实例TFTLCD介绍

    以前我们用 51 单片机控制 TFTLCD(TFT 液晶屏)时,使用的是 IO 口模拟80 接口时序.这次我们来学习如何使用 STM32F1 的 FSMC(灵活的静态存储控制器)接口控制 TFTLCD ...

  9. 普中科技开发板使用说明书_百度大脑加持,米尔科技FZ3深度学习计算卡评测

    如果你要问我现在电子产业什么最热,那无疑是AI,而基于大数据训练的深度学习技术可以说是目前AI应用的最广,最成功的产品形态了,覆盖我们生活的方方面面,诸如购物.看病.新闻编辑等,在这高深技术的背后少不 ...

最新文章

  1. oracle解锁system密码,Oracle System密码忘记 密码修改、删除账号锁定lock
  2. 太阳能发电产业有望大发展
  3. 《软件设计精要与模式》推荐序三
  4. 【精】C语言之变量存储类型
  5. 学习ASP.NET MVC的资料推荐
  6. python爬虫步骤-Docker部署Python爬虫项目的方法步骤
  7. 360 php SQL注入,php中sql注入漏洞示例
  8. Vue 项目断网时跳转到网络错误页面
  9. 三国群雄传ol服务器 修改,三国群英传OL DATA.PAK相关修改
  10. Window7使用虚拟桌面
  11. DP转HDMI/VGA方案设计电路图参考|AG6320参考电路原理图PCB电路图
  12. android-手势密码
  13. Ant Design中Form组件重置验证条件resetFields()方法
  14. 中国知网(cnki)上caj格式转pdf的方法
  15. Spring 分组验证
  16. 0基础学习pythonTASK6——If 、For、While语句
  17. 路由器绑定mac地址
  18. fiddler超全使用教程
  19. 51单片机入门——Proteus 8 Professional的使用
  20. 02-分类算法:knn、朴素贝叶斯、决策树和随机森林

热门文章

  1. No bean named ‘transactionManager‘ available: No matching TransactionManager bean found for qualifie
  2. 为您的应用选择正确的软件定义无线电解决方案
  3. vue 自定义视频上传 el-upload图片上传
  4. 泛微E8流程导入操作
  5. 高收益的笨办法:暴破在Windows提权中的应用
  6. ftp服务的搭建与使用
  7. 004==Unity - Animator - Avater 配置
  8. OSPF综合实验报告
  9. C语言写个简单的虚拟机
  10. js动态创建表格以及赋值