找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1570|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STC12C單片機(jī) 雙串口通訊9600波特率完整實(shí)現(xiàn)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1063483 發(fā)表于 2023-2-19 15:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/*-----------------------------------------------
  名稱:STC12C5A60S2雙串口通信(已經(jīng)成功測(cè)試)
  編寫:WatsonBu
  日期:2022.01
  修改:無(wú)
  內(nèi)容:9600波特率 雙串口收發(fā)
        接線:串口1 發(fā)送P3.1,接收P3.0
              串口2 發(fā)送P1.3,接收P1.2
------------------------------------------------*/

#include "stc12c5a60s2.h"
#include <stdio.h>
#include <stdarg.h>      
#include <intrins.h>
#include <string.h>
#define uint      unsigned int
#define uchar     unsigned char
#define S2RI 0x01   //串口2接收中斷中斷請(qǐng)求標(biāo)志位
#define S2TI 0x02   //串口2發(fā)送中斷請(qǐng)求標(biāo)志位
unsigned char flag1,flag2,temp2;
unsigned char uart2Receive[100];
unsigned char uart1Receive[100];
unsigned int point1=0,point2=0;
unsigned char i;
uchar RecDate[9]={0};  //串口接收 數(shù)據(jù)
uchar recnum2=0;       //串口接收長(zhǎng)度
bit recfinish=0;       //串口接收完成
uchar flag=0;
sbit TEST_OK = P0^1;
sbit TEST_NG = P2^2;
sbit V5_off = P2^3;
/*------------------------------------------------
                   函數(shù)聲明
------------------------------------------------*/
void UART_1SendOneByte(unsigned char c);
void UART_2SendOneByte(unsigned char c);
void uart1SendStr(unsigned char *s);
void uart2SendStr(unsigned char *s);

void send_char_com(uchar ch)  //串口發(fā)送字節(jié)
        {
            SBUF=ch;
            while(TI==0);
            TI=0;
        }
/*------------------------------------------------
                    雙串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;               // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
    TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打開                    
    EA   = 1;                   //打開總中斷
    ES    = 1;                  //打開串口中斷

    S2CON = 0x50;     
    BRT = 0xFD;                 
    AUXR = 0x10;   
    IE2 =0x01;      
}                           
void DelayMs(uint n)
{
        uchar i=112;

        while(n--)
                while(i--);
}
/*------------------------------------------------
                    主函數(shù)
------------------------------------------------*/
void main (void)
{

        InitUART();
        DelayMs(10);
        uart1SendStr("COMTOPC");//用于發(fā)送給上位機(jī)
              DelayMs(10);
              uart2SendStr(">>GetVal");//去讀取電流測(cè)試數(shù)據(jù),“GetVal”  是電流測(cè)試板的請(qǐng)求協(xié)議。
              DelayMs(10);
  while(1)  
    {  
        if(flag1==1)  
     {
                                        flag1=0;
                                       
                                        {
                                        for(i=0;i<9;i++)
                                        send_char_com(RecDate[i]);
                                        recnum2=0;// 接收數(shù)據(jù)長(zhǎng)度清零
                                        DelayMs(100);
                                        }
                                       
         {
                                        uchar i=0;
                                        uchar temp[9]={0};
                                        sprintf((char*)temp,"%8s",RecDate);
                                                      
                                if(strcmp(temp,">>TDTEST") == 0)//這是自己任意設(shè)定的約定字  "TDTEST",以下照此
                                         {
                                                 V5_off=0;
                                                 DelayMs(100);                              
                                         }
                                        else if(strcmp(temp,">>TDT=OK") == 0)
                                         {
                                                 TEST_NG=1;
                                                 DelayMs(10);
                                                 TEST_OK=0;
                                                 DelayMs(100);                              
                                         }
                                        else if(strcmp(temp,">>TDT=NG") == 0)
                                         {
                                                 TEST_OK=1;
                                                 DelayMs(10);
                                                 TEST_NG=0;
                                                 DelayMs(100);                              
                                         }
                                else
                                        {
                                          uart2SendStr(">>GetVal");
                                                DelayMs(5);
                                        }         

                                }
                                 
                                 {
                                         for(i=0;i<9;i++)   
                                         RecDate[i]=0;
                                 }

     }  
        //如果串口2接收到數(shù)據(jù),將此數(shù)據(jù)由串口1發(fā)送
        if(flag2==1)  
        {  
            flag2=0;  
            UART_1SendOneByte(temp2);  
        }
    }  
}
/*------------------------------------------------
                    1發(fā)送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
                //通過(guò)檢測(cè)是否字符串末尾
  {
  UART_1SendOneByte(*s);
  s++;
  }
}
/*------------------------------------------------
                    2發(fā)送字符串
------------------------------------------------*/
void uart2SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
                //通過(guò)檢測(cè)是否字符串末尾
  {
  UART_2SendOneByte(*s);
  s++;
  }
}
void UART_1SendOneByte(unsigned char c)  
{  
    SBUF = c;  
    while(!TI);    //若TI=0,在此等待   
    TI = 0;   
}
/****************串口2發(fā)送一個(gè)字符****************/  
void UART_2SendOneByte(unsigned char c)  
{  
    S2BUF = c;  
    while(!(S2CON&S2TI));  //若S2TI=0,在此等待
    S2CON&=~S2TI;     //S2TI=0  
}  
/************串行口1中斷處理函數(shù)*************/  
void UART_1Interrupt(void) interrupt 4  
{  
    if(RI==1)  
    {  
      RI=0;                   //標(biāo)志位清零
      flag1=1;                       
      if(recnum2<9)
            {
             RecDate[recnum2]=SBUF;
             recnum2++;
            }
                }                       
}  
/************串行口2中斷處理函數(shù)*************/  
void UART_2Interrupt(void) interrupt 8  
{  
    if(S2CON&S2RI)  
    {  
        S2CON&=~S2RI;  
        flag2=1;  
        temp2=S2BUF;  
    }   
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表