基于DS1302时钟液晶12864显示2路闹钟仿真及源程序

2023-11-11 21:36

本文主要是介绍基于DS1302时钟液晶12864显示2路闹钟仿真及源程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、系统方案
1、本设计采用51单片机作为主控器。
2、DS1302采集年月日时分秒送到液晶12864显示。
3、按键年月日时分秒,两路闹钟。
在这里插入图片描述
二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定义时间变量 秒 分 时 日 月 年
uchar alarm_time[2] = { 10, 6}; //闹钟设置 alarm_time[0]: 分钟 alarm_time[1] :小时
uchar alarm_time2[2] = { 15, 7};
Lcd_Initial(); //LCD初始化
Clock_Fresh( clock_time ); //我把时间刷新放在这里,proteus会调用当前系统时间,
Clock_Initial( clock_time ); //时钟初试化

/***********************中断初始化***************************/
EA = 1; //开总中断
ET0 = 1;  //Timer0 开中断
TMOD = 0x01; //Timer0 工作方式 1
TH0 = 0x3c;
TL0 = 0XB0;   //延时 50 ms

2、液晶显示程序

void showXY(uchar row,uchar col,uchar x,uchar y,uchar tab){
uchar i,j;
bit right;
if(col<64){right=0;}
else {col-=64;right=1;}
for(i=0;i<y;i++){
if(right)cs1=1,cs2=0;
else cs1=0,cs2=1;
Lcd_Write_Command(addX0+row+i);
Lcd_Write_Command(addY0+col);
for(j=0;j<x;j++){
if(col+j<64)Lcd_Write_Byte(tab[i
x+j]);
else if(right0)
{
cs1=1,cs2=0;
Lcd_Write_Command(addX0+row+i);
Lcd_Write_Command(addY0+(col+j-64));
Lcd_Write_Byte(tab[ix+j]);
}
}
}
}
/
返回一个8*16字符索引位置 /
uchar enN(uchar s){
uchar i;
for(i=0;zm8x16_index[i]!=0;i++)
if(zm8x16_index[i]==s[0])break;
return i;
}
/
返回一个16
16字符索引位置 */
uchar cnN(uchar *s){
uchar i;
for(i=0;zm16x16_index[i]!=0;i+=2)
if(zm16x16_index[i]
s&&zm16x16_index[i+1]==(s+1))break ;
return i/2;
}
/* 显示中英文字符串 /
void showStr(uchar row,uchar col,uchar s)
{
uchar i;
for(i=0;s[i]!=0;i++){
if(s[i]<0x80){
showXY(row,col,8,2,zm8x16_Table[enN(&s[i])]);
col+=8;
}else{
showXY(row,col,16,2,zm16x16_Table[cnN(&s[i])]);
col+=16;i+=1;
}
if(col>120)
{
col=0;
row+=2;
}
}
}
3、按键程序
/
******************************************************************************************

  • 函数名称:Key_Idle()
  • 功 能:键盘松开
  • 入口参数:无
  • 出口参数:无
    *********************************************************************************************/
    void Key_Idle()
    {
    while( ( P1 & 0x0f ) != 0x0f );
    }

/********************************************************************************************

  • 函数名称:Key_Scan()

  • 功 能:键盘扫描

  • 入口参数:无

  • 出口参数:键值
    *********************************************************************************************/
    uchar Key_Scan()
    {
    if( ( P1 & 0x0f ) != 0x0f ) //判断按键
    {
    Delay(10); //消除抖动
    // Lcd_Initial();
    if( ( P1 & 0x0f ) != 0x0f )
    {
    switch ( P1 & 0x0f ) //将按键码转换成键值
    {
    case 0x0e: return up_array;
    case 0x0d: return down_array;
    case 0x0b: return clear_array;
    case 0x07: return function_array;
    default : return null;
    }
    }
    }
    return null;
    }
    4、核心算法程序
    void main( void )
    {
    uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定义时间变量 秒 分 时 日 月 年
    uchar alarm_time[2] = { 10, 6}; //闹钟设置 alarm_time[0]: 分钟 alarm_time[1] :小时
    uchar alarm_time2[2] = { 15, 7};
    Lcd_Initial(); //LCD初始化
    Clock_Fresh( clock_time ); //我把时间刷新放在这里,proteus会调用当前系统时间,
    Clock_Initial( clock_time ); //时钟初试化

    /中断初始化****/
    EA = 1; //开总中断
    ET0 = 1; //Timer0 开中断
    TMOD = 0x01; //Timer0 工作方式 1
    TH0 = 0x3c;
    TL0 = 0XB0; //延时 50 ms

    while( 1 )
    {

       {Clock_Fresh( clock_time ); //时间刷新Lcd_Clock( clock_time );   //时间显示             Calendar_Convert( 0 , clock_time );Week_Convert( 0, clock_time );//闹钟1报警if( * alarm_time == HexNum_Convert(* ( clock_time + 1 ) )) //分钟相吻合if( * ( alarm_time + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小时相吻合{	if(HexNum_Convert(*( clock_time )) == 2) TR0 = 1; //启动Timer0}//闹钟2报警if( * alarm_time2 == HexNum_Convert(* ( clock_time + 1 ) )) //分钟相吻合if( * ( alarm_time2 + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小时相吻合{if(HexNum_Convert(*( clock_time )) == 2) TR0 = 1; //启动Timer0}} switch( Key_Scan() ){case up_array:  {//Lcd_Initial();Key_Idle();}break;     case down_array:   {// Lcd_Initial();Key_Idle();}break;                  case clear_array:   {    // Lcd_Initial();Key_Idle();} break;case function_array:{//Lcd_Initial();Key_Function( clock_time, alarm_time ,alarm_time2);}break;case null:      break;}
    

    }
    }
    四、 proteus仿真设计
    Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
    在这里插入图片描述

这篇关于基于DS1302时钟液晶12864显示2路闹钟仿真及源程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/392965

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if