哪个寄存器是控制单片机串口工作的控制io口

上位机串口控制单片机
此时有人在和您一起浏览筑龙优搜库
上位机串口控制单片机相关专题推荐已解决问题
请详解下单片机的 并行IO口,串行IO口,及二者区别
RT,本人刚刚接触单片机,希望解释的详细点
浏览次数:2647
用手机阿里扫一扫
最满意答案
串口通信的基本概念1,什么是串口?2,什么是RS-232?3,什么是RS-422?4,什么是RS-485?5,什么是握手?1,什么是串口?串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal&Serial&Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-&232口。同时,串口通信协议也可以用于获取远程采集设备的数据。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为&1和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是&GPIB设备的通信。b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准&ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语&&包&指任何通信的情况。c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。并行口与串行口的区别是交换信息的方式不同,并行口能同时通过8条数据线传输信息,一次传输一个字节;而串行口只能用1条线传输一位数据,每次传输一个字节的一位。并行口由于同时传输更多的信息,速度明显高于串行口,但串行口可以用于比并行口更远距离的数据传输。而并行传输是一次将所有一字节中8位信号一并传送出去。自然最少需要8根信号线。&&&&&&&&&&&&如果按每次传送的数据流量来看,并行传输要远快于串口,在电脑发展初期,由于数据传输速率不是很高,并行传输还是很快的。&&&&&&&&&&&&但并行传输也有它的缺点:&&&&&&&&&&&&1、干扰问题上面的人已经提到。&&&&&&&&&&&&其根本原因是由于传输速率太快,一般&&达到100M以上,信号线上传递的频率将超过100MHz,想想看,调频收音机的频率也不过88~108MHz,也就是说,若用并行传输的话,是8根天线放在一起来传输信号,不发生干扰才怪。但如果加强屏蔽,减小信号线间的耦合电容,是可以继续增大传输速率的,不过这将变得不现实,因为这必然导致信号线将耗用更多金属,截面积更大。但这并不是不能解决的问题。&&&&&&&&&&&2、并行传输速率提升困难的最主要原因是同步问题&&&&&&&&&&&并行传输时,发送器是同时将8位信号电平加在信号线上,电信号虽然是以光速传输的,但仍有延迟,因此8位信号不是严格同时到达接受端,速率小时,由于每一字节在信号线上的持续时间较长,这种到达时间上的不同步并不严重,随着传输速率的增加,与8位信号到达时间的差异相比,每一字节的持续时间显得越来越短,最终导致前一字节的某几位与后一字节的几位同时到达接受端,这就造成了传输失败,而且随着信号线的加长这种现象还会越发严重,直至无法使用。&&这是并口传输的致命缺点。&&&&&&&&&&&&串行传输由于只有一位信号在信号线上,没有位同步问题,因此传送频率可以继续提高,当前传输速率已经达到1Gb/s(1000M)以上,而且还在提高,而并行传输在100Mb/s左右就停滞不前了,可以预见,串行传输将会比并行传输越来越快。
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok当前位置: >>
单片机IO口模拟串口程序(发送+接收)
前一阵一直在做单片机的程序,由于串口不够,需要用 IO 口来模拟出一个串口。经过若干曲 折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总 结的部分贴出来。 程序硬件平台:11.0592M 晶振,STC 单片机(兼容51) /*************************************************************** * 在单片机上模拟了一个串口,使用 P2.1作为发送端 * 把单片机中存放的数据通过 P2.1作为串口 TXD 发送出去 ***************************************************************/ #include &reg51.h& #include &stdio.h& #include &string.h& typedef uchar code info[] = { 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5 5 }; sbit newTXD = P2^1;//模拟串口的发送端设为 P2.1 void UartInit() { SCON = 0x50; // SCON: serail mode 1, 8-bit UART TMOD |= 0x21; // T0工作在方式1,十六位定时 PCON |= 0x80; // SMOD=1; TH0 = 0xFE; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为 2400bps fosc=11.0592MHz TL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为 2400bps fosc=11.0592MHz // TH0 = 0xFD; // 定时器0初始值,延时417us,目的是令模拟串口的波特率 为2400bps fosc=18.432MHz // TL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为 2400bps fosc=18.432MHz } void WaitTF0(void) { while(!TF0); TF0=0; TH0=0xFE; TL0=0x7F; // // } void WByte(uchar input) { //发送启始位 uchar j=8; TR0=1; newTXD=(bit)0; WaitTF0(); //发送8位数据位 while(j--) { newTXD=(bit)(input&0x01); WaitTF0(); input=input&&1; } //发送校验位(无) //发送结束位 newTXD=(bit)1; WaitTF0(); TR0=0; } void Sendata() { for(i=0;i&sizeof(info);i++)//外层循环,遍历数组 { WByte(info[i]); } } void main() { UartInit(); while(1) //先传低位 TH0 TL0 // 定时器重装初值 fosc=11.0592MHz // 定时器重装初值 fosc=11.0592MHz = 0xFD; // 定时器重装初值 fosc=18.432MHz = 0x7F; // 定时器重装初值 fosc=18.432MHz { Sendata(); } } ############################################################################## /*************************************************************** * 模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际 串口 * 在单片机上模拟了一个串口,使用 P3.2作为发送和接收端 * 以 P3.2模拟串口接收端,从模拟串口接收数据发至串口 ***************************************************************/ #include&reg51.h& #include&stdio.h& #include&string.h& typedef
//这里用来切换晶振频率,支持11.0592MHz 和18.432MHz //#define F18_432 #define F11_0592 uchar tmpbuf2[64]={0}; //用来作为模拟串口接收数据的缓存 struct { uchar recv :6 ;//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到 tmpbuf2中 uchar send :6 ;//tmpbuf2数组下标,用来将 tmpbuf2中的数据发送到串口 }tmpbuf2_point={0,0}; sbit newRXD=P3^2 ;//模拟串口的接收端设为 P3.2 void UartInit() { SCON=0x50 ;// SCON: serail mode 1, 8-bit UART TMOD|=0x21 ;// TMOD: timer 1, mode 2, 8-bit reload,自动装载预置数(自动将 TH1 送到 TL1);T0工作在方式1,十六位定时 PCON|=0x80 ;// SMOD=1; #ifdef F11_0592 TH1=0xE8 ;// Baud:2400 fosc=11.0592MHz 2400bps 为从串口接收数据的速率 TL1=0xE8 ;// 计数器初始值,fosc=11.0592MHz 因为 TH1一直往 TL1送,所以这个初 值的意义不大 TH0=0xFF ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz #endif #ifdef F18_432 TH1=0xD8 ; TL1=0xD8 ; 个初值的意义不大 // Baud:2400 fosc=18.432MHz 2400bps 为从串口接收数据的速率 // 计数器初始值,fosc=18.432MHz 因为 TH1一直往 TL1送,所以这TH0=0xFF ;// 定时器0初始值, 延时104us, 目的是令模拟串口的波特率为9600bps fosc=18.432MHz TL0=0x60 ;// 定时器0初始值, 延时104us, 目的是令模拟串口的波特率为9600bps fosc=18.432MHz #endif IE|=0x81 ;// 中断允许总控制位 EA=1;使能外部中断0 TF0=0 ; IT0=1 ;// 设置外部中断0为边沿触发方式 TR1=1 ;// 启动 TIMER1,用于产生波特率 } void WaitTF0(void) { while(!TF0); TF0=0 ; #ifdef F11_0592 TH0=0xFF ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz #endif #ifdef F18_432 TH0=0xFF ; // 定时器重装初值 fosc=18.432MHz TL0=0x60 ; // 定时器重装初值 fosc=18.432MHz #endif } //接收一个字符 uchar RByte() { uchar Output=0 ; uchar i=8 ; TR0=1 ; //启动 Timer0#ifdef F11_0592 TH0=0xFF ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz #endif #ifdef F18_432 TH0=0xFF ;// 定时器重装初值 fosc=18.432MHz TL0=0x60 ;// 定时器重装初值 fosc=18.432MHz #endif TF0=0 ; WaitTF0();//等过起始位 //接收8位数据位 while(i--) { Output&&=1 ; if(newRXD)Output|=0x80 ;//先收低位 WaitTF0();//位间延时 } TR0=0 ;//停止 Timer0 return O } //向 COM1发送一个字符 void SendChar(uchar byteToSend) { SBUF=byteToS while(!TI); TI=0 ; } void main() { UartInit(); while(1) { if(tmpbuf2_point.recv!=tmpbuf2_point.send)//差值表示模拟串口接收数据缓存中还 有多少个字节的数据未被处理(发送至串口) { SendChar(tmpbuf2[tmpbuf2_point.send++]); } } }//外部中断0,说明模拟串口的起始位到来了 void Simulated_Serial_Start()interrupt 0 { EX0=0 ; //屏蔽外部中断0 tmpbuf2[tmpbuf2_point.recv++]=RByte(); 组中 IE0=0 ; EX0=1 ; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以上是两个独立的测试程序,分别是模拟串口发送的测试程序和接收的测试程序 上面两个程序在编写过程中参考了这篇文章《51单片机模拟串口的三种方法》 (在后文中 简称《51》,但在它的基础上做了一些补充,下面是若干总结的内容: ) 1、 《51》在接收数据的程序中,采用的是循环等待的方法来检测起始位(见《51》的“附:51 附 IO 口模拟串口通讯 C 源程序(定时器计数法)” 部分) 源程序(定时器计数法) ,这种方法在较大程序中,可能会错 过起始位(比如起始位到来的时候程序正好在干别的,而没有处于判断起始位到来的状态) , 或者一直在检测起始位,而没有办法完成其他工作。为了避免这个问题,在本接收程序中采 用了外部中断的方法,将外部中断0引脚作为模拟串口的接收端,设 IT0=1(将外部中断0设 为边缘触发) 。这样当起始位(低电平)到来时,就会引发外部中断,然后在外部中断处理函 数中接收余下的数据。这种方法可以保证没数据的时候程序该干什么干什么,一旦模拟串口 接收端有数据,就可以立即接收到。 2、加入了模拟串口接收缓冲区。在较大程序中,单片机要完成的工作很多,在模拟串口接收 到了数据之后立即处理的话,有可能处理不过来造成丢失数据,或者影响程序其他部分执行。 本程序中加入了64个字节的缓冲区,从模拟串口接收到的数据先存放在缓冲区中。这样就算 程序一时没工夫处理这些数据,腾出手来之后也能在缓冲区中找到它们。 3、 《51》文中的 WByte 函数和 RByte 函数中都先打开计数器后关闭计数器。如果使用本文的 外部中断法来接收数据,并且外部中断处理函数里外都调用了 WByte 或 RByte 的话,需要将 这两个函数中的 TR0=1,TR0=0操作的语句除去,并在 UartInit()中加入一句 TR0=1;即 让 TR0始终开着就可以。 由于之前没有意识到这个问题,因此在具体应用时出现了奇怪的问题:表现为中断处理函数 执行完毕之后,似乎回不到主程序,程序停在了一个不知道的地方。后来经过排查后找到了 问题所在,那个程序的中断处理函数中用了 RByte,中断处理函数外用到了 WByte,而这两 个函数的最后都有 TR0=0。这样当中断处理函数执行完毕后,TR0实际上是为0的,返回主程 //从模拟串口读取数据, 存放到 tmpbuf2数//防止外部中断响应2次,防止外部中断函数执行2次 //打开外部中断0 序后(中断前的主程序可能正好处于其他的 WByte 或 RByte 执行中) ,原先以来定时器0溢 出改变 TF0才能执行下去的 WByte 函数就无法进行下去, 从而导致整个程序停下来不动。 在 ( 本文的接收测试程序中不存在这个问题,因为中断处理程序中虽调用了 RByte,但中断处理 程序外却没有调用 RByte 或 WByte) 下面是修改后的 RByte、WByte 和 WaitTF0函数,仅供参考: /********************************************** * 定时器0溢出后重装初值 **********************************************/ void WaitTF0(void) { TF0=0 ; #ifdef F11_0592 TH0=0xFF ;// 定时器重装初值 fosc=11.0592MHz TL0=0xA0 ;// 定时器重装初值 fosc=11.0592MHz #endif #ifdef F18_432 TH0=0xFF ;// 定时器重装初值 fosc=18.432MHz TL0=0x60 ;// 定时器重装初值 fosc=18.432MHz #endif while(!TF0); TF0=0 ; } /********************************************** * 从串口 B 接收一个字符 **********************************************/ uchar RByte() { uchar Output=0 ; uchar i=8 ; // /* #ifdef F11_0592 TH0 = 0xFF; fosc=11.0592MHz TL0 = 0xA0; fosc=11.0592MHz #endif // 定 时 器 重 装 初 值 模 拟 串 口 的 波 特 率 为 9600bps // 定 时 器 重 装 初 值 模 拟 串 口 的 波 特 率 为 9600bps TR0=1; //启动 Timer0#ifdef F18_432 TH0 = 0xFF; // 定时器重装初值 fosc=18.432MHz TL0 = 0x60; // 定时器重装初值 fosc=18.432MHz #endif */ WaitTF0();//等过起始位 //接收8位数据位 while(i--) { Output&&=1 ; if(newRXD)Output|=0x80 ; WaitTF0();//位间延时 } // while(!TF0) if(newRXD) 时过长,影响下一个字节的接收 // // WaitTF0(); TR0=0; //此句和下一句不能加,如果加上了将导致耗 //等过结束位 //停止 Timer0 //先收低位return O } /********************************************** * 发送一个字节到串口 B **********************************************/ void WByte(uchar input) { //发送启始位 uchar j=8 ; //TR0=1; newTXD=(bit)0 ; WaitTF0(); //发送8位数据位 while(j--) { newTXD=(bit)(input&0x01);//先传低位 WaitTF0(); input=input&&1 ; } //发送校验位(无) //发送结束位 newTXD=(bit)1 ; WaitTF0(); //TR0=0; } 4、在上面的新修改后的 RByte()函数中,有被注释掉的如下两句: // while(!TF0) if(newRXD) 长,影响下一个字节的接收 //此句和下一句不能加,如果加上了将导致耗时过// WaitTF0(); //等过结束位 这两句在《51》文中的程序是存在的,但是使用中断接收法后,加上这两句后出现了问题。 表现为接收到的下一个字节的数据不完整或直接接收不到,似乎这两句占用了过多的时间。 看这两句的目的似乎是要延时以跳过结束位,但是我感觉这个结束位可以不用管它,反正结 束位是个高电平,不会妨碍下一个字节是否到来的判断(下一个字节的起始位是低电平) 。那 就由它去吧,没有必要为了它而占用 CPU 的时间。 在本文的程序中,去掉这两句后程序执行正确,如果其他朋友在使用时真的出现问题,可以 试着再把它们加上试一下。
51单片机IO口模拟串口通讯C源程(单片机)_电子/电路...IO 口模拟 232 通讯程序 使用两种方式的 C 程序 ...//在发送或接收才开始使用 TF0=0; TH0=(256-96...51 单片机模拟串口的三种方法 51 单片机模拟串口的...附:51 IO 口模拟串口通讯 C 源程序(定时器计数法...//在发送或接收才开始使用 TF0=0; TH0=(256-96...单片机串口通信发送、接收C语言编程程序 - 发送: #include&reg52.h& unsigned char TD void main() { TMOD = 0X20; TH1 =...如果你的中断里的程序较 长, 应该在模拟串口接收和发送时禁止中断。 3、 接收...51单片机 IO口模拟串口通... 2页 免费
51单片机+IO口模拟串口通... 2页...2 位停止位 //该变量用于模拟串口发送和接收时候位电平保持延时周期数, //单位...单片机串口收发数据c程序... 1页 免费 单片机IO口模拟串口程序... 9页 1下载...本程序需用到串口调试助手软件,下载程序后,在发送区发送 数据后,会在上面的接受...单片机模拟串口收发实例...
5页 2下载券
LPC900单片机串行口通用...
1页...china.com/BLOG_ARTICLE_3007162.HTM 串口接收程序是基于串口中断的, 单片机的串口每次接收到一字节数据产生一次中断, 然后 再读取某个寄存器就可以得到串口接收的...基于Proteus虚拟终端51单片机仿真:串口发送和接收字符串_信息与通信_工程科技_专业...利用Proteus 虚拟终端,实现字符串的发送与接收 先上图: 实验程序: /***...51单片机模拟串口的三种方法_电子/电路_工程科技_...程序不断的查询溢出标志来决定是否 发送或接收下一...用定时器控制普通 IO 口输出位 输入:用外部中断+...51单片机模拟串口通信程序(C) - 使用单片机普通 IO 口模拟串口的三种方法 新洁家园 ( z# @ , `( E - I V ( \) S 随着单片机的使用日益频繁,用其作...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。利用单片机IO口模拟串口与另一个单片机通信
[问题点数:40分,结帖人wsblldz]
本版专家分:23
结帖率 100%
CSDN今日推荐
本版专家分:7668
2018年7月 VC/MFC大版内专家分月排行榜第一2017年10月 VC/MFC大版内专家分月排行榜第一2016年3月 VC/MFC大版内专家分月排行榜第一2014年10月 VC/MFC大版内专家分月排行榜第一2014年9月 VC/MFC大版内专家分月排行榜第一2014年7月 VC/MFC大版内专家分月排行榜第一2014年6月 VC/MFC大版内专家分月排行榜第一2014年5月 VC/MFC大版内专家分月排行榜第一2014年4月 VC/MFC大版内专家分月排行榜第一2014年2月 VC/MFC大版内专家分月排行榜第一2013年7月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第二2017年12月 VC/MFC大版内专家分月排行榜第二2017年6月 VC/MFC大版内专家分月排行榜第二2017年5月 VC/MFC大版内专家分月排行榜第二2017年1月 VC/MFC大版内专家分月排行榜第二2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2018年6月 VC/MFC大版内专家分月排行榜第三2018年4月 VC/MFC大版内专家分月排行榜第三2018年3月 VC/MFC大版内专家分月排行榜第三2018年2月 VC/MFC大版内专家分月排行榜第三2018年1月 VC/MFC大版内专家分月排行榜第三2017年11月 VC/MFC大版内专家分月排行榜第三2017年9月 VC/MFC大版内专家分月排行榜第三2017年8月 VC/MFC大版内专家分月排行榜第三2017年4月 VC/MFC大版内专家分月排行榜第三2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
本版专家分:709
本版专家分:5872
2012年4月 荣获微软MVP称号2003年4月 荣获微软MVP称号
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
2008年5月 其他开发语言大版内专家分月排行榜第三2008年4月 其他开发语言大版内专家分月排行榜第三2008年3月 其他开发语言大版内专家分月排行榜第三2003年3月 VC/MFC大版内专家分月排行榜第三2003年5月 其他开发语言大版内专家分月排行榜第三
本版专家分:7668
2018年7月 VC/MFC大版内专家分月排行榜第一2017年10月 VC/MFC大版内专家分月排行榜第一2016年3月 VC/MFC大版内专家分月排行榜第一2014年10月 VC/MFC大版内专家分月排行榜第一2014年9月 VC/MFC大版内专家分月排行榜第一2014年7月 VC/MFC大版内专家分月排行榜第一2014年6月 VC/MFC大版内专家分月排行榜第一2014年5月 VC/MFC大版内专家分月排行榜第一2014年4月 VC/MFC大版内专家分月排行榜第一2014年2月 VC/MFC大版内专家分月排行榜第一2013年7月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第二2017年12月 VC/MFC大版内专家分月排行榜第二2017年6月 VC/MFC大版内专家分月排行榜第二2017年5月 VC/MFC大版内专家分月排行榜第二2017年1月 VC/MFC大版内专家分月排行榜第二2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2018年6月 VC/MFC大版内专家分月排行榜第三2018年4月 VC/MFC大版内专家分月排行榜第三2018年3月 VC/MFC大版内专家分月排行榜第三2018年2月 VC/MFC大版内专家分月排行榜第三2018年1月 VC/MFC大版内专家分月排行榜第三2017年11月 VC/MFC大版内专家分月排行榜第三2017年9月 VC/MFC大版内专家分月排行榜第三2017年8月 VC/MFC大版内专家分月排行榜第三2017年4月 VC/MFC大版内专家分月排行榜第三2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
本版专家分:23
本版专家分:23
本版专家分:5703
本版专家分:23
本版专家分:37608
2013年6月 硬件/嵌入开发大版内专家分月排行榜第一2007年10月 硬件/嵌入开发大版内专家分月排行榜第一2007年6月 硬件/嵌入开发大版内专家分月排行榜第一2007年5月 硬件/嵌入开发大版内专家分月排行榜第一2007年4月 硬件/嵌入开发大版内专家分月排行榜第一2007年3月 硬件/嵌入开发大版内专家分月排行榜第一
2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
本版专家分:173
本版专家分:5703
本版专家分:5872
2012年4月 荣获微软MVP称号2003年4月 荣获微软MVP称号
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
2008年5月 其他开发语言大版内专家分月排行榜第三2008年4月 其他开发语言大版内专家分月排行榜第三2008年3月 其他开发语言大版内专家分月排行榜第三2003年3月 VC/MFC大版内专家分月排行榜第三2003年5月 其他开发语言大版内专家分月排行榜第三
本版专家分:11515
本版专家分:11515
本版专家分:23
本版专家分:1450
本版专家分:1450
匿名用户不能发表回复!
其他相关推荐
51系列单片机三种方法模拟串口的程序 用普通I/O口模拟串口接收发送。普通单片机一般有1-2个串口。有时会有不够用的情况,本程序示例软件模拟串口的方法。
在前三篇文章中由简到烦的介绍了模拟串口的设计规则,但是在前三篇文章中所实现的方法并不能满足我们在实际工程中的使用。在这篇文章中,我将详细的描述模拟串口的实现,并提供相关代码来供大家参考。
为了书写的方便,我将使用我的模版文件,关于模版文件的详细介绍请参考这篇文章。同样的,我们认为一个字节是10个位【起始位(1bit)+数据位(8bit)+停止位(1bit)】。
同样的为了方便,我们
硬件环境:STC89C52
软件环境:IDE Keil uVision V4.10
编译器 C51 V9.0
代码如下:
/**********************************************
方法3:中断法
硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1
波特率:9600
/IO端口定义
#define SPI_SCK
#define SPI_MOSI PC1
#define SPI_MISO PC2
#define SPI_DDR
#define SPI_PORT PROTC
#define SPI_PIN
//端口操作符定义
#define SCK_SET SPI_PORT|=_BV(SPI_SCK)
使用了STM32CubeMX及Keil (HAL库)材料:stm32开发板、USB转TTL?CH340模块、杜邦线、st-link实验原理:模拟了异步半双工通信波特率可变起始位:1数据位:8停止位:1(1个数据10位)无校验位传输一个字符的时候先发送1位起始位,然后是8位数据位(从低位到高位),最后是一位停止位用1个普通的GPIO口输出(模拟TXD),模拟了以上发送的高低电平,采用定时器延时(一个...
使用PIC单片机的普通IO口模拟I2C总线,对24C02进行读写操作。其中,总线定义为:
//24C02时钟线
//24C02数据线
将跳线帽P11短接至24C02方向,将跳线帽P6段接至IIC方向。
I2C 总线协议规定任何将数据传送到总线的
合泰 HT66F30 IO初始化 望有助于需要的朋友!
在上一篇文章中我们介绍了IO口模拟串口数据的发送,这一篇文章我们介绍IO口模拟串口数据的发送。同样的,我们没有使用库函数和中断,我们使用简单的定时来完成数据的接收。
1、IO口模拟串口接收数据的原理
同样的,我们将要接收的数据认为是10位(实际上,我们在接收数据之前必须搞清楚我们将要接收的是什么,否则我们需要在模拟串口程序中添加其他代码来进行检测)。
同样的,我们事先知道发送数据的波特率为:
IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比较长的篇幅介绍IO口的原理。也是查阅了不少资料,确保内容正确无误,花了很长时间写的。IO口原理原本需要涉及很多深入的知识,而这里尽最大可能做了简化方便理解。这样对于以后解决各种IO口相关的问题会有很大的帮助。
IO口等效模型是本人独创的方法,通过此模型,能有效的降低对IO口内部结构理解的难度。并且经查阅资料确认,这种模型和实际工作原理
如果单片机的IO短路,一个

我要回帖

更多关于 51单片机串口控制数码管显示两位 的文章

 

随机推荐