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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1544|回復: 0
收起左側

STC12C單片機 雙串口通訊9600波特率完整實現程序

[復制鏈接]
ID:1063483 發表于 2023-2-19 15:26 | 顯示全部樓層 |閱讀模式
/*-----------------------------------------------
  名稱:STC12C5A60S2雙串口通信(已經成功測試)
  編寫:WatsonBu
  日期:2022.01
  修改:無
  內容:9600波特率 雙串口收發
        接線:串口1 發送P3.1,接收P3.0
              串口2 發送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接收中斷中斷請求標志位
#define S2TI 0x02   //串口2發送中斷請求標志位
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};  //串口接收 數據
uchar recnum2=0;       //串口接收長度
bit recfinish=0;       //串口接收完成
uchar flag=0;
sbit TEST_OK = P0^1;
sbit TEST_NG = P2^2;
sbit V5_off = P2^3;
/*------------------------------------------------
                   函數聲明
------------------------------------------------*/
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)  //串口發送字節
        {
            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--);
}
/*------------------------------------------------
                    主函數
------------------------------------------------*/
void main (void)
{

        InitUART();
        DelayMs(10);
        uart1SendStr("COMTOPC");//用于發送給上位機
              DelayMs(10);
              uart2SendStr(">>GetVal");//去讀取電流測試數據,“GetVal”  是電流測試板的請求協議。
              DelayMs(10);
  while(1)  
    {  
        if(flag1==1)  
     {
                                        flag1=0;
                                       
                                        {
                                        for(i=0;i<9;i++)
                                        send_char_com(RecDate[i]);
                                        recnum2=0;// 接收數據長度清零
                                        DelayMs(100);
                                        }
                                       
         {
                                        uchar i=0;
                                        uchar temp[9]={0};
                                        sprintf((char*)temp,"%8s",RecDate);
                                                      
                                if(strcmp(temp,">>TDTEST") == 0)//這是自己任意設定的約定字  "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接收到數據,將此數據由串口1發送
        if(flag2==1)  
        {  
            flag2=0;  
            UART_1SendOneByte(temp2);  
        }
    }  
}
/*------------------------------------------------
                    1發送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結束標志,
                //通過檢測是否字符串末尾
  {
  UART_1SendOneByte(*s);
  s++;
  }
}
/*------------------------------------------------
                    2發送字符串
------------------------------------------------*/
void uart2SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結束標志,
                //通過檢測是否字符串末尾
  {
  UART_2SendOneByte(*s);
  s++;
  }
}
void UART_1SendOneByte(unsigned char c)  
{  
    SBUF = c;  
    while(!TI);    //若TI=0,在此等待   
    TI = 0;   
}
/****************串口2發送一個字符****************/  
void UART_2SendOneByte(unsigned char c)  
{  
    S2BUF = c;  
    while(!(S2CON&S2TI));  //若S2TI=0,在此等待
    S2CON&=~S2TI;     //S2TI=0  
}  
/************串行口1中斷處理函數*************/  
void UART_1Interrupt(void) interrupt 4  
{  
    if(RI==1)  
    {  
      RI=0;                   //標志位清零
      flag1=1;                       
      if(recnum2<9)
            {
             RecDate[recnum2]=SBUF;
             recnum2++;
            }
                }                       
}  
/************串行口2中斷處理函數*************/  
void UART_2Interrupt(void) interrupt 8  
{  
    if(S2CON&S2RI)  
    {  
        S2CON&=~S2RI;  
        flag2=1;  
        temp2=S2BUF;  
    }   
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产小视频 | 一区二区免费在线视频 | 亚洲一区二区在线视频 | 成人午夜免费福利视频 | 一级片在线免费播放 | 日日日日操| 成人夜晚看av| 日日骚视频 | 三级成人在线 | 91久久精品日日躁夜夜躁国产 | 欧美一级免费黄色片 | 97精品视频在线 | jizz亚洲人| 欧美视频一级 | 91视频麻豆| 国产精品影视在线观看 | 天堂资源视频 | 午夜精品久久久久久久星辰影院 | 日韩爱爱网 | 国产剧情一区二区三区 | 久久99精品久久久久久噜噜 | 国产真实精品久久二三区 | 久久噜 | 成人小视频在线观看 | 视频一区二区三区中文字幕 | 国产一区二区三区视频免费观看 | 色综合天天综合网国产成人网 | 精久久久 | 日韩一级电影免费观看 | 日本高清视频在线播放 | 国产欧美日韩在线观看 | 成人在线不卡 | 日韩在线中文字幕 | 午夜日韩 | 国产一区二区在线播放视频 | 欧美一区二区三区视频 | 国产在线视频在线观看 | 亚洲精品久久久蜜桃 | 免费黄色成人 | 欧美黑人巨大videos精品 | 国产精品区一区二区三区 |