找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3025|回复: 2
打印 上一主题 下一主题
收起左侧

这个单片机程序怎么实现用串口代替按键修改当前时间?

[复制链接]
跳转到指定楼层
楼主
ID:263129 发表于 2018-1-9 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1.     //我的这个程序怎么实现用串口代替按键修改当前时间???
  2.     #include<reg52.h>
  3.     #define uchar unsigned char
  4.     #define uint unsigned int
  5.     sbit rs=P2^5;          //定义1602液晶rs端
  6.     sbit rw=P2^6;          //定义1602液晶rw端
  7.     sbit lcden=P2^7;      //定义1602液晶lcden端
  8.     sbit s2=P3^2;          //定义功能键
  9.     sbit s3=P3^3;          //定义增大键
  10.     sbit s4=P3^4;          //定义减小键
  11.     uchar count,s1num;
  12.     char miao,shi,fen;
  13.     uchar code table[]="  2018-1-7MON ";       //定义初始上电时液晶默认显示状态
  14.     uchar code table1[]="    00:00:00 ";
  15.     //Read_BursRam(&Read_Flag,1);
  16.     //if(Read_Flag!= 1)
  17.     //{
  18.     // Write_Data(0x90,0xaa);
  19.     // Write_BurstClock(Cur_Time);
  20.     // Write_BurstRam(&Clock_Flag,1);
  21.     // Write_Data(0x8e,0x80);
  22.     //}
  23.     void delay(uint z)                        //延时函数
  24.     {
  25.         uint x,y;
  26.         for(x=z;x>0;x--);
  27.             for(y=110;y>0;y--);
  28.     }
  29.     void write_com(uchar com)        //液晶写命令函数
  30.     {
  31.         rs=0;
  32.         lcden=0;
  33.         P0=com;
  34.         delay(20);
  35.         lcden=1;
  36.         delay(20);
  37.         lcden=0;
  38.     }
  39.     void write_date(uchar date)           //液晶写数据函数
  40.     {
  41.         rs=1;
  42.         lcden=0;
  43.         P0=date;
  44.         delay(20);
  45.         lcden=1;
  46.         delay(20);
  47.         lcden=0;
  48.     }
  49.     void init()                   //初始化函数
  50.     {
  51.         uchar num;
  52.         lcden=0;
  53.         rw=0;
  54.         write_com(0x38);             //初始化1602液晶
  55.         write_com(0x0c);
  56.         write_com(0x06);
  57.         write_com(0x01);
  58.         write_com(0x80);             //设置显示初始坐标
  59.         for(num=0;num<15;num++)
  60.             {
  61.                 write_date(table[num]);
  62.                 delay(20);
  63.             }
  64.         write_com(0x80+0x40);
  65.         for(num=0;num<12;num++)
  66.             {
  67.                 write_date(table1[num]);
  68.                 delay(20);
  69.             }
  70.         TMOD=0x01;            //设置定时器0工作模式1
  71.         TH0=(65536-50000)/256;         //定时器装初值
  72.         TL0=(65536-50000)%256;
  73.         EA=1;                         //开总中断
  74.         ET0=1;                        //开定时器0中断
  75.         TR0=1;                        //启动定时器0
  76.     }
  77.     void write_sfm(uchar add,uchar date)
  78.     {
  79.         uchar shi,ge;
  80.         shi=date/10;
  81.         ge=date%10;
  82.         write_com(0x80+0x40+add);
  83.         write_date(0x30+shi);
  84.         write_date(0x30+ge);
  85.     }
  86.     void keyscan()          //按键扫描函数
  87.     {
  88.         if(s2==0)
  89.         {
  90.             delay(20);
  91.             if(s2==0)            //确认功能键被按下
  92.             {
  93.                s1num++;        //功能键按下次数记录
  94.                 while(!s2);        //确认释放
  95.                 if(s1num==1)    //第一次被按下时
  96.                 {
  97.                     TR0=0;        //关闭定时器
  98.                     write_com(0x80+0x40+10);      //功能键作用在秒
  99.                     write_com(0x0f);              //光标闪烁
  100.                 }
  101.         }
  102.                 if(s1num==2)             //第二次被按下时在分
  103.                 {
  104.                     write_com(0x80+0x40+7);
  105.                 }
  106.                 if(s1num==3)              //第三次被按下时在时
  107.                 {
  108.                     write_com(0x80+0x40+4);
  109.                 }
  110.                 if(s1num==4)              //第四次被按下,清零
  111.                 {
  112.                     s1num=0;
  113.                     write_com(0x0c);
  114.                     TR0=1;                 //启动定时器时钟开始走
  115.                 }
  116.             }
  117.             if(s1num!=0)                  //当功能键被按下后增大键减小键才可以发挥作用
  118.             {
  119.                 if(s3==0)
  120.                 {
  121.                     delay(20);
  122.                     if(s3==0)              //增大键被按下
  123.                     {
  124.                         while(!s2);          //按键释放
  125.                         if(s1num==1)      //若功能键第一次被按下
  126.                         {
  127.                             miao++;           //秒加一
  128.                             if(miao==60)   //秒满60后清零
  129.                                 miao=0;
  130.                             write_sfm(10,miao);      //每调节一次液晶显示一次
  131.                             write_com(0x80+0x40+10);       //显示位置重新回到调节处
  132.                         }
  133.                         if(s1num==2)
  134.                         {
  135.                             fen++;
  136.                             if(fen==60)
  137.                                 fen=0;
  138.                             write_sfm(7,fen);
  139.                             write_com(0x80+0x40+7);
  140.                         }
  141.                         if(s1num==3)
  142.                         {
  143.                             shi++;
  144.                             if(shi==24)
  145.                                 shi=0;
  146.                             write_sfm(4,shi);
  147.                             write_com(0x80+0x40+4);
  148.                         }
  149.                     }
  150.                 }
  151.                 if(s4==0)
  152.                 {
  153.                     delay(20);
  154.                     if(s4==0)
  155.                     {
  156.                         while(!s3);
  157.                         if(s1num==1)
  158.                         {
  159.                             miao--;              //调整秒减一
  160.                             if(miao==-1)      //减到负数则重新设置为59
  161.                                 miao=59;
  162.                             write_sfm(10,miao);
  163.                             write_com(0x80+0x40+10);
  164.                         }
  165.                         if(s1num==2)
  166.                         {
  167.                             fen--;
  168.                             if(fen==-1)
  169.                                 fen=59;
  170.                             write_sfm(7,fen);
  171.                             write_com(0x80+0x40+7);
  172.                         }
  173.                         if(s1num==3)
  174.                         {
  175.                             shi--;
  176.                             if(shi==-1)
  177.                                 shi=23;
  178.                             write_sfm(4,shi);
  179.                             write_com(0x80+0x40+4);
  180.                         }
  181.                     }
  182.                 }
  183.             }
  184.     }
  185.     void main()
  186.     {
  187.     //    Ds1302Init();
  188.         init();
  189.         while(1)
  190.         {
  191.             keyscan();
  192.         }
  193.        }
  194.     void timer0() interrupt 1        //定时器0中断服务程序
  195.     {
  196.         TH0=(65536-50000)/256;        //再次装定时器初值
  197.         TL0=(65536-50000)%256;
  198.         count++;                   //中断次数累加
  199.     if(count==18)
  200.             {
  201.                 count=0;
  202.                 miao++;
  203.                 if(miao==60)
  204.                 {
  205.                     miao=0;
  206.                     fen++;
  207.                     if(fen==60)
  208.                     {
  209.                         fen=0;
  210.                         shi++;
  211.                         if(shi==24)
  212.                         {
  213.                             shi=0;
  214.                         }
  215.                         write_sfm(4,shi);
  216.                     }
  217.                     write_sfm(7,fen);
  218.                 }
  219.                 write_sfm(10,miao);
  220.             }
  221.     }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-1-9 15:54 | 只看该作者
