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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3977|回復: 7
打印 上一主題 下一主題
收起左側

單片機定時器和串口通信問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:679997 發表于 2020-3-11 16:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
這里用了兩個定時器,一個定時器用來計時,一個用來做串口通信把時間發送給串口助手,但是串口助手收到的是00000,有沒有大神看出問題在哪里,急求解決方法
#include<reg51.h>

unsigned long T;
unsigned char PuZhh[6] ;

void UsartConfiguration();
void Delay10ms(unsigned int c);   //誤差 0us
void dispaly();

void SendData(char date)
{
            SBUF = date;   //將要發送的數據放入到發送寄存器
            while(!TI);                  //等待發送數據完成
                TI=0;                          //清除發送完成標志位


}

void time0() interrupt 1  //計時
{
        unsigned char m;
        TH0=0x3c;
        TL0=0xb0;         //50ms
        m++;
        if(m>19)
        {
          T++;
          P0=~P0;   //驗證定時器0是否工作
          m=0;
        }
}

void main()
{
   unsigned char j;
             
   UsartConfiguration();
   dispaly();

   while(1)
   {
    for(j=0; j<6; j++)
                {
                        SBUF = PuZhh[j];   //將要發送的數據放入到發送寄存器
                        while(!TI);                  //等待發送數據完成
                        TI=0;                          //清除發送完成標志位
                }
       
                SendData(0x0d) ;     
                SendData(0x0a) ;
                SendData(0x0d) ;
                SendData(0x0a) ;       
                Delay10ms(50);                  //延時一下再發       

   }

}

void UsartConfiguration()
{
        IT0=1;        //INT0負跳變觸發       
    TMOD=0x21;//定時器工作于方式1
        SCON=0X50;                        //設置為工作方式1
    PCON=0X80;                        //波特率加倍
        TH0=0x3c;          //50ms
        TL0=0xb0;
        TH1=0XF3;         //計數器初始值設置,注意波特率是4800的
        TL1=0XF3;
        EA=1; //CPU開中斷總允許
        ET0=1;//開定時中斷
        EX0=1;//開外部INTO中斷
    TR0=1;//啟動定時
        TR1=1;
}

void dispaly()       
{
   PuZhh[0] =T/36000+'0';         //時
   PuZhh[1] =T%36000/3600+'0';
   PuZhh[2] =T%3600/600+'0';   //分
   PuZhh[3] =T%600/60+'0' ;
   PuZhh[4] =T%60/10+'0'  ;     //秒
   PuZhh[5] =T%10+'0';
}
void Delay10ms(unsigned int c)   //誤差 0us
{
    unsigned char a, b;

    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}

最佳答案

查看完整內容

這很簡單,給你改一下。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2020-3-11 16:04 | 只看該作者
這很簡單,給你改一下。
  1. #include<reg51.h>
  2. //unsigned long T;
  3. unsigned char PuZhh[]="00:00:00\n";
  4. unsigned char hour=0,min=0,sec=0;                        //定義時、分、秒變量
  5. bit flag=0;//中斷標志
  6. /*
  7. void Delay10ms(unsigned int c) //誤差 0us
  8. {
  9.         unsigned char a, b;
  10.         for (;c>0;c--)
  11.         {
  12.                 for (b=38;b>0;b--)
  13.                 {
  14.                         for (a=130;a>0;a--);
  15.                 }         
  16.         }      
  17. }*/

  18. void UsartConfiguration()
  19. {      
  20. //        IT0=1;        //INT0負跳變觸發
  21.         TMOD=0x21;          //定時器工作于方式1
  22.         SCON=0X50;    //設置為工作方式1
  23.         PCON=0X80;    //波特率加倍
  24.         TH0=0x3c;     //50ms
  25.         TL0=0xb0;
  26.         TH1=0XF3;     //計數器初始值設置,注意波特率是4800的
  27.         TL1=0XF3;
  28.         EA=1;                                //CPU開中斷總允許
  29.         ET1=0;                        //禁止定時器1中斷
  30.         ET0=1;                        //開定時中斷
  31. //        EX0=1;                        //開外部INTO中斷
  32.         TR0=1;                        //啟動定時
  33.         TR1=1;
  34. }

  35. void SendData(char date)
  36. {
  37.         SBUF = date;   //將要發送的數據放入到發送寄存器
  38.         while(!TI);                  //等待發送數據完成
  39.         TI=0;                          //清除發送完成標志位
  40. }

  41. void dispaly()        
  42. {
  43.    PuZhh[0]=hour/10+'0';   //時
  44.    PuZhh[1]=hour%10+'0';
  45.    PuZhh[3]= min/10+'0';   //分
  46.    PuZhh[4]= min%10+'0';
  47.    PuZhh[6]= sec/10+'0';   //秒
  48.    PuZhh[7]= sec%10+'0';
  49. }

  50. void main()
  51. {
  52.         unsigned char j;              
  53.         UsartConfiguration();
  54.         while(1)
  55.         {
  56.                 if(flag)
  57.                 {
  58.                         flag=0;
  59.                         dispaly();
  60.                         for(j=0;j<9;j++)
  61.                                 SendData(PuZhh[j]);
  62.                 }       
  63.         }
  64. }

  65. void time0() interrupt 1  //計時
  66. {
  67.         static unsigned char m=0;
  68.         TH0=0x3c;
  69.         TL0=0xb0;         //50ms
  70.         m++;
  71.         if(m>=20)
  72.         {
  73.                 m=0;
  74.                 sec++;
  75.                 P0=~P0;   //驗證定時器0是否工作
  76.                 if(sec>=60)
  77.                 {
  78.                         sec=0;
  79.                         min++;
  80.                         if(min>=60)
  81.                         {
  82.                                 hour++;
  83.                                 if(hour>=24)
  84.                                         hour=0;
  85.                         }       
  86.                 }
  87.                 flag=1;
  88.         }
  89. }
