一、理论部分
串口重定向串讲4
1.通讯的分类
①并行通信
②串行通信
③同步方式
④异步方式
⑤单工
⑥半双工
⑦全双工
2.SCON:串行控制寄存器(可位寻址)
①方式1
②具体配置(软件生成
3.PCON:电源控制寄存器(不可位寻址)
①波特率选择器
4.SBUF:串口数据缓存寄存器(0x99)
①串行发送/接收 : ②数据发送/接收:
发送:向SBUF写入 发送:TI=1
接收:读SBUF的数据 接收:RI=1
5.IE:中断允许寄存器(可位寻址)
6.串口编写步骤
①初始化函数
②中断服务函数(串口1中断号为4)
③字节发送函数
二、代码实现
1.串口初始化函数设置
定时器0:计时、数码管显示
定时器1:超声波、ne55
定时器2:串口
2.串口初始化函数
3.字节发送函数
EA:CPU的总中断允许控制位
ES:串行口中断允许位
4.字符串发送函数(搭载字节发送函数)
5.串口1中断服务函数(interrupt 4)
三、代码编写
1.接收指令Uart_Send_String()在按键里实现
①程序上写,接收区显示
中文显示问题
s
/* Main */
void main()
{
System_Init();
Timer0Init();
UartInit();
Uart_Send_String("鲨鱼");
while (1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
Uart_Proc();
}
}
②sprintf函数
③接收温度,显示温度
unsigned char Uart_Send[10];//串口接收数据储存数组
float t;
/* 键盘处理函数 */
void Key_Proc()
{
if(Key_Slow_Down) return;
Key_Slow_Down = 1;//键盘减速程序
Key_Val = Key_Read();//实时读取键码值
Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿
Key_Old = Key_Val;//辅助扫描变量
switch(Key_Down)
{
case 4:
sprintf(Uart_Send,"T = %.2f\r\n",t);
Uart_Send_String(Uart_Send);
break;
}
}
/* 信息处理函数 */
void Seg_Proc()
{
if(Seg_Slow_Down) return;
Seg_Slow_Down = 1;//数码管减速程序
t = rd_temperature();
}
2.发送指令(控制类)dat = Uart_Recv[];在Uart_Proc()里实现
:把指令解析出来然后在逻辑里去运用起来
①在发送区写数字,在数码管上显示
unsigned char dat;
unsigned char Uart_Recv[10];//串口接收数据储存数组 默认10个字节 若接收数据较长 可更改最大字节数
unsigned char Uart_Recv_Index;//串口接收数组指针
unsigned char Uart_Slow_Down;//串口减速专用变量
/* 串口处理函数 */
void Uart_Proc()
{
if(Uart_Slow_Down) return;
Uart_Slow_Down = 1;//串口减速程序
if(Uart_Recv_Index == 1)
{
dat = Uart_Recv[0];//把接收数组储存到dat里
Uart_Recv_Index = 0;//读完之后把指针复位
}
}
/* 信息处理函数 */
void Seg_Proc()
{
if(Seg_Slow_Down) return;
Seg_Slow_Down = 1;//数码管减速程序
Seg_Buf[0] = dat / 10;
Seg_Buf[1] = dat % 10;
}
②在发送区输入Led_=_,板子上实现相应功能
unsigned char dat;
unsigned char Uart_Recv[10];//串口接收数据储存数组 默认10个字节 若接收数据较长 可更改最大字节数
unsigned char Uart_Recv_Index;//串口接收数组指针
unsigned char Uart_Slow_Down;//串口减速专用变量
/* 串口处理函数 */
void Uart_Proc()
{
if(Uart_Slow_Down) return;
Uart_Slow_Down = 1;//串口减速程序
/*LED_=_ 6个*/
if(Uart_Recv_Index == 6)
{
if(Uart_Recv[0] == 'L' && Uart_Recv[1] == 'e' && Uart_Recv[2] == 'd' && Uart_Recv[4] == '=')
ucLed[Uart_Recv[3] - 48] = Uart_Recv[5] - 48;
Uart_Recv_Index = 0;
}
}