標題:
汽車總線sent協(xié)議轉RS232輸出單片機源程序
[打印本頁]
作者:
ruxiangjian
時間:
2017-6-24 13:35
標題:
汽車總線sent協(xié)議轉RS232輸出單片機源程序
將汽車總線sent協(xié)議內容通過RS232方式輸出。程序使用C8051F340芯片。
單片機源程序如下:
//串口通迅實驗,將該程序的HEX下載到開發(fā)板,用串口調試助手軟件波特率設為9600
//發(fā)送任意一個字符,單片機返回該字符的ASII碼
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f340.h> // SFR declarations
#include <stdio.h>
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // SYSCLK frequency in Hz
#define BAUDRATE 9600 // Baud rate of UART in bps
sbit led1=P2^2;
sbit led2=P2^3;
sbit P20=P2^0;
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void UART0_Init (void);
void PORT_Init (void);
void Timer0_Init (int);
void Ext_Interrupt_Init (void);
void INT1_ISR (void);
void Timer0_init (void);
unsigned int data count,tick,tickTemp,i,type;
unsigned int data dataR[20] ;
unsigned short data Sent=0,i;
bit data flagR,flag2,flagp01;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
flag2=0;
PORT_Init(); // Initialize Port I/O
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
SYSCLK_Init (); // Initialize Oscillator
Ext_Interrupt_Init(); // enable)
led1=1;
led2=0;
UART0_Init();
Timer0_init();
EA=1;
while (1)
{
if(flag2||P20==0)
{
EA=0;
printf("angle= %f\n",(dataR[1]*256+dataR[2]*16+dataR[3])*283.0/4095);
led2=~led2;
Sent=0;
type=0;
flag2=0;
EA=1;
}
}
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// P0.4 digital push-pull UART TX
// P0.5 digital open-drain UART RX
//
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
P0MDIN &=~0xc0 ;
P0MDOUT |= 0x10; // Enable UTX as push-pull output
XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX)
XBR1 = 0x40; // Enable crossbar and weak pull-ups
P2MDOUT |= 0x0c;
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This routine initializes the system clock to use the internal oscillator
// at its maximum frequency.
// Also enables the Missing Clock Detector.
//-----------------------------------------------------------------------------
void SYSCLK_Init (void) //初始化系統(tǒng)時鐘
{
//int i=0;
unsigned short data dly=0,dlyb=12;
//------------------------------------
//使能外部振蕩器
OSCXCN |=0X67; //0110 0111
dlyb=22;
do {
dly=120;
while(dly--);
}while(dlyb--);
//等待1毫秒
do{
dly=100;
while(dly--);
}while((OSCXCN&0X80)!=0X80);
//查詢XTLVLD =>1。
dly=100;
while(dly--);
CLKSEL |=0X01;
// OSCICN = 0x00;
}
void Timer0_init (void)
{
CKCON |=0X04;
TL0 = TH0=190; // Init Timer1
TMOD &= ~0x0f; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x02;
TR0 = 1; // START Timer1
ET0=1;
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
//TH1 = 256-(SYSCLK/BAUDRATE/2/12);
TH1=256-96;
// CKCON &=~0x0c;
// CKCON |= 0x00; // T1M = 1; SCA1:0 = 00
TL1 = TH1; // Init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}
void Ext_Interrupt_Init (void)
{
TCON |= 0x05; // /INT 0 and /INT 1 are edge triggered
IT01CF = 0x10; // /INT0 active low; /INT0 on P0.0;
// /INT1 active low; /INT1 on P0.1
EX0 = 1; // Enable /INT0 interrupts
EX1 = 1; // Enable /INT1 interrupts
}
void INT1_ISR (void) interrupt 2
{
//同步計時器
TR0 = 0;
TL0 = TH0=191;
TR0 = 1; // START Timer1
//
if(tick>=34) tick=0;
//flagp01=P0^1;
tickTemp=tick;
tick=0;
if(flagR&&(Sent<=9)&&(tickTemp>=11)&&(tickTemp<=28))
{
dataR[Sent]=tickTemp-11;
Sent++;
}
if(flagR&&(Sent>=8))
{
Sent=0;
flagR=0;
flag2=1;
}
// if((tickTemp<10)||(tickTemp>28))
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
Sent協(xié)議轉RS232.rar
(40.53 KB, 下載次數: 79)
2017-6-24 13:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
xljxjh
時間:
2018-12-20 15:37
剛好要用到,學習下!
作者:
彼岸思晴
時間:
2019-5-7 13:34
支持
作者:
wisdomlau
時間:
2019-8-15 22:44
支持一下,不知道有沒有參考價值
作者:
wwbiu
時間:
2020-11-24 10:53
tick=0; // ? tick 不是恒定 3us 或 3.3us , 為什么要清0?
作者:
wwbiu
時間:
2020-11-24 14:38
本帖最后由 wwbiu 于 2020-11-24 15:45 編輯
幫看一下,我要抓到SENT信號的8個數據,其中6個用來解碼,怎么改?
if(INT2IF) //下降沿中斷,每個節(jié)拍計數 1/16us
{
SENT.table[0]=TMR3L; // 抓到的數值
SENT.table[1]=TMR3H; //SENT:168us=2688個計數 <- 同步較準信號
TMR3H=0; // 36us =576 個計數 <- 0
TMR3L=0; // 81us =1296個計數 <- 15
if(SENT.x>2500){SENT_flag=1;SENT_CNT=0;} //同步較準信號到來后,設定標記
if((SENT_flag==1)&&(SENT_CNT<9)&&(SENT.x>500)&&(SENT.x<1350)) //濾波
{
SENT_CNT++;
SENT_data[SENT_CNT]=SENT.x; //保存抓取到的8個數字信號
if(SENT_CNT>=9)
{
SENT_CNT=0; SENT_flag=2;
}
}
if(SENT_flag=2) //解碼,
{
tps1=((SENT_data[1]&0x0F)*256)+((SENT_data[2]&0x0F)*16)+(SENT_data[3]&0x0F); tps2=((SENT_data[6]&0x0F)*256)+((SENT_data[5]&0x0F)*16)+(SENT_data[4]&0x0F);
SENT_flag=0; //從頭開始
}
INT2IF=0;
TMR3IF=0;
}
if(TMR3IF)TMR3IF=0;
作者:
rock00210
時間:
2022-5-12 09:09
STC89C52單片機可以解析嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1