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

標(biāo)題: CAN通訊MCP2515模塊 標(biāo)準(zhǔn)幀例程 STC15單片機(jī) [打印本頁]

作者: WFX777888    時間: 2024-4-9 07:08
標(biāo)題: CAN通訊MCP2515模塊 標(biāo)準(zhǔn)幀例程 STC15單片機(jī)
買的不會玩大家研究研究
怎樣能實現(xiàn)和車通訊
/*********************************************************************************/
/*注意:本例程是基于STC15系列最新增強(qiáng)型51單片機(jī)編寫,由于不同系列51單片機(jī)一些外設(shè)*/
/*功能配置存在差異,請親們在使用時對應(yīng)進(jìn)行修改。*/
/*********************************************************************************/


#include "STC15F2Kxx.h"
#include "MCP2515.H"


#define FOSC 11059200L                        //系統(tǒng)頻率
#define T1MS (65536-FOSC/1000)        //定時器工作在1T模式下定時1ms的計數(shù)器值(寫入THx、TLx的值)
#define BAUD 9600                                //串口1波特率
#define UART1_Rx_Buff_LEN 100        //串口1數(shù)據(jù)緩沖區(qū)數(shù)據(jù)長度


bit busy=0;                                                                                        //串口1發(fā)送數(shù)據(jù)忙標(biāo)志位
unsigned char UART1_Rx_Buffer[UART1_Rx_Buff_LEN];        //串口1接收保存緩沖區(qū)
unsigned char Uart1_Delay=0;                                                //串口1接收數(shù)據(jù)幀延時(ms),延時時間到當(dāng)1幀數(shù)據(jù)接收完成
unsigned char Uart1_Write_Count=0;                                        //寫串口1緩沖區(qū)指針
unsigned char Uart1_Read_Count=0;                                        //讀串口1緩沖區(qū)指針
unsigned char Uart1_Finish=0;                                                //當(dāng)前一幀數(shù)據(jù)接收完成標(biāo)志


unsigned char CAN_Flag=0;                                                        //CAN接收到數(shù)據(jù)標(biāo)志
unsigned char CAN_R_Buffer[8];                                                //CAN接收數(shù)據(jù)保存緩沖區(qū)


/*******************************************************************************
* 函數(shù)名  : Timer0_Init
* 描述    : 定時器0初始化配置
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void Timer0_Init(void)
{
    AUXR |= 0x80;                //定時器0為1T模式
    TMOD = 0x00;                //設(shè)置定時器為模式0(16位自動重裝載)
    TL0 = T1MS;                        //初始化計時值
    TH0 = T1MS >> 8;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷
    EA = 1;                                //使能總中斷                                                        
}


/*******************************************************************************
* 函數(shù)名  : Timer0_ISR
* 描述    : 定時器0中斷服務(wù)函數(shù)
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 本程序用于檢測1幀串口數(shù)據(jù)接收完成
*******************************************************************************/
void Timer0_ISR() interrupt 1 using 1
{
        if(Uart1_Delay>0)
        {
                Uart1_Delay--;
                if(Uart1_Delay==0)
                {
                        //延時時間到再沒有接收到新的串口數(shù)據(jù),表示1幀數(shù)據(jù)接收完成
                        if(Uart1_Write_Count != Uart1_Read_Count) Uart1_Finish=1;
                }
        }
}


/*******************************************************************************
* 函數(shù)名  : Exint1_Init
* 描述    : 外部中斷1初始化函數(shù)
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void Exint1_Init(void)
{
    PX1=1;                //設(shè)置外部中斷1的中斷優(yōu)先級為高優(yōu)先級
    IT1 = 1;        //設(shè)置INT1的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
    EX1 = 1;        //使能INT1中斷
    EA = 1;         //使能總中斷
}




/*******************************************************************************
* 函數(shù)名  : Exint1_ISR
* 描述    : 外部中斷1中斷服務(wù)函數(shù)
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 用于檢測MCP2515中斷引腳的中斷信號
*******************************************************************************/
void Exint1_ISR(void) interrupt 2 using 1
{
        CAN_Flag=1;//CAN接收到數(shù)據(jù)標(biāo)志
}


