?? lin_send.c
字號:
sbit SLNP = P1^3; //定義控制睡眠模式的引腳
l_u8 BreakReceived=0;
l_u8 USART_DataReceived=0;
l_u8 WaitReceived=0;
l_u8 DataTemp;
//extern l_u8 PID = 0xF0;
void l_sys_init(void) //系51單片機統(tǒng)初始化函數(shù)
{
l_u8 i;
init_LCD(); //初始化液晶顯示
clear_LCD();//清屏
//INT1 引腳的配置
PX1=0; //優(yōu)先級置0
IT1=1; //下降沿觸發(fā)
//T0定時/計數(shù)器配置
TMOD=TMOD|0X01; //設置T0為16位定時器 ,工作在方式1模式
PT0=0X01;//優(yōu)先級置1,表示優(yōu)先級最高
//T1定時/計數(shù)器配置 :
TMOD=TMOD|0X20; //設置T1為8位之裝載定時器,工作在方式2模式
TH1=0xFA; //設置T1的值,使波特率為4800Baud
//COM
PCON=0X00;
//********TJA1020模式設置*******
//TJA1020有4種模式 分別為睡眠模式,準備模式,普通斜率模式,低斜率模式
TH0=-25000/256;//延時25ms //將TH0設為0x9F
TL0=-25000%256; //將TL0設為0x58
TR0=1;//啟動定時器0
do
{
TXD=1;
RXD=1;
SLNP=0; //sbit SLNP=P1^3; 單片機和TJA1020收發(fā)器一上電進入睡眠模式
i=200;
while(i--);//延時
SLNP=1; //把TJA1020模式設置成普通斜率模式
i=200;
while(i--); //延時
}
while(TXD==0&&TF0==0); // 如果設置成功 則 TXD=1
TR0=0;//關閉T0定時/計數(shù)器 定時
if(TF0==1)//超過25ms返回 表示設置模式失敗
{
TF0=0;
//return(1);
}
TF0=0;
EA=1;//開總中斷標志
}
void l_send_break(void) //發(fā)送同步間隔函數(shù)
{
PCON=0x00;//SMODE置0
TH1=0xF4;//將波特率設為正常數(shù)據(jù)傳輸速率的一般,為了保證發(fā)同步間隔時保持至少13個顯示電平(低電平)
TL1=TH1;
TR1=1;
SCON=0X40;//方式1,不允許接受
SBUF=0X80; //二進制為1000 0000,先發(fā)低位,再發(fā)高位,這里發(fā)送同步間隔場,
//同步間隔場要求先顯形電平(低電平),后隱性電平(高電平)
while(TI==0);
TI=0;
BreakReceived=1;
TR1=1;
SCON=0X50;//串口模式工作在方式1,許接受數(shù)據(jù)
}
void delay(l_u16 tm) //延時函數(shù)
{
while(tm--);
}
void l_send_bytes (l_u8 bytes)//發(fā)送字節(jié) 用來發(fā)同步場
{
PCON=0x00;//SMODE置0
TL1=TH1=0xFA; //設置T1的值,使波特率為4800Baud
TR1=1;
SCON=0X50;//串口模式工作在方式1 允許接收數(shù)據(jù)
SBUF=bytes;//將數(shù)據(jù)放到SBUF上準備發(fā)送
while(TI==0);
TI=0;
USART_DataReceived=1;
TR1=0;
}
l_u8 checksum8(l_u8 *chk8,l_u8 num) //求校驗和,即數(shù)據(jù)場所有字節(jié)的和的反碼
{ //*chk8是要加的字節(jié),num是字節(jié)個數(shù))
l_u8 temp=0;//存放所有字節(jié)的和
for( ;num>0;num--)
{
temp=temp+*chk8;
chk8++;
} //求到所有字節(jié)的和
return(0xff-temp);//求字節(jié)何的反碼并返回
}
void l_send_data(l_u8 * temp,l_u8 num) //發(fā)送數(shù)據(jù)場和校驗和,*temp是存放數(shù)據(jù)的數(shù)組,num數(shù)據(jù)的個數(shù)
{
l_u8 l_chksum,m;//l_chksumw是發(fā)送字節(jié)的個數(shù) ,m是用來暫時存放校驗和的
TL1=TH1;//TH1=FA,波特率為4800Baud
SCON=0X50;
TR1=1;
for(l_chksum=0;l_chksum<num;l_chksum++) //連續(xù)發(fā)送8個數(shù)據(jù),并顯示發(fā)送的數(shù)據(jù)
{
SBUF=*temp;
while(TI==0);
TI=0;
USART_DataReceived=1;
if(l_chksum==4) gotoxy(2,0); //發(fā)送完4個后 顯示換行
display_LCD_number(*temp); //顯示發(fā)送的數(shù)據(jù)
display_LCD_string(" "); //每發(fā)一個數(shù)據(jù)用一個空格隔開
temp++;
}
temp=temp-num;//再指向首地址
m=checksum8(temp,num); //求這個8個數(shù)據(jù)的校驗和
SBUF=m; // 發(fā)送校驗和
while(TI==0);
TI=0;
USART_DataReceived=1;
display_LCD_string(" <S>");
USART_DataReceived=1;
}
static void RevHeader(void) interrupt 4 //接收串口中斷函數(shù)
{
ES=0;//關串口中斷
if(RI==1)//如果RI=1,表示接收完畢
{ RI=0;
DataTemp=SBUF;//將SBUF的數(shù)據(jù)放到DateTemp里 為存到receive_data[n]里作準備
WaitReceived=1;
}
ES=1;//開串口中斷
return; //中斷返回
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -