普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4095|回复: 5

在STC89C51中实现通过串口修改LCD中的时间

[复制链接]

1

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2020-10-17 15:33:48 | 显示全部楼层 |阅读模式
要实现的功能是:串口通信(串行助手与单片机通信)液晶屏中做一个时钟可以显示当前时间(格式“13:20:20”),通过串口助手发送固定格式数据“例如 141225”使得液晶屏上时间改成14:12:25。 
我目前的问题是:时间能正常显示,但串口设置不正确,还请大佬指点指点
回复

使用道具 举报

1

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2020-10-17 15:36:09 | 显示全部楼层
#include"reg52.h"
#include"lcd.h"
#define uchar unsigned char   //宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
#define uint unsigned int     //宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。

uchar count;                                //count为定时器0中断次数变量
uchar receiveData[6];                          //用于存储临时值
uchar shi=13,fen=20,miao=20;                            //未做时间修改的计时时钟、分钟、秒钟变量
uchar secondge,secondshi;                //秒钟个位、十位的变量
uchar minutange,minutanshi;                //分钟个位、十位的变量
uchar hourge,hourshi;           //时钟个位、十位的变量
uchar table0[]="LBJ";                    //LCD1602第一行初始显示
uchar table1[]="13:20:20";                //LCD1602第二行初始显示

void Delay(uint i)
{
        while(i--);
}

void Timer0Init()                        //定时器0初始化函数
{
        TMOD=0X01;
        TH0=0XFC;
        TL0=0X18;                                 //1ms
        TR0=1;
        ET0=1;
        EA=1;
}

void UsartInit()
{
        TMOD=0X20;                                //设置计数器工作方式2
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        PCON=0X80;                                //波特率加倍
        TR1=1;                                        //打开计数器
        SCON=0X50;                                //设置为工作方式1
        ES=1;                                        //打开接收中断
        EA=1;                                        //打开总中断
       
}

void LCD1602Display()                                                        //LCD1602字符型液晶显示器显示函数
{
    uchar j;                                                                          //用于存储临时值                                                                               
           LcdWriteCom(0x80+0x00);                                                //LCD1602字符型液晶显示器第一行第一个位置显示
    for(j=0;j<3;j++)                                                                //有3个字符,要循环3次。
        {
            LcdWriteData(table0[j]);                                        //显示字符串
            Delay(100);
          }

   LcdWriteCom(0x80+0x40);                                                //LCD1602字符型液晶显示器第二行第一个位置显示
   for(j=0;j<8;j++)                                                                //有8个字符,要循环8次。
   {
                   LcdWriteData(table1[j]);                                        //显示字符串
             Delay(100);
   }

}

void LCD1602DisplayTime(uchar address,uchar num)                                    //LCD1602显示时间两位数分解函数
{
    uchar shi,ge;                                                                                                        //十位、个位的变量
    shi=num/10;                                                                                                                //十位数
    ge=num%10;                                                                                                                //个位数
    LcdWriteCom(0x80+0x40+address);                                                                        //LCD1602字符型液晶显示器第二行某个显示位
    LcdWriteData(0x30+shi);                                                                                        //0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
    LcdWriteData(0x30+ge);                                                                                        //0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
}

void LCD1602DisplayGeDigitResolve(uchar address,uchar num)                        //LCD1602字符型液晶显示器显示修改时间个位数分解函数
{
     uchar ge;                                                                                                                        //个位的变量
     ge=num%10;                                                                                                                        //个位数
     LcdWriteCom(0x80+0x40+address);                                                                                //LCD1602字符型液晶显示器第二行某个显示位
     LcdWriteData(0x30+ge);                                                                                                //0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
}

void LCD1602DisplayShiDigitResolve(uchar address,uchar num)                        //LCD1602字符型液晶显示器修改时间十位数分解函数
{
     uchar shi;                                                                                                                        //十位变量
     shi=num%10;                                                                                                                        //十位数
     LcdWriteCom(0x80+0x40+address);                                                                                //LCD1602字符型液晶显示器第二行某个显示位
     LcdWriteData(0x30+shi);                                                                                                //0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
}


void main()//主函数
{
        LcdInit();                  //Lcd清屏
        UsartInit();      //串口初始化
    Timer0Init();     //定时器0初始化函数
    LCD1602Display(); //LCD1602字符型液晶显示器显示函数
        while(1);
//                        LcdWriteCom(0x80+0x40);                                 //显示在第二行
//                        LcdWriteData(receiveData);                                         //将获取到的数据显示在lcd上


}

void Timer0() interrupt 1    //定时器0中断函数
{
    TH0=(65536-50000)/256;                                        //TH0重新装值
    TL0=(65536-50000)%256;                                                //TL0重新装值
    count++;                                                                        //定时器0中断次数先赋值再加
    if(count==18)                                                                                        //判断定时器0中断次数是否为18次
         {
             count=0;//定时器0中断次数归零
             miao++;//秒钟先赋值再加
             if(miao==60)//判断秒钟是否达到60秒
            {
              miao=0;//秒钟归零
              fen++;//分钟先赋值再加
              if(fen==60)//判断分钟是否达到60分
             {
               fen=0;//分钟归零
               shi++;//时钟先赋值再加
               if(shi==24)//判断时钟是否达到24时
                      {
                        shi=0;//时钟归零
                      }
                LCD1602DisplayTime(0x00,shi);//时钟显示两位数分解函数
             }
                       LCD1602DisplayTime(0x03,fen);//分钟显示两位数分解函数
            }
                      LCD1602DisplayTime(0x06,miao);//秒钟显示两位数分解函数                 
         }        
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void Usart() interrupt 4
{         
        receiveData[6]=SBUF;                                //读取缓冲区数据
        RI=0;
        SBUF=receiveData[6];         
        while(!TI);
        TI=0;
}
回复 支持 反对

使用道具 举报

4

主题

13

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2020-11-19 20:04:12 | 显示全部楼层
谢谢分享、多多参与学习了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-20 05:03 , Processed in 0.091192 second(s), 33 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表