最近想实现一个功能,就是在串口助手上发送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;
}
}
}
|