ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:25.13KB ,
资源ID:16421310      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16421310.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51IO口模拟串口通讯C源程Word下载.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51IO口模拟串口通讯C源程Word下载.docx

1、TIMER0_DISABLE; /停止timer/接收一个字符unsigned char PGetChar()unsigned char rch,ii;rch=0; /等过起始位rchif(BT_REC)rch|=0x80;F_TM)break;return rch;/检查是不是有起始位bit StartBitOn()return (BT_REC=0);void main()unsigned char gch;TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */PCON=00;TR0=0; /在发送或接收才开始使用TF0=0;TH0=(256-96)

2、; /9600bps 就是 1000000/9600=104.167微秒 执行的timer是104.167*11.0592/12= 96 TL0=TH0;ET0=1;EA=1;PSendChar(0x55);PSendChar(0xaa);PSendChar(0x00);PSendChar(0xff);while(1)if(StartBitOn()gch=PGetChar();PSendChar(gch);51单片机模拟串口的三种方法上海聚龙电力技术有限公司舒兵随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上

3、报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。本文所说的模拟串口,就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特率为9600BPS,即每一位传送时间为1000ms/9600=0.104ms,即位与位之间的延时为为0.104毫秒。单片机

4、的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指令周期,可即是通过若干个指令周期来进行延时的,单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。用此频率则每个指令周期的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。至于别的晶振频率大家自已去算吧。现在就以11.0592M的晶振为例,谈谈三种模拟串口的方法。方法

5、一:延时法通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期。#defineucharunsignedcharsbitP1_0=0x90;P1_10x91;P1_20x92;RXDP1_0TXDP1_1WRDYN44/写延时RDDYN43/读延时/往串口写一个字节voidWByte(ucharinput)i=8;TXD=(bit)0;/发送启始位Delay2cp(39);/发送8位数据位while(i-)TXD=(bit)(input&0x01);/先传低位Delay2cp(36);input=input1;/发送校验位(无)TXD=(bit)1;/发送结束Delay

6、2cp(46);/从串口读一个字节RByte(void)Output=0;temp=RDDYN;Delay2cp(RDDYN*1.5);/此处注意,等过起始位Outputif(RXD)|=0x80;/先收低位Delay2cp(35);/(96-26)/2,循环共占用26个指令周期while(-temp)/在指定的时间内搜寻结束位。Delay2cp(1);if(RXD)break;/收到结束位便退出returnOutput;/延时程序*Delay2cp(unsignedchari)while(-i);/刚好两个指令周期。此种方法在接收上存在一定的难度,主要是采样定位存在需较准确,另外还必须知道每

7、条语句的指令周期数。此法可能模拟若干个串口,实际中采用它的人也很多,但如果你用KeilC,本人不建议使用此种方法,上述程序在P89C52、AT89C52、W78E52三种单片机上实验通过。方法二:计数法51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。/计数器初始化S2INI(void)TMOD|=0x02;/计数器0,方式2TH0=0xA0;/预值为256-96=140,十六进制A0TR0=1;/开始计数/发送启始位WaitTF0();/发送结束位/查询计数器溢出

8、标志位WaitTF0()TF0);接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和发送都很准确,另外不需要计算每条语句的指令周期数。方法三:中断法中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程序中需对中断进行初始化,同时编写中断程序。本程序使用Timer0中断。TM0_FLAG/设传输标志位/计数器及中断初始化/在发送或接收才开始使用/允许定时器0中断/中断允许总开关RByte()/启动Timer0/等过起始/位间延时TM0_FLAG)/停止Timer0/中断1处理程序I

9、ntTimer0()interrupt1TM0_FLAG=1;/设置标志位。/查询传输标志位TM0_FLAG);TM0_FLAG=0;/清标志位中断法也是我推荐的方法,和计数法大同小异。发送程序参考计数法,相信是件很容易的事。另外还需注明的是本文所说的串口就是通常的三线制异步通信串口(UART),只用RXD、TXD、GND。通用的I/O模拟串口程序/ UART.C/ Generic software uart written in C, requiring a timer set to 3 times/ the baud rate, and two software read/write pi