本帖最后由 wulin 于 2018-1-9 16:12 编辑

简单的给你改了一下,未经实物验证,只是抛砖引玉。
初始化程序改了定时器设置,增加了定时器1作波特率发生器
main函数里增加了查询接收串口数据功能
按键扫描函数的内容基本不变,把读键改成了读串口收到的数据(只有02/03/04有效)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5;          //定义1602液晶rs端
sbit rw=P2^6;          //定义1602液晶rw端
sbit lcden=P2^7;      //定义1602液晶lcden端
//sbit s2=P3^2;          //定义功能键
//sbit s3=P3^3;          //定义增大键
//sbit s4=P3^4;          //定义减小键
uchar count,s1num;
char miao,shi,fen;
uchar code table[]="  2018-1-7MON ";       //定义初始上电时液晶默认显示状态
uchar code table1[]="    00:00:00 ";
uchar key=0;//保存串口收到的数据(键值)
//Read_BursRam(&Read_Flag,1);
//if(Read_Flag!= 1)
//{
// Write_Data(0x90,0xaa);
// Write_BurstClock(Cur_Time);
// Write_BurstRam(&Clock_Flag,1);
// Write_Data(0x8e,0x80);
//}
void delay(uint z)                        //延时函数
{
    uint x,y;
    for(x=z;x>0;x--);
        for(y=110;y>0;y--);
}
void write_com(uchar com)        //液晶写命令函数
{
    rs=0;
    lcden=0;
    P0=com;
    delay(20);
    lcden=1;
    delay(20);
    lcden=0;
}
void write_date(uchar date)           //液晶写数据函数
{
    rs=1;
    lcden=0;
    P0=date;
    delay(20);
    lcden=1;
    delay(20);
    lcden=0;
}
void init()                   //初始化函数
{
    uchar num;
    lcden=0;
    rw=0;
    write_com(0x38);             //初始化1602液晶
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
    write_com(0x80);             //设置显示初始坐标
    for(num=0;num<15;num++)
        {
            write_date(table[num]);
            delay(20);
        }
    write_com(0x80+0x40);
    for(num=0;num<12;num++)
        {
            write_date(table1[num]);
            delay(20);
        }
//定时器按晶振频率11.0592MHz设置
        TMOD=0x21;//设置定时器0模式1、定时器1模式2
//        TH0=(65536-50000)/256;//定时器0装初值
//        TL0=(65536-50000)%256;//定时器0装初值
        TH0 = 0x4C;                //50ms
        TL0 = 0x00;                //50ms
        TH1=0xfd;//定时器1自动装载、波特率9600
        TL1=0xfd;//定时器1自动装载
        REN=1;        //允许串行接收
        SM0=0;        //设置串口方式1(8位UART波特率可变)
        SM1=1;        //设置串口方式1(8位UART波特率可变)
        EA=1;    //开总中断
        ET0=1;   //开定时器0中断
        TR0=1;   //开定时器0
        TR1=1;        //开定时器1
}
void write_sfm(uchar add,uchar date)
{
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x40+add);
    write_date(0x30+shi);
    write_date(0x30+ge);
}
void keyscan()          //按键扫描函数
{
        if(key==2)
        {
                s1num++;        //功能键按下次数记录
                if(s1num==1)    //第一次被按下时
                {
                        TR0=0;        //关闭定时器
                        write_com(0x80+0x40+10);      //功能键作用在秒
                        write_com(0x0f);              //光标闪烁
                }
                key=0;//响应后及时清0,防止重复响应
        }
        if(s1num==2)             //第二次被按下时在分
        {
                write_com(0x80+0x40+7);
        }
        if(s1num==3)              //第三次被按下时在时
        {
                write_com(0x80+0x40+4);
        }
        if(s1num==4)              //第四次被按下,清零
        {
                s1num=0;
                write_com(0x0c);
                TR0=1;                 //启动定时器时钟开始走
        }
        if(s1num!=0)                  //当功能键被按下后增大键减小键才可以发挥作用
        {
                if(key==3)
                {
                        if(s1num==1)      //若功能键第一次被按下
                        {
                                miao++;           //秒加一
                                if(miao==60)   //秒满60后清零
                                        miao=0;
                                write_sfm(10,miao);      //每调节一次液晶显示一次
                                write_com(0x80+0x40+10);       //显示位置重新回到调节处
                        }
                        if(s1num==2)
                        {
                                fen++;
                                if(fen==60)
                                        fen=0;
                                write_sfm(7,fen);
                                write_com(0x80+0x40+7);
                        }
                        if(s1num==3)
                        {
                                shi++;
                                if(shi==24)
                                        shi=0;
                                write_sfm(4,shi);
                                write_com(0x80+0x40+4);
                        }
                        key=0;//响应后及时清0,防止重复响应
                }
                if(key==4)
                {
                        if(s1num==1)
                        {
                                miao--;              //调整秒减一
                                if(miao==-1)      //减到负数则重新设置为59
                                        miao=59;
                                write_sfm(10,miao);
                                write_com(0x80+0x40+10);
                        }
                        if(s1num==2)
                        {
                                fen--;
                                if(fen==-1)
                                        fen=59;
                                write_sfm(7,fen);
                                write_com(0x80+0x40+7);
                        }
                        if(s1num==3)
                        {
                                shi--;
                                if(shi==-1)
                                        shi=23;
                                write_sfm(4,shi);
                                write_com(0x80+0x40+4);
                        }
                        key=0;//响应后及时清0,防止重复响应
                }
        }
}
void main()
{
        //Ds1302Init();
        init();
        while(1)
        {
                if(RI==1)                //查询接收中断请求标志位为1
                {
                        EA=0;    //关总中断,防止干扰串口通讯
                        RI=0;                //接收中断请求标志位清0
                        key=SBUF;        //保存接收到的数据
                        SBUF=key;        //将收到的数据发送串口助手验证
                        while(!TI)        //等待发送中断请求标志位为1
                        TI=0;                //发送中断请求标志位清0
                        EA=1;    //开总中断
                }        
                keyscan();
        }
}
void timer0() interrupt 1        //定时器0中断服务程序
{
//        TH0=(65536-50000)/256;        //再次装定时器初值
//        TL0=(65536-50000)%256;
        TH0 = 0x4C;                //50ms
        TL0 = 0x00;                //50ms
        count++;                   //中断次数累加
        if(count==20)
        {
                count=0;
                miao++;
                if(miao==60)
                {
                        miao=0;
                        fen++;
                        if(fen==60)
                        {
                                fen=0;
                                shi++;
                                if(shi==24)
                                {
                                        shi=0;
                                }
                                write_sfm(4,shi);
                        }
                        write_sfm(7,fen);
                }
                write_sfm(10,miao);
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:263129 发表于 2018-1-9 17:14 | 只看该作者
wulin 发表于 2018-1-9 15:54
简单的给你改了一下,未经实物验证,只是抛砖引玉。
初始化程序改了定时器设置,增加了定时器1作波特率发 ...

谢谢,可以用了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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