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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2425|回復(fù): 9
收起左側(cè)

51單片機(jī)串口與定時器與串口存在沖突怎么解決

[復(fù)制鏈接]
ID:302293 發(fā)表于 2023-12-14 11:26 | 顯示全部樓層 |閱讀模式
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義                        
#include <intrins.h>
typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;
u8 code  buf[10]={1,2,3,4,5,6,7,8,9,0xA};
u8 xdata buf1[]="STC89RC,Demo";
sbit k1=P1^4;
sbit d1=P3^7;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
sbit LED=P3^7;
unsigned char Temp[];
u8 flag;
u8 i ;
bit ready=0;
  j=0x00;                                         
unsigned char gotData[9];
u8 jscos,jk;
/*------------------------------------------------
                   函數(shù)聲明
------------------------------------------------*/
void SendStr(unsigned char *s);
void Send_data();
void delaynms(unsigned int di) //延時
  {
unsigned int da,db;
for(da=0;da<di;da++)
   for(db=0;db<10;db++);
  }
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
//              // TMOD: timer 1, mode 2, 8-bit 重裝
    TMOD |= 0x21;    //T1方式2、T0方式1
          TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
    TL1 = 0xfd;      //波特率
          TR1   = 1;                  // TR1:  timer 1 打開                        
    IE |= 0x92;      //開啟中斷
          EA    = 1;                  //打開總中斷
    ES    = 1;                  //打開串口中斷
}                           

void Init_Timer1(void)
{
TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
EA=1;            //總中斷打開
ET1=1;           //定時器中斷打開
TR1=1;           //定時器開關(guān)打開
}

void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;            //總中斷打開
ET0=1;           //定時器中斷打開
TR0=1;           //定時器開關(guān)打開
}
void TIM2Inital(void)
{
  RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自動重載
  RCAP2L = (65536-60000)%256;
  ET2=1;                     //打開定時器中斷
  EA=1;                      //打開總中斷
  TR2=1;                     //打開定時器開關(guān)
}


void Send_data()
{         u8 l;

          for(l=0;l<10;l++)
          {
                 SBUF=buf[l];
         while(!TI);
      TI = 0;
          }


}

/*------------------------------------------------
                    發(fā)送一個字節(jié)
------------------------------------------------*/
void SendByte(unsigned char *s)
{
SBUF = *s;
while(!TI);TI = 0;  

}
/*------------------------------------------------
                    發(fā)送一個字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,通過檢測是否字符串末尾
  {
  SendByte(s);
  s++;
  }
}
void timer0(void) interrupt 1
{

static u16        count;  
          TH0=(65535-10000)/256;
      TL0=(65535-10000)%256;
        
//                TR0 = 0;    //關(guān)閉T0
    j = i;      //暫存接收到的數(shù)據(jù)幀長度
    i = 0x00;   //長度清零
    ready = 1;  //置位接收完成標(biāo)志

   if (count >500)  
    {  
    //    LED = ~LED;  
//      P4_0=!P4_0;  
                        count = 0;  
// Send_data();
SendStr("1 2 3 4 5 6");

        }  
    count ++;
}

void timer1(void) interrupt 3
{

static u16        count;  
          TH1=(65535-20000)/256;
      TL1=(65535-20000)%256;
        
//                TR0 = 0;    //關(guān)閉T0
    j = i;      //暫存接收到的數(shù)據(jù)幀長度
    i = 0x00;   //長度清零
    ready = 1;  //置位接收完成標(biāo)志
//      
  if(count>5)
         {
         
         count=0;
//        
           k1=!k1;
         }
count++;


}




/*------------------------------------------------
                     串口中斷程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中斷服務(wù)程序
{
             //定義臨時變量

   if(RI)                        //判斷是接收中斷產(chǎn)生
     {
              RI = 0;         //清零接收中斷標(biāo)志位
        TH0 = 0xf8;
        TL0 = 0x2f;     //2ms定時
        TR0 = 1;        //開啟T0
        gotData[i++] = SBUF; //讀取收到的字節(jié)  
         }
            if(i==9)
                  {
                          i=0;
                   flag=1;
                  }

}
void TIM2(void) interrupt 5 using 1//定時器2中斷
    {

   static u16 jks;

         TF2=0;

         jks++;
           if(jks>20)
                  {
                           jks=0;
                         P4_0=!P4_0;  
                        }
         
}

/*------------------------------------------------
                    主函數(shù)
------------------------------------------------*/
void main (void)
{
  u8 i;
InitUART();
//Init_Timer0();
TIM2Inital();
//SendStr("UART test,技術(shù) 請在發(fā)送區(qū)輸入任意信息");
//Init_Timer1();
   d1=0;
PS=0;
LED=1;

//打開串口中斷
while (1)                       
    {
      if( flag)
            {
                  
                  
                  
                            if(gotData[0]==0xFF)
                             {           
                                   LED=!LED;
                                 jk=1;
                          }
                 
                          flag=0;
                 }  
      if(jscos==1)
            {
//                 Send_data();
                 jscos=0;
                }
//         Send_data();
        }                                   
}


回復(fù)

使用道具 舉報