10、ns for the receive and/ transmit functions./ * Received characters are buffered/ * putchar(), getchar(), kbhit() and flush_input_buffer() are available/ * There is a facility for background processing while waiting for input/ Colin Gittins, Software Engineer, Halliburton Energy Services/ The baud ra

11、te can be configured by changing the BAUD_RATE macro as/ follows:/ #define BAUD_RATE 19200.0/ The function init_uart() must be called before any comms can take place/ Interface routines required:/ 1. get_rx_pin_status()/ Returns 0 or 1 dependent on whether the receive pin is high or low./ 2. set_tx_

12、pin_high()/ Sets the transmit pin to the high state./ 3. set_tx_pin_low()/ Sets the transmit pin to the low state./ 4. idle()/ Background functions to execute while waiting for input./ 5. timer_set( BAUD_RATE )/ Sets the timer to 3 times the baud rate./ 6. set_timer_interrupt( timer_isr )/ Enables t

13、he timer interrupt./ Functions provided:/ 1. void flush_input_buffer( void )/ Clears the contents of the input buffer./ 2. char kbhit( void )/ Tests whether an input character has been received./ 3. char getchar( void )/ Reads a character from the input buffer, waiting if necessary./ 4. void turn_rx

14、_on( void )/ Turns on the receive function./ 5. void turn_rx_off( void )/ Turns off the receive function./ 6. void putchar( char )/ Writes a character to the serial port. stdio.h#define BAUD_RATE 19200.0#define IN_BUF_SIZE 256#define TRUE 1#define FALSE 0static unsigned char inbufIN_BUF_SIZE;static

15、unsigned char qin = 0;static unsigned char qout = 0;static char flag_rx_waiting_for_stop_bit;static char flag_rx_off;static char rx_mask;static char flag_rx_ready;static char flag_tx_ready;static char timer_rx_ctr;static char timer_tx_ctr;static char bits_left_in_rx;static char bits_left_in_tx;stati

16、c char rx_num_of_bits;static char tx_num_of_bits;static char internal_rx_buffer;static char internal_tx_buffer;static char user_tx_buffer;void timer_isr(void)char mask, start_bit, flag_in;/ Transmitter Sectionif ( flag_tx_ready )if ( -timer_tx_ctr= 1;if ( mask )set_tx_pin_high();set_tx_pin_low();tim

17、er_tx_ctr = 3;if ( -bits_left_in_txflag_tx_ready = FALSE;/ Receiver Sectionif ( flag_rx_off=FALSE )if ( flag_rx_waiting_for_stop_bit )if ( -timer_rx_ctr=IN_BUF_SIZE )qin = 0;else / rx_test_busyif ( flag_rx_ready=FALSE )start_bit = get_rx_pin_status();/ Test for Start Bitif ( start_bit=0 )flag_rx_rea

18、dy = TRUE;internal_rx_buffer = 0;timer_rx_ctr = 4;bits_left_in_rx = rx_num_of_bits;rx_mask = 1;else / rx_busy / rcvtimer_rx_ctr = 3;flag_in = get_rx_pin_status();if ( flag_in )internal_rx_buffer |= rx_mask;rx_mask if ( -bits_left_in_rxqout = 0;while ( ch=0x0A | ch=0xC2 );return( ch );void _putchar(

19、char ch )while ( flag_tx_ready );user_tx_buffer = ch;/ invoke_UART_transmitbits_left_in_tx = tx_num_of_bits;internal_tx_buffer = (user_tx_buffer1) | 0x200;flag_tx_ready = TRUE;void flush_input_buffer( void )char kbhit( void )return( qin!=qout );void turn_rx_on( void )void turn_rx_off( void )flag_rx_off = TRUE;MSC51汇编代码编写的模拟串口程序T2作为波特率控制UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1