• 基于STC15单片机电子时钟液晶1602串口显示-proteus仿真-源程序


    一、系统方案
    1、本设计采用STC15单片机作为主控器。
    2、液晶1602显示电子时钟
    3、串口显示电子时钟。
    4、按键控制开启暂停清零。
    在这里插入图片描述

    二、硬件设计
    原理图如下:
    在这里插入图片描述

    三、单片机软件设计
    1、首先是系统初始化
    uint count=0;

    uint8 strPhoto[8];
    uint wendu=0;
    
    • 1
    • 2

    P3M0 = 0x00;
    P3M1 = 0x00;
    lcd_init(); //LCD1602初始化
    delay_ms(10); //初始化后延时
    DisplayListChar(0, 0, table1); //在LCD1602屏第一行显示table1内容

    EA = 1; //开总中断
    TMOD = 0X21; //定时器0、工作方式1
    ET0 = 1; //开定时器0中断
    TR0 = 0; //允许定时器0定时

    TH0 = 0X3C;
    TL0 = 0XB0;	   //50ms
    
    • 1
    • 2

    2、液晶显示程序
    /**************************************
    功能描述:LCD1602写命令函数
    入口参数int8 com
    返回值:无
    ***************************************/
    void lcd_wcom(uint8 com)
    {
    lcd1602_rs=0; //选择指令寄存器
    lcd1602_rw=0; //选择写
    P0=com; //把命令字送入P0
    delay_ms(1); //延时一小会儿,让1602准备接收数据
    lcd1602_en=1; //使能线电平变化,命令送入1602的8位数据口
    lcd1602_en=0;
    }

    /**************************************
    功能描述:LCD1602写数据函数
    入口参数:uint8 dat
    返回值:无
    ***************************************/
    void lcd_wdat(uint8 dat)
    {
    lcd1602_rs=1; //选择数据寄存器
    lcd1602_rw=0; //选择写
    P0=dat; //把要显示的数据送入P0
    delay_ms(1); //延时一小会儿,让1602准备接收数据
    lcd1602_en=1; //使能线电平变化,数据送入1602的8位数据口
    lcd1602_en=0;
    }

    /**************************************
    功能描述:LCD1602初始化函数
    入口参数:无
    返回值:无
    **************************************/
    void lcd_init(void)
    {
    lcd_wcom(0x38); //8位数据,双列,5
    7字形
    lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
    lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
    lcd_wcom(0x01); //清屏
    }

    /**************************************
    功能描述:LCD1602按指定位置显示一个字符
    入口参数:uint8 X, uint8 Y, uint8 DData
    返回值:无
    ***************************************/
    void DisplayOneChar(uint8 X, uint8 Y, uint8 DData)
    {
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1
    if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
    X |= 0x80; //算出指令码
    lcd_wcom(X); //发命令字
    lcd_wdat(DData); //发数据
    }

    /**************************************
    功能描述:LCD1602按指定位置显示一串字符
    入口参数:uint8 X, uint8 Y, uint8 DData X代表第X+1列,Y代表第Y+1行
    返回值:无
    ***************************************/
    void DisplayListChar(uint8 X, uint8 Y, uint8 code *DData)
    {
    uint8 ListLength;

    ListLength = 0;
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1
    while (DData[ListLength]>0x19) //若到达字串尾则退出
    {
    if (X <= 0xF) //X坐标应小于0xF
    {
    DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
    ListLength++;
    X++;
    }
    }
    }

    3、按键程序
    void key() //键盘扫描函数
    {
    if(key10)
    {
    delay_ms(10);
    if(key1
    0)
    {
    while(!key1);
    TR0=1;
    }
    }
    if(key20)
    {
    delay_ms(10);
    if(key2
    0)
    {
    while(!key2);
    TR0=0;
    }
    }
    if(key30)
    {
    delay_ms(10);
    if(key3
    0)
    {
    while(!key3);
    TR0=0;hour=0;minute=0;second=0;
    }
    }
    }
    4、核心算法程序
    /定时器0中断程序***/
    void time0() interrupt 1
    {
    TH0 = 0X3C;
    TL0 = 0XB0; //50ms

    count++	;   
      if(count==20)                                                         //20次50毫秒即一秒
        {
                count=0;
                second++;
                if(second==60)                                                  //秒加到60时分进位
                {
                        second=0;
                        minute++;
                        if(minute==60)                                                  //分加到60时时进位
                        {
                                minute=0;
                                hour++;
                                if(hour==24)                                                //时加到24时清0
                                {
                                        hour=0;
                                }      
                            
                        }
                     
                }
                       
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

  • 相关阅读:
    ThreadCache线程缓存
    操作系统复习(三):文件管理
    跨域的解决方案
    Docker 镜像拉取
    C++/Python:罗德里格斯旋转矩阵
    【测试联调】如何在前后端测试联调时优雅的构造异常场景
    城商行数据仓库数据测试总结:方法、流程、策略和常见问题
    第64章 Jquery JSON Table Nop后台重构定义Jquery DataTables
    Cobalt Strike(三)DNS bacon 的使用与原理
    MCE | 丙型肝炎病毒的终结之路
  • 原文地址:https://blog.csdn.net/bbxyliyang/article/details/133099429