/*******************************************************************************
* 函數(shù)名  : UART1_Init_Config
* 描述    : UART1初始化配置
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void UART1_Init_Config(void)
{
    P_SW1 &= 0x3f;                                        //設(shè)置串口1在(P3.0/RxD, P3.1/TxD)
    SCON = 0x50;                                        //8位UART,可變波特率,允許串行接收
        AUXR &= 0xfe;                                        //定時器1為1T模式        
    AUXR |= 0x40;                                        //定時器1為1T模式
        TMOD &= 0xF0;                                        //定時器1為模式0(16位自動重載)
    TL1 = (65536 - (FOSC/4/BAUD));        //設(shè)置波特率重裝值的低8位
    TH1 = (65536 - (FOSC/4/BAUD))>>8;//設(shè)置波特率重裝值的高8位
    TR1 = 1;                                                //啟動定時器1計數(shù)
    ES = 1;                                                        //使能串口中斷
    EA = 1;                                                        //使能總中斷
}


/*******************************************************************************
* 函數(shù)名  : UART1_Buffer_PntAdd
* 描述    : 讀、寫串口1緩沖區(qū)指針加1
* 輸入    : *pnt(指向串口1讀、寫串口1緩沖區(qū)指針)
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void UART1_Buffer_PntAdd(unsigned char *pnt)
{
        *pnt+=1;
        if(*pnt >= UART1_Rx_Buff_LEN) *pnt=0;
}


/*******************************************************************************
* 函數(shù)名  : UART1_ISR
* 描述    : UART1中斷服務(wù)函數(shù)
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void UART1_ISR(void) interrupt 4 using 1
{
        unsigned char ch;
        //接收數(shù)據(jù)
        if(RI)
        {
                RI = 0;//清除RI位
                ch=SBUF;
                UART1_Rx_Buffer[Uart1_Write_Count]=ch;        //將接收到的數(shù)據(jù)寫入緩沖區(qū)
                UART1_Buffer_PntAdd(&Uart1_Write_Count);//寫串口1緩沖區(qū)指針加1                        
                if(Uart1_Write_Count == Uart1_Read_Count)//如果讀、寫緩沖區(qū)指針重疊,則讀指針加1,這時將丟失1個字節(jié)數(shù)據(jù)
                {
                        UART1_Buffer_PntAdd(&Uart1_Read_Count);//讀串口1緩沖區(qū)指針加1
                }
                Uart1_Delay = 20;//串口1接收數(shù)據(jù)幀延時(ms),延時時間到當(dāng)1幀數(shù)據(jù)接收完成
        }
        //發(fā)送數(shù)據(jù)
        if (TI)                        
        {
                TI = 0;                //清除TI位
                busy = 0;        //清忙標(biāo)志(1忙,0空閑)
        }
}


/*******************************************************************************
* 函數(shù)名  : UART1_SendData
* 描述    : UART1發(fā)送一個字節(jié)
* 輸入    : dat:待發(fā)送數(shù)據(jù)
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void UART1_SendData(unsigned char dat)
{
    while (busy);        //等待前面的數(shù)據(jù)發(fā)送完成
    busy = 1;                //串口1發(fā)送數(shù)據(jù)忙標(biāo)志位(1忙,0空閑)
    SBUF = dat;                //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}


/*******************************************************************************
* 函數(shù)名  : UART1_SendBuffer
* 描述    : UART1發(fā)送一個緩沖區(qū)數(shù)據(jù)
* 輸入    : *buff:待發(fā)送緩沖區(qū)首地址,len:待發(fā)送數(shù)據(jù)長度
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void UART1_SendBuffer(unsigned char *buff,unsigned int len)
{
        unsigned int i=0;


        if(len<=0) return;


        do
        {
                UART1_SendData(buff[i++]);//發(fā)送當(dāng)前字符
        }while(i<len);
}


/*******************************************************************************
* 函數(shù)名  : CAN_Send_Dispose
* 描述    : CAN發(fā)送串口1接收到的數(shù)據(jù)處理函數(shù)
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void CAN_Send_Dispose(void)
{
        unsigned char i=0,len=0,write=0,buff[8];
        
        write = Uart1_Write_Count;
        if(Uart1_Write_Count<Uart1_Read_Count) write+=UART1_Rx_Buff_LEN;
        
        if((write-Uart1_Read_Count) >= 8)//如果串口1接收緩沖區(qū)中未讀數(shù)據(jù)大于8個字節(jié),則通過CAN總線發(fā)送8個字節(jié)數(shù)據(jù)(CAN發(fā)送一幀報文最大8個字節(jié))
        {                        
                len = 8;                                                        
        }
        else if(Uart1_Finish == 1)//如果串口1接收緩沖區(qū)中未讀數(shù)據(jù)小于8個字節(jié),且再也沒接收到串口的數(shù)據(jù),則CAN發(fā)送剩余的數(shù)據(jù)
        {
                len = write-Uart1_Read_Count;
                Uart1_Finish=0;//當(dāng)前一幀數(shù)據(jù)接收完成標(biāo)志                        
        }
        else return;//如果串口1接收緩沖區(qū)中未讀數(shù)據(jù)小于8個字節(jié),且還在接收串口的數(shù)據(jù)則CAN先不發(fā)數(shù)據(jù),等夠8個字節(jié)了再發(fā)


        for(i=0;i<len;i++)
        {
                buff[ i] = UART1_Rx_Buffer[Uart1_Read_Count];//將串口接收緩沖區(qū)的數(shù)據(jù)復(fù)制到CAN發(fā)送臨時緩沖區(qū)buff[ i]
                UART1_Buffer_PntAdd(&Uart1_Read_Count);//讀串口1緩沖區(qū)指針加1
        }        
        CAN_Send_Buffer(buff,len);//CAN發(fā)送指定長度的數(shù)據(jù)
}


/*******************************************************************************
* 函數(shù)名  : main
* 描述    : 主函數(shù),用戶程序從main函數(shù)開始運(yùn)行
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 無
*******************************************************************************/
void main(void)
{
        Timer0_Init();                        //定時器0初始化配置
        UART1_Init_Config();        //UART1初始化配置
        Exint1_Init();                        //外部中斷1初始化函數(shù)
        MCP2515_Init();                        //MCP2515初始化配置
                                
        while(1)
        {
                if(Uart1_Write_Count != Uart1_Read_Count)//如果讀指針不等寫指針,則證明串口1接收到數(shù)據(jù)
                {
                        CAN_Send_Dispose();//CAN發(fā)送串口1接收到的數(shù)據(jù)處理函數(shù)
                }
                else if(Uart1_Finish == 1) Uart1_Finish = 0;
               
                while((CAN_Flag==1) || ((P3&0x08) == 0))        
                {
                        unsigned char len;
                        
                        CAN_Flag=0;//CAN接收到數(shù)據(jù)標(biāo)志        
                        len = CAN_Receive_Buffer(CAN_R_Buffer);//CAN接收一幀數(shù)據(jù)
                        if(len != 0)                                       
                        UART1_SendBuffer(CAN_R_Buffer,len);//UART1發(fā)送一個緩沖區(qū)數(shù)據(jù)
                }        
        }
}