復制代碼
回復

使用道具 舉報

板凳
ID:700687 發表于 2020-3-11 17:59 | 只看該作者
波特率設置錯了吧,系統頻率是多少?
回復

使用道具 舉報

地板
ID:612392 發表于 2020-3-11 18:28 | 只看該作者
明顯中斷程序有問題,你的LED燈狀態也不會變吧?
回復

使用道具 舉報

5#
ID:679997 發表于 2020-3-11 20:30 | 只看該作者
cjjdemon 發表于 2020-3-11 18:28
明顯中斷程序有問題,你的LED燈狀態也不會變吧?

狀態是會改變的
回復

使用道具 舉報

6#
ID:679997 發表于 2020-3-11 20:32 | 只看該作者
mark002 發表于 2020-3-11 17:59
波特率設置錯了吧,系統頻率是多少?

波特率是對的,12M的晶振4800的波特率,沒開另一個定時器時發送是不會正確的。
回復

使用道具 舉報

7#
ID:679997 發表于 2020-3-11 20:57 | 只看該作者
cjjdemon 發表于 2020-3-11 18:28
明顯中斷程序有問題,你的LED燈狀態也不會變吧?

會改變
回復

使用道具 舉報

8#
ID:679997 發表于 2020-3-17 23:31 | 只看該作者
wulin 發表于 2020-3-11 16:04
這很簡單,給你改一下。

你好,我這個程序想加個暫停開始的功能,所以自己加了個串口中斷來接收數據,接收到0x00則暫停,0x01則繼續,改完的程序如下,能不能幫我看一下哪里出問題了
#include<reg51.h>
//unsigned long T;
unsigned char PuZhh[]="00:00:00\n";
unsigned char hour=0,min=0,sec=0;                        //定義時、分、秒變量
bit flag=0;//中斷標志
bit frameFlag=1;//暫停標志
/*
void Delay10ms(unsigned int c) //誤差 0us
{
        unsigned char a, b;
        for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}*/

void UsartConfiguration()
{      
//        IT0=1;        //INT0負跳變觸發
        TMOD=0x21;          //定時器工作于方式1
        SCON=0X50;    //設置為工作方式1
        PCON=0X80;    //波特率加倍
        TH0=0x3c;     //50ms
        TL0=0xb0;
        TH1=0XF3;     //計數器初始值設置,注意波特率是4800的
        TL1=0XF3;
        EA=1;                                //CPU開中斷總允許
        ET1=0;                        //禁止定時器1中斷
        ET0=1;                        //開定時中斷
//        EX0=1;                        //開外部INTO中斷
        TR0=1;                        //啟動定時
        TR1=1;
                ES=1;
}

void SendData(char date)
{
        SBUF = date;   //將要發送的數據放入到發送寄存器
        while(!TI);                  //等待發送數據完成
        TI=0;                          //清除發送完成標志位
}

void dispaly()        
{
   PuZhh[0]=hour/10+'0';   //時
   PuZhh[1]=hour%10+'0';
   PuZhh[3]= min/10+'0';   //分
   PuZhh[4]= min%10+'0';
   PuZhh[6]= sec/10+'0';   //秒
   PuZhh[7]= sec%10+'0';
}

void main()
{
        unsigned char j;              
        UsartConfiguration();
        while(1)
        {
                if(flag&&frameFlag)
                {
                        flag=0;
                        dispaly();
                        for(j=0;j<9;j++)
                                SendData(PuZhh[j]);
                }        
        }
}

void time0() interrupt 1  //計時
{
        static unsigned char m=0;
        TH0=0x3c;
        TL0=0xb0;         //50ms
        m++;
        if(m>=20)
        {
                m=0;
                sec++;
                P0=~P0;   //驗證定時器0是否工作
                if(sec>=60)
                {
                        sec=0;
                        min++;
                        if(min>=60)
                        {
                                hour++;
                                if(hour>=24)
                                        hour=0;
                        }        
                }
                flag=1;
        }
}
void serial()interrupt 4
{
   unsigned char rxch;
   if(RI)                    //中斷標志 RI=1, 數據接收
        {
        RI = 0;                 //軟件清零
        rxch = SBUF;            //讀緩沖  
   if (rxch==0x00)         //停止指令   
        {
     frameFlag =0;            
        }
   if (rxch==0x01)          //繼續指令
        {
     frameFlag =1;         
        }
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av毛片| 日韩成人高清 | 午夜国产一级片 | 黄色免费在线网址 | 九七午夜剧场福利写真 | 国产一级特黄视频 | av网站观看 | 国产精品激情 | 激情欧美一区二区三区 | 日韩视频一区二区在线 | 色偷偷噜噜噜亚洲男人 | 一级毛片免费视频观看 | 色男人天堂av | 久久久久国产精品午夜一区 | 久久的色 | 欧美白人做受xxxx视频 | 精品无码久久久久国产 | 欧美日韩大片 | 国产精品国产精品国产专区不片 | 在线一级片 | 亚洲一区二区三区在线播放 | 一区二区久久精品 | 在线观看日韩av | 成人免费片 | 国内久久 | 精品99久久久久久 | 日本涩涩网 | 日韩欧美网 | 台湾a级理论片在线观看 | 欧美性猛交一区二区三区精品 | 成人不卡| 日本视频在线 | 丁香婷婷综合激情五月色 | 99re视频| 欧美国产免费 | www.久| 国产99久久精品一区二区永久免费 | 午夜视频在线免费观看 | 午夜看电影在线观看 | 亚洲综合色网站 | 亚洲综合二区 |