久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
CAN通訊MCP2515模塊 標準幀例程 STC15單片機
[打印本頁]
作者:
WFX777888
時間:
2024-4-9 07:08
標題:
CAN通訊MCP2515模塊 標準幀例程 STC15單片機
買的不會玩大家研究研究
怎樣能實現和車通訊
/*********************************************************************************/
/*注意:本例程是基于STC15系列最新增強型51單片機編寫,由于不同系列51單片機一些外設*/
/*功能配置存在差異,請親們在使用時對應進行修改。*/
/*********************************************************************************/
#include "STC15F2Kxx.h"
#include "MCP2515.H"
#define FOSC 11059200L //系統頻率
#define T1MS (65536-FOSC/1000) //定時器工作在1T模式下定時1ms的計數器值(寫入THx、TLx的值)
#define BAUD 9600 //串口1波特率
#define UART1_Rx_Buff_LEN 100 //串口1數據緩沖區數據長度
bit busy=0; //串口1發送數據忙標志位
unsigned char UART1_Rx_Buffer[UART1_Rx_Buff_LEN]; //串口1接收保存緩沖區
unsigned char Uart1_Delay=0; //串口1接收數據幀延時(ms),延時時間到當1幀數據接收完成
unsigned char Uart1_Write_Count=0; //寫串口1緩沖區指針
unsigned char Uart1_Read_Count=0; //讀串口1緩沖區指針
unsigned char Uart1_Finish=0; //當前一幀數據接收完成標志
unsigned char CAN_Flag=0; //CAN接收到數據標志
unsigned char CAN_R_Buffer[8]; //CAN接收數據保存緩沖區
/*******************************************************************************
* 函數名 : Timer0_Init
* 描述 : 定時器0初始化配置
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void Timer0_Init(void)
{
AUXR |= 0x80; //定時器0為1T模式
TMOD = 0x00; //設置定時器為模式0(16位自動重裝載)
TL0 = T1MS; //初始化計時值
TH0 = T1MS >> 8;
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
EA = 1; //使能總中斷
}
/*******************************************************************************
* 函數名 : Timer0_ISR
* 描述 : 定時器0中斷服務函數
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 本程序用于檢測1幀串口數據接收完成
*******************************************************************************/
void Timer0_ISR() interrupt 1 using 1
{
if(Uart1_Delay>0)
{
Uart1_Delay--;
if(Uart1_Delay==0)
{
//延時時間到再沒有接收到新的串口數據,表示1幀數據接收完成
if(Uart1_Write_Count != Uart1_Read_Count) Uart1_Finish=1;
}
}
}
/*******************************************************************************
* 函數名 : Exint1_Init
* 描述 : 外部中斷1初始化函數
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void Exint1_Init(void)
{
PX1=1; //設置外部中斷1的中斷優先級為高優先級
IT1 = 1; //設置INT1的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
EX1 = 1; //使能INT1中斷
EA = 1; //使能總中斷
}
/*******************************************************************************
* 函數名 : Exint1_ISR
* 描述 : 外部中斷1中斷服務函數
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 用于檢測MCP2515中斷引腳的中斷信號
*******************************************************************************/
void Exint1_ISR(void) interrupt 2 using 1
{
CAN_Flag=1;//CAN接收到數據標志
}
/*******************************************************************************
* 函數名 : UART1_Init_Config
* 描述 : UART1初始化配置
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void UART1_Init_Config(void)
{
P_SW1 &= 0x3f; //設置串口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)); //設置波特率重裝值的低8位
TH1 = (65536 - (FOSC/4/BAUD))>>8;//設置波特率重裝值的高8位
TR1 = 1; //啟動定時器1計數
ES = 1; //使能串口中斷
EA = 1; //使能總中斷
}
/*******************************************************************************
* 函數名 : UART1_Buffer_PntAdd
* 描述 : 讀、寫串口1緩沖區指針加1
* 輸入 : *pnt(指向串口1讀、寫串口1緩沖區指針)
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void UART1_Buffer_PntAdd(unsigned char *pnt)
{
*pnt+=1;
if(*pnt >= UART1_Rx_Buff_LEN) *pnt=0;
}
/*******************************************************************************
* 函數名 : UART1_ISR
* 描述 : UART1中斷服務函數
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void UART1_ISR(void) interrupt 4 using 1
{
unsigned char ch;
//接收數據
if(RI)
{
RI = 0;//清除RI位
ch=SBUF;
UART1_Rx_Buffer[Uart1_Write_Count]=ch; //將接收到的數據寫入緩沖區
UART1_Buffer_PntAdd(&Uart1_Write_Count);//寫串口1緩沖區指針加1
if(Uart1_Write_Count == Uart1_Read_Count)//如果讀、寫緩沖區指針重疊,則讀指針加1,這時將丟失1個字節數據
{
UART1_Buffer_PntAdd(&Uart1_Read_Count);//讀串口1緩沖區指針加1
}
Uart1_Delay = 20;//串口1接收數據幀延時(ms),延時時間到當1幀數據接收完成
}
//發送數據
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙標志(1忙,0空閑)
}
}
/*******************************************************************************
* 函數名 : UART1_SendData
* 描述 : UART1發送一個字節
* 輸入 : dat:待發送數據
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void UART1_SendData(unsigned char dat)
{
while (busy); //等待前面的數據發送完成
busy = 1; //串口1發送數據忙標志位(1忙,0空閑)
SBUF = dat; //寫數據到UART數據寄存器
}
/*******************************************************************************
* 函數名 : UART1_SendBuffer
* 描述 : UART1發送一個緩沖區數據
* 輸入 : *buff:待發送緩沖區首地址,len:待發送數據長度
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void UART1_SendBuffer(unsigned char *buff,unsigned int len)
{
unsigned int i=0;
if(len<=0) return;
do
{
UART1_SendData(buff[i++]);//發送當前字符
}while(i<len);
}
/*******************************************************************************
* 函數名 : CAN_Send_Dispose
* 描述 : CAN發送串口1接收到的數據處理函數
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
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接收緩沖區中未讀數據大于8個字節,則通過CAN總線發送8個字節數據(CAN發送一幀報文最大8個字節)
{
len = 8;
}
else if(Uart1_Finish == 1)//如果串口1接收緩沖區中未讀數據小于8個字節,且再也沒接收到串口的數據,則CAN發送剩余的數據
{
len = write-Uart1_Read_Count;
Uart1_Finish=0;//當前一幀數據接收完成標志
}
else return;//如果串口1接收緩沖區中未讀數據小于8個字節,且還在接收串口的數據則CAN先不發數據,等夠8個字節了再發
for(i=0;i<len;i++)
{
buff[ i] = UART1_Rx_Buffer[Uart1_Read_Count];//將串口接收緩沖區的數據復制到CAN發送臨時緩沖區buff[ i]
UART1_Buffer_PntAdd(&Uart1_Read_Count);//讀串口1緩沖區指針加1
}
CAN_Send_Buffer(buff,len);//CAN發送指定長度的數據
}
/*******************************************************************************
* 函數名 : main
* 描述 : 主函數,用戶程序從main函數開始運行
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void main(void)
{
Timer0_Init(); //定時器0初始化配置
UART1_Init_Config(); //UART1初始化配置
Exint1_Init(); //外部中斷1初始化函數
MCP2515_Init(); //MCP2515初始化配置
while(1)
{
if(Uart1_Write_Count != Uart1_Read_Count)//如果讀指針不等寫指針,則證明串口1接收到數據
{
CAN_Send_Dispose();//CAN發送串口1接收到的數據處理函數
}
else if(Uart1_Finish == 1) Uart1_Finish = 0;
while((CAN_Flag==1) || ((P3&0x08) == 0))
{
unsigned char len;
CAN_Flag=0;//CAN接收到數據標志
len = CAN_Receive_Buffer(CAN_R_Buffer);//CAN接收一幀數據
if(len != 0)
UART1_SendBuffer(CAN_R_Buffer,len);//UART1發送一個緩沖區數據
}
}
}
原理圖: 無
仿真: 無
代碼:
CAN通訊MCP2515模塊-標準幀例程(STC15).rar
(70.91 KB, 下載次數: 22)
2024-4-9 07:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
STC莊偉
時間:
2024-4-10 16:40
你這個不吱聲的 咋不用32G8K48,兩個can,才一塊多
作者:
wkman
時間:
2024-4-12 21:38
STC莊偉 發表于 2024-4-10 16:40
你這個不吱聲的 咋不用32G8K48,兩個can,才一塊多
是啊 MCP2515 光芯片就賣5~25元,簡直殺豬價
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
av黄色在线
|
国产精品永久在线观看
|
国产精品久久久久久久久久久免费看
|
久久网一区二区三区
|
欧美伊人影院
|
激情欧美日韩一区二区
|
黄色小视频入口
|
欧美精品三区
|
黄色一级视频
|
午夜精品一区二区三区三上悠亚
|
激情三区
|
国产一区二区三区亚洲
|
国内精品免费久久久久软件老师
|
亚洲综合日韩精品欧美综合区
|
pacopacomama在线
|
91热在线
|
日韩手机在线看片
|
亚洲精品日韩在线观看
|
国产精品久久久亚洲
|
成人污污视频
|
女生羞羞网站
|
亚洲三级在线观看
|
欧美日韩综合
|
亚洲高清在线观看
|
日韩在线电影
|
欧美11一13sex性hd
|
毛片大全
|
九九成人
|
婷婷久久综合
|
久久99精品久久久久久琪琪
|
日本三级视频
|
一级毛片在线播放
|
caoporn国产精品免费公开
|
99reav
|
国产精品99久久久久久宅男
|
网址黄
|
亚洲国产成人精品女人久久久
|
黄色电影在线免费观看
|
操网站
|
色狠狠一区
|
成人亚洲片
|