原理圖: 無
仿真: 無
代碼: CAN通訊MCP2515模塊-標(biāo)準(zhǔn)幀例程(STC15).rar (70.91 KB, 下載次數(shù): 22)

作者: STC莊偉    時間: 2024-4-10 16:40
你這個不吱聲的  咋不用32G8K48,兩個can,才一塊多
作者: wkman    時間: 2024-4-12 21:38
STC莊偉 發(fā)表于 2024-4-10 16:40
你這個不吱聲的  咋不用32G8K48,兩個can,才一塊多

是啊   MCP2515 光芯片就賣5~25元,簡直殺豬價  




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩一区中文字幕 | 午夜小视频在线观看 | av片免费看 | 欧美网站在线观看 | 精品久久免费视频 | 91福利视频导航 | 国产黄色在线观看 | 精品在线看 | 成人欧美日韩 | 在线视频黄 | 二区三区在线观看 | 欧美精品成人 | 午夜久久久久久 | 中文字幕一区二区三区视频 | 一级特黄妇女高潮 | 黄色性视频 | 国产精品理论片 | 一级黄色片免费观看 | 男人的天堂在线视频 | 8x8ⅹ国产精品一区二区 | 在线黄网| 久久久久久久久久国产 | 亚洲高清免费视频 | 欧美成人黄色 | 欧美性猛交xxxx乱大交退制版 | 成人在线免费视频观看 | 在线播放中文字幕 | 国产精品久久一区二区三区 | 黄色综合| 999久久久精品 | 成年网站在线观看 | 欧美久久久 | 国产精品一区二区三区四区 | 日本熟妇毛耸耸xxxxxx | 日韩精品综合 | 四虎www| 日韩精品视频免费在线观看 | 一级做a爰片久久毛片潮喷 视频一二区 | 国产精品毛片一区二区在线看 | 超碰免费观看 | 一区二区在线视频 |