如贴下大佬所说,UART通信需要用串口板转接,直接用数据线,只能是走USB-HID。于是参考芯片手册,将串口1引脚转到了3.6,3.7.实现了UART单片机和电脑直接的通信。代码如下:
main.c
#include "ai8051u.h" // 调用头文件
#include "stdio.h"
#include "intrins.h"
#include "UART.h"
unsigned char srcc = 1;
void Delay100ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 599998UL;
while (i) i--;
}
/******************** 主函数 **************************/
void main(void)
{
WTST = 0; // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; // 扩展寄存器(XFR)访问使能
CKCON = 0; // 提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00; // 设置所有IO口为准双向口
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
Uart1_Init();
while (1)
{
P40 = 0;
P00 = 0;
P01 = 0;
P02 = 0;
// UART_SendByte(srcc);
// Delay100ms();
// srcc++;
}
}
void Uart1_Isr(void) interrupt 4
{
if (TI) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
}
if (RI) //检测串口1接收中断
{
srcc = SBUF;
UART_SendByte(SBUF);
RI = 0; //清除串口1接收中断请求位
}
}
UART.c
#include "ai8051u.h"
void Uart1_Init(void) //9600bps@24.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x8F; //设置定时初始值
TH1 = 0xFD; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
EA = 1;
P_SW1 = (P_SW1 & ~0xc0) | 0x40; //转变串口的引脚至3.6和3.7
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI==0);
TI=0;
}