利用单片机IO口模拟UART程序,系统用了一个定时器和一个外部中断,外部中断主要是用来检测串口起始位的到来。 利用单片机IO口模拟UART程序,系统用了一个定时器和一个外部中断,外部中断主要是用来检测串口起始位的到来。
1
STM32 GPIO模拟UART串口的例程。此为实现方式类型二《STM32 GPIO模拟UART串口:外部时钟及TIM》。介绍参见: https://blog.csdn.net/hwytree/article/details/127139693 。
2023-02-23 09:33:44 3.74MB STM32 GPIO模拟 模拟UART 模拟串口
1
本例程是用MSP430F1121单片机的TimerA(以下简称TA)模块实现简单的串行口功能。 有兴趣的朋友们可以将此制作来当一个430DIY实验练练功。能让你更进一步了解TA模块的功 能好处。在 本 例 中,波 特 率发 生 器 是以32768晶体 振荡器 (ACLK) 作为TA的时 钟 源输 入(ACLK=TACLK),每位时钟周期约为30us。若采用2400B/S作为波特率收发输出,那么传输出一位的时间周期为:1/2400=417uS。此时需要TA产生一个定时约为417uS的中断来作波特率发器。
2023-02-08 19:34:27 314KB MSP430 TimerA 串行口功能 例程
1
非常实用的IO模拟串口的三种方法,欢迎下载!!!
2022-11-21 17:44:36 38KB 模拟串口
1
FPGA与PC串口自收发通信,编程语言Verilog
2022-11-11 21:51:17 336KB FPGA 串口 Verilog
1
采用的是STM32系列CPU在PC上模拟出来两个串口,调用系统自带的cdc驱动
2022-08-22 16:42:56 576KB STM32 USB 模拟串口
1
Configure Virtual Serial Port Driver(VSPD)模拟串口,收发数据
2022-08-17 10:16:45 4.71MB vspd
Virtual Serial Port Driver Pro 9.0 目前企业最新版,可能仅能使用一段时间,谨慎下载。
2022-07-12 16:46:33 5.83MB 模拟串口
1
外部中断模拟串口,波特率不能超过65536 实验测试:发送57600可以正常,但接收只能 <= 38400 #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]; //接收存放区 /*************************************************** baud = 56000 接收一字节 =178.6us ,接收会出现错误 baud = 38400 接收一字节 =260.4us //快速接收都容易出现错误 baud = 19200 接收一字节 =520us | baud = 14400 接收一字节 =694.5us | baud = 9600 接收一字节 =1041.6us | baud = 4800 接收一字节 =2.083ms 接收过长,定时器MODE2无法满足 //主机发送的数据最好加上校验字 发送:最大57600,发送还能正常。 ****************************************************/ void Time0_Uart(unsigned int baud) { TMOD &= 0XF0; TMOD |= 0X02; //使用定时器0方式2,使用方式1则2400波特也能有 TH0 = 256-(FOCS/12)/baud; TL0 = TH0; IP0 |= 0x02; //设置为最高优先级 IP1 |= 0x02; TR0 = 1; ET0 = 1; EA = 1; } void Time0_isr() interrupt 1 { //方式1则重装值 Over = 1; } /* 发送数据,1起始位,8数据,1停止位 发送波特率实验57600都不会错误,大量发送数据待测试 */ void Uart_set(unsigned char dat) { unsigned char i; Over = 0; TL0 = TH0; //防止发送数据开始时不知道TL0是多少 T_uart = 0; //起始位 while(Over==0); Over = 0; for(i=0;i<8;i++) //8数据位 {// Over = 0; //起始位时清零了 if(dat&0x01) //先发最低位 { T_uart = 1; } else { T_uart = 0; } while(Over==0); Over = 0; dat >>= 1; } // Over = 0; //数据位清零了 T_uart = 1; //停止位,此后如果没有数据则一直为高 while(Over==0); } unsigned char get_Uart() { unsigned char I=0,get_dat=0; Over = 0; TL0 = TH0; //重新赋值,防止出错 while(Over==0); Over = 0; for(I=0;I<8;I++) { get_dat >>= 1; if(Get_ex == 1) get_dat |= 0x80; else get_dat &= 0x7f; while(Over==0); Over = 0; } if(Get_ex == 1) { Over = 0; } return get_dat; } void EXuart_isr() interrupt 0 { unsigned char _chr; IEN0_NOW = IEN0; //进入接收1字节,关闭中断 IEN1_NOW = IEN1; IEN0 = 0X82; IEN1 = 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) { bRxstate=0; tmp_Len=0; bRxflag=1; //一帧数据接收完毕,置位完成标志位 } break; default: break; } IE0 = 0; //清外部0中断标志,防止下次接收不到 IEN0 = IEN0_NOW; IEN1 = IEN1_NOW; } void main() { Time0_Uart(9600); EX_uart(); if(bRxflag==1) { bRxflag = 0; for(i=0;i<10;i++) RevBuffer[i] = EX_buf[i]; T0Uart_TX(10,RevBuffer); } }
2022-06-21 15:14:28 61KB 模拟串口 51
1
最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真 模拟串口最新单片机仿真