久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3624|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲综合色 | 最新黄色在线观看 | 精品自拍视频 | 黄色大片视频 | 成人在线免费观看 | 日韩视频91 | 国产日韩欧美 | 久久久久久久久中文字幕 | 最新毛片网站 | 欧美精品一区在线 | 亚洲国产aⅴ精品一区二区 免费观看av | 一级特黄网站 | 91精品国产综合久久久密闭 | 日韩精品视频在线免费观看 | 亚洲人成人一区二区在线观看 | 青青青伊人 | 中文字幕av在线一二三区 | 久操伊人 | 91黄在线观看 | 日韩综合在线 | 国产精品视频播放 | 精品国产乱码久久久久久丨区2区 | 99视频在线播放 | 国产精品国产精品 | 黄视频网址 | 蜜桃视频在线观看免费视频网站www | 国产亚洲一区二区三区在线观看 | 伊人激情综合网 | 成人小视频在线观看 | 久久精品视频在线免费观看 | 成人在线精品 | 99re国产精品| 欧美二区三区 | 精品不卡 | 91视频免费观看 | 亚洲高清视频在线 | 一级特黄a大片 | 欧美一级在线观看 | 欧美日韩久久 | 国产激情网 | 欧美一二三四成人免费视频 |