最近想實現一個功能,就是在串口助手上發送05 0B D5 C5 C8 FD這一串指令,使其在液晶上顯示張三兩字,05代表了數據長度 就是說后面還跟上5個數據;0B是命令字,能夠控制液晶上顯示不同的命令;D5 C5 C8 FD是取字模可以得到張三這個名字。但是我用串口1是可以實現這個功能的,我想改成串口2就不行了,出現錯誤;想讓大神們幫忙看看。(串口1的代碼與這個相似,我只不過把串口初始化函數和串口中斷接收函數變化了,本質沒變)
串口2的實現代碼:
#include "STC15Fxxxx.h"
#include "INTRINS.H"
#include "stdio.h"
#include "string.h"
#include "COGDriver.h"
#include "font.h"
#include "W25Qxx.h"
#define uchar unsigned char
#define OSC_FREQ 11059200L //晶振是11.0592
#define BAUD_115200 115200 //串口波特率
#define S2REN 0x10 //S2CON.5
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define delay 1 //定義延時時間
#define CALL_isr_UART() TI = 1
#define FALSE 0
#define TRUE 1
sbit SPEAKER = P1^3;
unsigned int counter=0;
unsigned long faddress=0;
//unsigned char tishi=0;
unsigned char xdata tempBuffer[255],RevBuffer[255];
bit CmdValid,flagg=0;
void Delay(int num);
void Delaylong(unsigned int t);
void Delaylong(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++);
}
}
// 串口初始化函數
void Uart2Init(void)
{
S2CON = 0x50; //8位數據,可變波特率
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE8; //設定定時初值
T2H = 0xFF; //設定定時初值
AUXR |= 0x10; //啟動定時器2
IE2 |= 0x01; //使能串口2中斷
S2CON |= S2REN; //允許串行口2接收
}
/*************接收和發送中斷**********************************************/
void isr_UART2(void) interrupt 8 //using 0
{
unsigned int j=0;
int len,i;
if(S2CON & S2RI)
{
len=(int)S2BUF;
S2CON &=~S2RI;
for(i=0;i<len;i++)
{
while(!S2CON & S2RI)
{
j++;
if(j>10000)
{
break;
}
}
if(j<10000)
{
RevBuffer[i]=S2BUF;
S2CON &= ~S2RI;
j=0;
}
else
{
break;
}
}
if(i==len)
{
S2CON |= S2REN;
CmdValid=1;
}
}
else
if(S2CON & S2TI)
{
S2CON &= ~S2TI;
len=RevBuffer[0];
for(i=0;i<len+1;i++) //注意:此處只發送了一個命令字節,原來是for(i=0;i<len+1;i++)
{
S2BUF=RevBuffer[i];
while(!S2CON & S2TI);
S2CON &= ~S2TI;
}
S2CON |= S2REN;
}
}
//執行下載操作
/*****************************/
void cmd_execution(void)
{
unsigned char cmd,i;
cmd = RevBuffer[0];
switch(cmd)
{
case 0x0B:
LCD_Clr();//清除
// Print(2,48,kaiti,&RevBuffer[1]);
Print(4,32,kaiti,"連接成功!");
CALL_isr_UART();
break;
case 0xFC:
LCD_Clr();//清屏
Print(2,40,kaiti,&RevBuffer[1]);
Print(4,16,kaiti,"該卡未注冊!");
CALL_isr_UART() ;
break;
case 0xFA:
LCD_Clr();//清屏
Print(2,40,kaiti,&RevBuffer[1]);
Print(4,16,kaiti,"該卡已掛失!");
CALL_isr_UART() ;
break;
case 0xFE:
LCD_Clr();//清屏
Print(2,48,kaiti,&RevBuffer[1]);
Print(4,32,kaiti,"簽到成功!");
CALL_isr_UART() ;
break;
case 0xFD:
LCD_Clr();//清屏
Print(2,40,kaiti,&RevBuffer[1]);
Print(4,16,kaiti,"今天已簽到!");
CALL_isr_UART() ;
break;
case 0xFF:
LCD_Clr();//清屏
Print(2,40,kaiti,&RevBuffer[1]);
Print(4,16,kaiti,"服務器斷開!");
CALL_isr_UART() ;
break;
}
}
void PortInit()
{
P0M1 =0X00;
P0M0 =0X00;
P1M1 =0X00;
P1M0 =0X00;////P1.2、P1.3強驅動模式,P1.2繼電器,P1.3蜂鳴器
P2M1 =0X00;
P2M0 =0X00;
P3M1 =0X00;
P3M0 =0X00;
P4M1 =0X00;
P4M0 =0X00;
P5M1 =0X00;
P5M0 =0X00;
}
/*******************************************************************************/
void main(void) //主函數
{
Delaylong(500);
AUXR =0x00;
PortInit();
Uart2Init();
S2BUF=0Xaa; //送入緩沖區
while(!(S2CON & S2TI)); //等待發送完畢
S2CON &= ~S2TI;
COG_Initialize(); //設置液晶顯示器
LCD_Clr(); //清屏
Delaylong(65500);
LCD_Clr();
// for(i=0;i<257;i++)
// {
// RevBuffer[i]=0;
// }
Delaylong(50);
Print(2,32,kaiti,"歡迎使用");
Print(0,11,kaiti,"502嵌入實驗室");
Print(4,32,kaiti,"簽到系統");
Print(6,16,kaiti,"祝你學業有成");
counter=0;
faddress=0;
EA =1;
while(1)
{
if (CmdValid)
{
CmdValid = FALSE;
cmd_execution();
S2CON |= S2REN;
}
}
}
|