
常规IO仿真串口
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
常规IO仿真串口是一种用于模拟和测试设备间通信的技术,通过软件创建虚拟串行端口,便于开发与调试无需物理连接的硬件设备。
外部中断模拟串口实验测试表明:发送57600波特率可以正常工作,但接收的最大波特率为38400。
```c
#include Uart_EXT0.h
#include MAIN.h
#define FOCS 22114800ul
bit Over;
bit bRxflag;
unsigned char IEN0_NOW, IEN1_NOW; //中断临时变量
unsigned char idata bRxstate = 0; //接收状态
unsigned char idata tmp_Len = 0; //缓存数组下标
unsigned char idata bRxlen; //接收字节数
unsigned char xdata EX_buf[64]; //接收存放区
//波特率设置为56000时,接收一字节所需时间为178.6us。此时会出现错误。
//波特率为38400时,接收一字节的时间是260.4us。即使在快速模式下也容易出现错误。
void Time0_Uart(unsigned int baud) {
TMOD &= 0XF0;
TMOD |= 0X02; //使用定时器0方式2
TH0 = 256 - (FOCS / 12) / baud;
TL0 = TH0;
IP0 |= 0x02; //设置为最高优先级
IP1 |= 0x02;
TR0 = 1; ET0 = 1; EA = 1;
}
void Time0_isr() interrupt 1 {
Over = 1;
}
// 发送数据,包括一个起始位、8个数据位和一个停止位。实验表明,在波特率为57600时发送不会出错。
void Uart_set(unsigned char dat) {
unsigned char i;
Over = 0; TL0 = TH0;
T_uart = 0; // 起始位
while (Over == 0);
for(i=0;i<8;++i){ // 发送数据位,先发送最低位
dat >>= 1;
if(dat & 0x01) {
T_uart = 1;
} else {
T_uart = 0;
}
while(Over == 0);
}
Over = 0; // 数据位清零了
T_uart = 1;
while (Over == 0); // 停止位,此后如果没有数据则一直为高
}
unsigned char get_Uart() {
unsigned char I, get_dat=0;
Over = 0; TL0 = TH0;
while(Over==0);
for(I = 7 ;I >= 1 ;--I) { // 接收8个数据位
if(Get_ex == 1)
get_dat |= (unsigned char)(Get_ex << I);
else
get_dat &= ~(unsigned int)((~(unsigned char)0x80) >> (7-I));
while(Over==0);
}
return get_dat;
}
void EXuart_isr() interrupt 0 {
unsigned char _chr;
IEN0_NOW = IEN0; //进入接收1字节,关闭中断
IEN1_NOW = IEN1;
IEN0 &= ~IE_EXINT_0;
while(IEN0 & IE_EXINT_0);
_chr=get_Uart();
switch(bRxstate) {
case 0: if(_chr==0x55) { bRxstate=1; } else bRxstate=0;
break;
case 1: if(_chr==0xaa) {bRxstate =2;}
else
bRxstate = 0;
break;
case 2:
// 取得数据长度
bRxlen=_chr;
bRxstate=3;
break;
case 3: EX_buf[tmp_Len]=_chr; tmp_Len++;
if(tmp_Len >= bRxlen) {
bRxflag = 1;
IEN0 |= IE_EXINT_0;
}
break;
}
}
void main() {
Time0_Uart(9600); EX_uart();
while (1){
if(bRxflag == 1) {
for(i=0;i
全部评论 (0)