ID:1085081 發(fā)表于 2023-12-14 19:28 | 顯示全部樓層
在51單片機(jī)中,串口和定時器共享同一個中斷向量,因此會存在沖突。解決這個沖突的方法是使用不同的定時器和串口中斷,并在中斷服務(wù)程序中分別處理定時器和串口相關(guān)的功能。在初始化時,將定時器1用于串口通信,定時器0用于其他定時任務(wù)
void InitUART(void)
{
    // ...
    TMOD |= 0x20; // T1方式2、T0方式1
    TH1 = 0xFD;  // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
    TL1 = 0xFD;  // 波特率
    // ...
}

void Init_Timer0(void)
{
    TMOD |= 0x01;   // 使用模式1,16位定時器
    TH0 = (65535-10000)/256;
    TL0 = (65535-10000)%256;
    ET0 = 1;        // 定時器中斷打開
    TR0 = 1;        // 定時器開關(guān)打開
}

回復(fù)

使用道具 舉報

ID:1085081 發(fā)表于 2023-12-14 19:28 | 顯示全部樓層
void timer1(void) interrupt 3
{
    static u16 count;

    TH1 = (65535-20000)/256;
    TL1 = (65535-20000)%256;

    if(count > 5)
    {
        count = 0;
        // 處理定時器相關(guān)的任務(wù)
        k1 = !k1;
    }
    count++;
}

void UART_SER(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        TH0 = 0xF8;
        TL0 = 0x2F;
        TR0 = 1;

        gotData[i++] = SBUF;
        if(i == 9)
        {
            i = 0;
            flag = 1;
        }
    }
}
回復(fù)

使用道具 舉報

ID:1085081 發(fā)表于 2023-12-14 19:28 | 顯示全部樓層
void timer1(void) interrupt 3
{
    static u16 count;

    TH1 = (65535-20000)/256;
    TL1 = (65535-20000)%256;

    if(count > 5)
    {
        count = 0;
        // 處理定時器相關(guān)的任務(wù)
        k1 = !k1;
    }
    count++;
}

void UART_SER(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        TH0 = 0xF8;
        TL0 = 0x2F;
        TR0 = 1;

        gotData[i++] = SBUF;
        if(i == 9)
        {
            i = 0;
            flag = 1;
        }
    }
}
回復(fù)

使用道具 舉報

ID:1034262 發(fā)表于 2023-12-14 21:28 | 顯示全部樓層
clyf 發(fā)表于 2023-12-14 19:28
在51單片機(jī)中,串口和定時器共享同一個中斷向量,因此會存在沖突。解決這個沖突的方法是使用不同的定時器和 ...

在51單片機(jī)中,串口和定時器共享同一個中斷向量?

哪家的51這樣的? 我用過各家的51,串口和定時器都是分開的中斷向量。
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2023-12-15 07:50 | 顯示全部樓層
coody_sz 發(fā)表于 2023-12-14 21:28
在51單片機(jī)中,串口和定時器共享同一個中斷向量?

哪家的51這樣的? 我用過各家的51,串口和定時器都 ...

好,謝謝
回復(fù)

使用道具 舉報

ID:195496 發(fā)表于 2023-12-15 09:06 | 顯示全部樓層
定時器與串口中斷怎么會共用一個,串口波特率發(fā)生器會占用一個定時器,這個定時器中斷就不能用了,串口中斷是發(fā)送與接收一個字節(jié)時產(chǎn)生的中斷。跟定時器沒有關(guān)系。
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2023-12-15 11:18 | 顯示全部樓層
大漠落日 發(fā)表于 2023-12-15 09:06
定時器與串口中斷怎么會共用一個,串口波特率發(fā)生器會占用一個定時器,這個定時器中斷就不能用了,串口中斷 ...

    有個問題是,定時器在工作時會打斷串口發(fā)送數(shù)據(jù),但是中斷不會
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2023-12-15 23:25 | 顯示全部樓層
在8051是這樣的:一個定時器如果用來作波特率了,那么,這個定時器就不要再用了,而且,還要禁止這個定時器的中斷,不要讓它產(chǎn)生中斷
回復(fù)

使用道具 舉報

ID:517951 發(fā)表于 2023-12-20 08:10 | 顯示全部樓層
8051單片機(jī)的定時器是要用于串口的波特率發(fā)生器的, 可以用52單片機(jī), 比51單片機(jī)多一個定時器:T2也可用于波特率發(fā)生器.  單片機(jī)管腳一樣的, 可以直接替換后改代碼.
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线免费观看 | 亚洲免费网站 | 日韩黄色一级 | 美女视频一区二区 | 国产又黄又猛 | 97精品超碰一区二区三区 | 五月婷婷丁香 | 午夜精品久久久久久久久久蜜桃 | 欧美性受xxxx黑人xyx性爽 | 国产精品久久久久久久久久久久久 | 日韩欧美在线免费观看 | www.国产| 免费黄色大片 | 国产美女自拍视频 | 国产嫩草视频 | 久久精品毛片 | 欧美激情视频一区二区三区 | 午夜www| 色妞色视频一区二区三区四区 | 欧美xxxx性 | 国内精品一区二区三区 | 日韩一区在线播放 | 国产黄色一级片 | 999在线视频| 亚洲黄色免费 | 中文字幕日韩在线观看 | 免费a网站 | 蜜臀久久99精品久久久久宅男 | 天天爽天天操 | 久久精品视频免费 | 亚洲精品社区 | 黄网免费看 | 精品伊人久久 | 天天拍天天干 | 亚洲免费观看视频 | 精品日韩在线观看 | 国产欧美日韩 | 欧美视频区 | 91在线一区二区 | 久久精品视频99 | 国产h在线观看 |