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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8A8K64D4單片機 脈沖捕獲串口輸出例程分享

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:280979 發(fā)表于 2023-7-7 13:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
【聲明】此程序僅用于學(xué)習(xí)與參考!     
*********************************************************************/
#include "STC8A8K64D4.h"
#include "RTX51TNY.h"
#include "uart.h"
#include "PCC.h"
#include <intrins.h>

#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int  //宏定義無符號整型

/*******************************************************************************
* 函 數(shù) 名       : System初始化
* 函數(shù)功能                            : 任務(wù)0
* 作用           : 初始化函數(shù)和創(chuàng)建任務(wù),使用完后記住刪除任務(wù)0
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void System_Init(void)
{
          P0M1 = 0X00;//必須設(shè)置雙向io口
    P0M0 = 0X00;
    P1M1 = 0X00;//必須設(shè)置雙向io口
    P1M0 = 0X00;
    P2M1 = 0X00;
    P2M0 = 0X00;
    P3M1 = 0X00;
    P3M0 = 0X00;
    P4M1 = 0X00;
    P4M0 = 0X00;
    P5M1 = 0X00;
    P5M0 = 0X00;
       
    IT1 = 1;    //使能INT1下降沿中斷
    EX1 = 1;    //使能INT1中斷       
       
          Init_UART();//串口轉(zhuǎn)移
          ConfigUART();//串口1配置
          Config2UART();//串口2配置
    ConfigPCC();//配置脈沖捕獲
}
/*******************************************************************************
* 函 數(shù) 名       : task_create
* 函數(shù)功能                            : 任務(wù)0
* 作用           : 初始化函數(shù)和創(chuàng)建任務(wù),使用完后記住刪除任務(wù)0
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void task_create(void) _task_ 0
{       
        //系統(tǒng)初始化
        System_Init();
        //創(chuàng)建任務(wù)1、2
        os_create_task(1);//串口監(jiān)控
        os_create_task(2);//串口1 2
        os_create_task(3);//脈沖計數(shù)
        os_delete_task(0);//刪除任務(wù)0       
                while(1)
        {
                ;
        }       
}
#include "STC8A8K64D4.h"
#include "uart.h"
#include "PCC.h"
#include "RTX51TNY.h"

bit flagFrame=0,flagTxd=0,flagFrame2=0,flagTxd2=0;
unsigned char  cntRxd = 0;   //接收字節(jié)計數(shù)器
unsigned char xdata bufRxd[20];
unsigned char  cnt2Rxd = 0;   //接收字節(jié)計數(shù)器
unsigned char xdata buf2Rxd[20];
/********************************************************************
                            配置串口1
*********************************************************************/
void ConfigUART(void)
{
          RS485_DIR = 0;
    SCON = 0x50;                //8位可變波特率
    T2L = (65536 - (FOSC/4/BAUD));   //設(shè)置波特率重裝值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
    AUXR |= 0x01;               //選擇定時器2為串口1的波特率發(fā)生器
          ES = 1;
}
/*******************************************************************
*                        串口轉(zhuǎn)移到P3.6 P3.7
********************************************************************/
void Init_UART(void)
{
        ACC = P_SW1;
  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  P_SW1 = ACC;
}
/********************************************************************
                            配置串口2
*********************************************************************/
void Config2UART(void)
{          
    S2CON = 0x50;                //8位可變波特率
    T2L = (65536 - (FOSC/4/BAUD));   //設(shè)置波特率重裝值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
    AUXR |= 0x01;               //選擇定時器2為串口1的波特率發(fā)生器
          IE2 = 0x01;
}
/********************************************************************
                            串口1發(fā)送
*********************************************************************/
void UartWrite(unsigned char *buf, unsigned char len){//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度
          RS485_DIR = 1;
    while (len--){   //循環(huán)發(fā)送所有字節(jié)
         flagTxd = 0;      //清零發(fā)送標(biāo)志
         SBUF = *buf;    //發(fā)送一個字節(jié)數(shù)據(jù)
                     buf++;
        while (!flagTxd); //等待該字節(jié)發(fā)送完成
    }
                RS485_DIR = 0;
}
/********************************************************************
                            串口2發(fā)送
*********************************************************************/
void Uart2Write(unsigned char *buf2, unsigned char len2){//串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長度          
    while (len2--){   //循環(huán)發(fā)送所有字節(jié)
        flagTxd2 = 0;      //清零發(fā)送標(biāo)志
        S2BUF = *buf2;    //發(fā)送一個字節(jié)數(shù)據(jù)
                    buf2++;
        while (!flagTxd2); //等待該字節(jié)發(fā)送完成
    }               
}
/********************************************************************
                            串口1發(fā)送字符串
*********************************************************************/
//void Send_Uart2_string(unsigned char *p)//串口2發(fā)送字符串
//{
//         unsigned char i=0,len_s=0;
//         for(i=0;*(p+i)!='\0';i++);//得出字符串長度
//         len_s=i;
//         Uart2Write(p,len_s);
//}
/********************************************************************
                            串口監(jiān)控
*********************************************************************/
void UartRxMonitor(unsigned char ms){//串口接收監(jiān)控,由空閑時間判定幀結(jié)束,需在定時中斷中調(diào)用,ms-定時間隔
    static unsigned char cntbkp = 0;
    static unsigned char idletmr = 0;
            if (cntRxd > 0){  //接收計數(shù)器大于零時,監(jiān)控總線空閑時間
        if (cntbkp != cntRxd){  //接收計數(shù)器改變,即剛接收到數(shù)據(jù)時,清零空閑計時
            cntbkp = cntRxd;
            idletmr = 0;
        }else{                   //接收計數(shù)器未改變,即總線空閑時,累積空閑時間
            if (idletmr < 20){  //空閑計時小于30ms時,持續(xù)累加
                idletmr += ms;
                if (idletmr >= 20){  //空閑時間達到30ms時,即判定為一幀接收完畢
                    flagFrame = 1;  //設(shè)置幀接收完成標(biāo)志
                }
            }
        }
    }else
        if(cnt2Rxd > 0){
        if (cntbkp != cnt2Rxd){
            cntbkp = cnt2Rxd;
            idletmr = 0;
        }else{
            if (idletmr < 20){
                idletmr += ms;
                if (idletmr >= 20){  
                    flagFrame2 = 1;
               }
            }
        }               
        }
        else{
        cntbkp = 0;
    }
}
/********************************************************************
                            串口1接收
*********************************************************************/
void UartDriver(){//串口1接收
   unsigned char xdata buf[30];
   unsigned char len=0,lenx=0,bz=0,i=0;
         unsigned int addr_s=0;
           if(flagFrame==1)
                 {
                         flagFrame=0;   //定時器0檢測接收的數(shù)據(jù)
                         len = cntRxd; //讀取接收的字節(jié)數(shù)量
                         lenx = cntRxd; //讀取接收的字節(jié)數(shù)量
       cntRxd = 0;  //接收計數(shù)器清零
        //-----------調(diào)試-------------//                 
                         if(len==5)
                         {
                                 if(bufRxd[0]==0xAA && bufRxd[1]==0x00 && bufRxd[2]==0x00 && bufRxd[3]==0x00 && bufRxd[4]==0xBB)
                                 {
                                                 buf[0] = 0xAA;                       
                                                 buf[1] = num_mc/10000;
                                                 buf[2] = num_mc%10000/1000;//功能位
                                                 buf[3] = num_mc%1000/100;//收到
                                                 buf[4] = num_mc%100/10;//收到
                                                 buf[5] = num_mc%10;//收到       
                                                 buf[6] = 0xff;
                                                 buf[7] = length/10000;
                                                 buf[8] = length%10000/1000;//功能位
                                                 buf[9] = length%1000/100;//收到
                                                 buf[10] = length%100/10;//收到
                                                 buf[11] = length%10;//收到                               
                                                 buf[12] = 0xBB;
                                           len = 13;
                                                 UartWrite(buf, len);  //發(fā)送       
                                 }
                         }                         
                             for(bz=lenx;bz>0;bz--){bufRxd[bz] = 0;}         //把串口接收的數(shù)據(jù)緩存清零
                      lenx=0;len=0;
                 }


}
/********************************************************************
                            串口2接收
*********************************************************************/
void Uart2Driver(){//串口1接收
   unsigned char xdata buf[20];
   unsigned char len=0,lenx=0,bz=0,i=0;
       
           if(flagFrame2==1)
                 {
                         flagFrame2=0;   //定時器0檢測接收的數(shù)據(jù)
                         len = cnt2Rxd; //讀取接收的字節(jié)數(shù)量
                         lenx = cnt2Rxd; //讀取接收的字節(jié)數(shù)量
       cnt2Rxd = 0;  //接收計數(shù)器清零               
        //-----------調(diào)試-------------//               
                         if(len==5)
                         {
                                 if(buf2Rxd[0]==0xAA && buf2Rxd[1]==0x00 && buf2Rxd[2]==0x00 && buf2Rxd[3]==0x00 && buf2Rxd[4]==0xBB)
                                 {
                                                 buf[0] = 0xAA;
                                                 buf[1] = length/1000;//功能位
                                                 buf[2] = length%1000/100;//收到
                                           buf[3] = length%100/10;//收到
                                           buf[4] = length%10;//收到
                                           buf[5] = 0xff;
                                                 buf[6] = num_mc/1000;//功能位
                                                 buf[7] = num_mc%1000/100;//收到
                                           buf[8] = num_mc%100/10;//收到
                                           buf[9] = num_mc%10;//收到
                                                 buf[10] = 0xBB;                                                       
                                                 len = 11;
                                                 Uart2Write(buf, len);  //發(fā)送                                                 
                                 }
                         }
                         for(bz=lenx;bz>0;bz--){buf2Rxd[bz] = 0;}         //把串口接收的數(shù)據(jù)緩存清零
                      
                 }


}
/*******************************************************************************
* 函 數(shù) 名       : task_create
* 函數(shù)功能                          : 任務(wù)1
* 作用           : 串口監(jiān)控
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void task_UartRxMonitor (void) _task_ 1
{
       
        while(1)
        {
                os_wait2(K_IVL,1);
    UartRxMonitor(1);
                os_send_signal(2);               
        }
}
/*******************************************************************************
* 函 數(shù) 名       : task_create
* 函數(shù)功能                          : 任務(wù)2
* 作用           : 串口1接收
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void task_uart (void) _task_ 2
{
        unsigned char sig=0;
        unsigned int time=0;
        while(1)
        {
                sig=os_wait1(K_SIG);
                if(sig==SIG_EVENT)
                {
                        UartDriver();
                        Uart2Driver();
                }
        }
}








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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久无码国产精品一区 | 久久久久国产 | 欧美一级黄色片 | 一级黄色毛片a | 99精品99久久久久久宅男 | 久久国产精品久久久久久久久久 | 国际精品久久 | 国产精品免费视频一区 | 日韩人体在线 | 欧美日韩网站 | 91精品国产一区二区三区 | 亚洲精品一二区 | 巨大黑人极品videos精品 | 伊人av在线播放 | 亚洲精品免费在线观看 | 国产精品色哟哟网站 | 欧美黄色片 | 日韩精品免费视频 | 国产欧美视频一区二区三区 | 亚洲人成人网 | 久久亚洲国产 | 欧美区日韩区 | 久久久久久久夜 | 欧美视频三级 | 精品一区二区三区在线观看国产 | 欧美 日韩 国产 成人 在线 | 久久久精品 | 欧美日本在线观看 | 福利色导航 | 中文字幕视频网 | xxxxxx国产 | 国产午夜精品久久久久 | 国产精品毛片av一区 | 亚洲日韩第一页 | 91在线观看视频 | 久久久夜 | 日本高清视频在线播放 | 欧美一级特黄aaa大片在线观看 | 在线91| 精品久久久久久久 | 中文字幕在线中文 |