AVR单片机串口USART与PC通讯实例
51单片机和计算机之间实现串口通信的电路图
51单片机和计算机之间实现串口通信的电路图串口通讯参考程序如下:来源:深入浅出AVR单片机#include<reg51.h>unsigned char UART_RX; //定义串口接收数据变量unsigned char RX_flag; //定义穿行接收标记/**************************************************************************************** *****函数名:UART串口初始化函数调用:UART_init();参数:无返回值:无结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备注:振荡晶体为12MHz,PC串口端设置[ 4800,8,无,1,无]/**************************************************************************************** ******/void UART_init (void){EA = 1; //允许总中断(如不使用中断,可用//屏蔽)ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3; //定时器初值高8位设置TL1 = 0xF3; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)TR1 = 1; //定时器启动}/**************************************************************************************** ******//**************************************************************************************** *****函数名:UART串口接收中断处理函数调用:[SBUF收到数据后中断处理]参数:无返回值:无结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收/**************************************************************************************** ******/void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1RI = 0; //令接收中断标志位为0(软件清零)UART_RX = SBUF; //将接收到的数据送入变量UART_dataRX_flag=1; //标记接收//用户函数内容(用户可使用UART_data做数据处理)//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)//while(TI == 0); //检查发送中断标志位//TI = 0; //令发送中断标志位为0(软件清零)}/**************************************************************************************** ******//**************************************************************************************** *****函数名:UART串口发送函数调用:UART_T (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式备注:/**************************************************************************************** ******/void UART_T (unsigned char UART_data){ //定义串口发送数据变量ES=0; //禁止穿行中断SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)ES=1; //打开穿行中断}/**************************************************************************************** *****函数名:UART串口发送字符串函数调用:UART_S (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式备注:/**************************************************************************************** ******/void UART_S(unsigned char *str){while(1){if(*str=='\0') break;UART_T(*str++);}}/**************************************************************************************** *****函数名:主函数调用:main();参数:返回值:无结果:备注:/**************************************************************************************** ******/void main(){unsigned char Buf_data[]={" welcome to MCU world. \n\r"}; UART_init();UART_S(Buf_data);while(1){if(RX_flag==1){UART_T(UART_RX);RX_flag=0;}}}。
AVR程序范例(USART串口通讯)
}
}
interrupt[USART0_RXC] void usart0_rx(void)//USART接收中断处理程序
{
temp=UDR0;
usart_char_send(temp);
//-------------------------------//利用数组RsBuf来装接收到的字符串
UBRR0H = 0x00; //波特率寄存器H:
SREG = 0x80; //开总中断
}
//*********************************// ADC模块
void adc_init(void) //ADC初始化
{
ADCSRA=0xe3;//自动转换方式:ADC使能,ADC开始转换,自动触发使能,ADC预频:8分频
RsBuf[RsBytes]=temp;
RsBytes++;
if(RsBytes>10)//如果超过10个,则清零
{
for(clear=0;clear<=10;clear++)
{
RsBuf[clear]=0;
}
//flag=0;
RsBytes=0;
}
//------------------------------//
欢迎一起交流单片机,QQ:669892537
#include "mega64.h"
#include "string.h"
#define uint unsigned int
#define uchar unsigned char
AVR单片机与PC机串口通讯程序
A V R单片机与P C机串口通讯程序(总3页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.MarchProteus环境下完成本实验时,需要roteus中设COMPIM////-----------------------------------------------------------------#define F_CPU 4000000UL //4M晶振#include <avr/>#include <avr/>#include <util/>#define INT8U unsigned char#define INT16U unsigned int//数字串接收缓冲struct{INT8U Buf_Array[100]; //缓冲空间INT8U Buf_Len; //当前缓冲长度} Receive_Buffer ;//清空缓冲标志INT8U Clear_Buffer_Flag = 0;//0-9的数字编码,最后一位为黑屏const INT8U SEG_CODE[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; char *s = "\n", *p;//------------------------------------------------------------------// USART初始化//------------------------------------------------------------------void Init_USART(){UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);UCSRC = _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);UBRRL = (F_CPU/9600/16-1)%256;UBRRH = (F_CPU/9600/16-1)/256;}//------------------------------------------------------------------// 发送一个字符//------------------------------------------------------------------void PutChar(char c){if(c=='\n') PutChar('\r');UDR = c;while(!(UCSRA&_BV(UDRE)));}//------------------------------------------------------------------// 显示所接收的数字字符(数字字符由PC串口发送,AVR串口接收) //------------------------------------------------------------------void Show_Received_Digits(){INT8U i;for(i=0;i<;i++){PORTC= SEG_CODE[[i]];_delay_ms(400);}}//------------------------------------------------------------------// 主程序//------------------------------------------------------------------int main(){= 0;DDRB = 0x00; PORTB = 0xFF;DDRC = 0xFF; PORTC = 0x00;DDRD = 0x02; PORTD = 0xFF;MCUCR = 0x08;GICR =_BV(INT1);Init_USART();sei();while(1)Show_Received_Digits();}//-----------------------------------------------------------------// 串口接收中断函数//-----------------------------------------------------------------ISR (USART_RXC_vect){INT8U c= UDR;//如果接收到回车换行符则设置清空缓冲标志if(c=='\r'||c=='\n') Clear_Buffer_Flag=1;if(c>='0'&&c<='9'){//如果上次曾收到清空缓冲标志,则本次从缓冲开始位置存放 if(Clear_Buffer_Flag==1){= 0;Clear_Buffer_Flag = 0;}//缓存新接收的数字[]= c-'0';//刷新缓冲长度(不超过最大长度)if<100) ++;}}//-----------------------------------------------------------------// INT1中断函数(向PC发送字符串)//-----------------------------------------------------------------ISR (INT1_vect){INT8U i = 0;while(s[i]!='\0')PutChar(s[i++]);// 向PC发送字符串}。
AVR单片机串口USART与PC通讯实例和中断程序分析
“并行”通讯:是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。
“串行”通讯:形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。
但是并不是并口快,由于8位通道之间的互相干扰。
传输时速度就受到了限制。
而且当传输出错时,要同时重新传8个位的数据。
串口没有干扰,传输重发一位就可以了。
所以要比并口快。
串行通讯协议较多,单片机常用的有USART,SPI,TWI,1-Wire 等。
串行通讯有分为同步和异步通讯:通俗讲同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
同步通讯:收信发信双方在使用同步时钟,在同一时刻传输线上的数据就是要传输的信息。
异步通讯:以字符为传输单位,字符与字符之间是异步的,而字符的位是同步的USART:异步串行通讯,常用与单片机和单片机,单片机和PC电脑间的数据传输。
波特率:表征通讯速度的参数,单位是位/秒(b/s),即每秒钟传输的二进制位数,如波特率9600,表示每秒钟传输9600个二进制位数据。
收发双方必须采用同样的波特率。
波特率不同将无法正常通讯。
全双工通讯:指是的是可以同时发送和接收数据。
半双工通讯:指的是在同一时刻只能发送或只能接收数据。
单片机与PC通讯的电平转换:单片机的电压一般是TTL电平,电压0v-5v,PC机串口采用的是RS-232协议,它的的电压范围是-15-+15v,电平不同,无法通讯。
要实现通讯,必须进行电平和逻辑关系的转换,一般用 MAX232集成芯片进行电平的转换。
ATmega16 串口结构:有一个全双工的串行口,有两条通讯线,TXD:数据发送线,RXD:数据接收线,对应的单片机外部引脚为PD1,PD0相关寄存器:UDR 串口数据寄存器,UCSRA 串口控制与状态寄存器AUCSRB 串口控制与状态寄存器BUCSRC 串口控制与状态寄存器CUBRRH,UBRRL 波特率寄存器发生器对波特率发生器的输出时钟进行2、8或16 的分频,具体情况取决于工作模式,如下图:如:系统时钟频率f=8MHZ,异步正常模式(16分频),波特率9600则:UBRR=8000000/16*9600-1=52-1=51; 波特率寄存器赋值:UBRRH=0; UBRRL=51;/*10进制写法*/,或者UBRRH=0;UBRRL=0x33;/*16进制写法*/操作步骤:一、设置异步模式:UCSRC|=(1<<URSEL)|(1<<URMEL); //UCSRC和UBRRH寄存器共用一个地址,写UCSRC时,URSEL应置1二、设置数据帧格式: 8位数据位,一位停止位,UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);三、设置波特率寄存器:UBRRL=51;UBRRH=0;四、使能发送接收:UCSRB|=(1<<TXEN)|(1<<RXEN);五、中断总使能:SREG=0X80;//函数功能:通过PC 串口向单片发送数据,单片机接收数据后,送到PA口显示,再送回到PC机#include<iom16v.h>#include<macros.h>#define fosc 8000000 //晶振8MHZ#define baud 9600 //波特率定义/*端口初始化函数*/void init(void){PORTA = 0xFF; //PA口输出高电平DDRA = 0xFF; //PA口设置为输出PORTD = 0X00; //USART的发送接收端口分别为PD0和PD1DDRD|=(1<<PD1); //PD0为接收端口置为输入;PD1为发送端口置为输出}/*串口初始化函数*/void uart_init(void){UCSRB = 0x00;UCSRA = 0x00;UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); //异步,数据格式8,N,1//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1。
AVR 单片机 串口通信 串行通讯 详细例程介绍
Atmega128 有两个串口:USART0 与 USART1 以 USART0 为例
串口的初始化包括:
传输模式的选择:同步还是异步,默认为异步模式,可通过选择 USART 控制和状态 寄存器 UCSR0C 中的 UMSEL 位来选择,UMSEL 为 0,是异步模式. 波特率的设置:通信的双方都必须有相同的波特率,波特率可以通过设置波特率 发生寄存器 UBRR0 来确定,UBRR0 为两字节 16 位的寄存器,可分为 UBRR0H 和 UBRR0L.同时起作用的还有 UCSR0A 中的波特率加倍位 UX2,当 UX2 为 1 时设置的 波特率加倍.
3、设置 UCSR0C:
Bit6-UMSEL0:USART0 的模式选择,0 为异步模式,1 为同步模式 Bit5:4-UPM01:0:奇偶校验模式,00 禁止,01,保留,10 偶校验,11,奇校验 Bit3-USBS0:停止位的选择,0 停止位为 1bit,1 停止位为 2-bits Bit2:1-UCSZ01:0:字符长度,当 UCSZ02 为 0 时,00 表示 5 位,01 表示 6 位,10 表示 7 位,11 表示 8 位.当 UCSZ02 为 1 时,11 表示 9 位.(UCSZ02 为 UCSR0B 里的一位寄存器)
{ putchar0(*s); s++; }
putchar0(0x0a);//回车换行 putchar0(0x0d); }
/******************************************************************* ********* 函数功能:主程序 入口参数: 出口参数: ******************************************************************** ********/ void main(void) { unsigned char i;
用c+builder60实现avr单片机与pc机的串行通讯
用 ! " " #$%&’()*+ , 实现 -./ 单片机与 0! 机的串行通讯
江海洋1 2 黄小文1 2 万2 兵3
摘要2 介绍工业应用中常用的基于 4%5’678 异步串行通讯程序开发方法。结合开发实践讨论用 ! " " #$%&’()*+ , 实现 基于 -./ 单片机与 0! 机的数据通讯方法, 并给出程序设计的一般步骤和详细解释。最后讨论了工程实践中常遇到的 通讯方式方法的选择、 初始化、 校验和数据的保存方法。 关键词: 串行通讯2 $ " " %&’()*+2 ,-. 单片机2 数据保存 中图分类号: 90:11+ 12 文献标识码: -2 文章编号: 1*;1 —:1:: ( 3,,< ) ,< —,11= —,:
32 9!LMM 通讯控件属性
! " " #$%&’() 中 组 件 的 创 建 一 般 按 照 属 性、 事 件、 方法这三个方面来进行, 很多论文和专著中有这方 面的详细介绍, 本文不再讨论。本文将直接利用创建 好的通讯组件 9!LMM 来实现通讯。首先将 9!LMM 安装在 ! " " #$%&’() 的组件面板上, 然后就可以像普 通组件一样取用。该组件安装在 ! " " #$%&’() 中的 视图如图 3 所示, 其中图标为 “ 1,1, ” 的组件就是笔者 创建的通讯组件。 通讯组件的属性一般包含了串行端口的号码设 置、 速度设置、 参数设置等方面, 下面将该组件的部分 属性作一介绍。 #@$’/@C(: 串行端口的传输速度, 必须与接收端的 速度一致。 0! 一般设置为 Q*,,IJ8, /> R 3:3 通讯方
AVR简单的串口通信程序
AVR简单的串口通信程序
本例子是学习AVR 的串口通信时候编写的一个简单的串口通信的程序,运行的时候先向串口发送一个数据0x12,然后等待接收,当PC 机发送一个数据到单片机,单片机就对这个数据进行加1 处理,然后发回到PC 机显示。
以下是串口通信时候的界面和串口通信的源程序。
/***********************************************/
/************AVR USART 串口调试****************/
/************ClimberWin 2008.6.29**************/
/*CPU:ATMEGA32L 4MHZ 外部晶振(熔断位需要先配置好外部晶振)*/ /*说明:AVR 串口是通过UDR 发送出去的,类似于51 单片机的SBUF*/
/*程序功能:能够通过串行数据发送给PC 机0x12 数据,接收上位机数据并且+1 后发送回上位机*/
#include //AVR I/O 口定义头文件
#include // 延时头文件调用
#include interrupt.h> // 中断头文件调用
#define uchar unsigned char
//引脚定义
#define AVR_RXD 0 //PD0 RXD
#define AVR_TXD 1 //PD1 TXD
//常量定义
#define BAUDRATE 9600 //波特率定义
uchar UART_MID; //定义一个缓存区数据临时存储地址
/*******************串口接收中断服务程序*************************/。
PC机与AVR单片机之间串行通信的实现
PC机与AVR单片机之间串行通信的实现
丁易新
【期刊名称】《现代电子技术》
【年(卷),期】2005(28)12
【摘要】基于RS 232串行通信协议,阐述了一种PC机与AVR系列单片机Atmega128之间串行通信的实现方式,实现了PC机与单片机间数据的双向传输.其中PC机为主发送端,单片机为主接收端.硬件上,简单介绍了利用MAX232E芯片解决PC机与单片机电气规范不一致的方法.软件上,PC机端通信程序采用C语言编程,运用Turbo C库函数bios.h中提供的调用BIOS软中断的函数bioscom()实现;单片机端通信程序采用C51编程,使用UART接收结束中断、UART发送结束中断.本文提供了相关C语言和C51源程序.
【总页数】3页(P32-34)
【作者】丁易新
【作者单位】安徽工业大学,电气信息学院,安徽,马鞍山,243002
【正文语种】中文
【中图分类】TP336
【相关文献】
1.用Visual Basic实现PC机与单片机之间的串行通信 [J], 赵建周;韩庆妙
2.PC机与DSP之间串行通信的实现 [J], 孙璋;肖健梅
3.PC机与AVR单片机之间串行通信的实现 [J], 姜文谦
4.利用VB6.0实现PC机与MCS-51单片机之间的串行通信 [J], 李敏孜;刘志鸿;王宏
5.PC机与AVR单片机之间串行通信的实现 [J], 夏博锐
因版权原因,仅展示原文概要,查看原文内容请购买。
AVR单片机教程22-第二十二课 单片机与PC机的串行通信编程实践
——————————————————————————第二十二课单片机与PC机的串行通信编程实践本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!13.3.1 在AVR单片机开发板板上,进行单片机与PC机(个人电脑)的通信试验1PC机发送一个字符给单片机,单片机收到后即在发光管D1~D8上进行显示,同时将其回发给PC机。
为便于初学者实验成功,单片机的发送接收均采用查询方式。
实验电路可参考第4章的图4-1(AVR DEMO单片机综合试验板电路原理图)。
在我的文档中新建一个ac13-1的文件夹。
建立一个ac13-1.prj的工程项目,最后单片机培训建立源程序文件ac13-1.c。
输入下面的程序:#include <iom16v.h>//包含头文件#include <macros.h>//==================================——————————————————————————void port_init(void) //初始化端口子函数{PORTA = 0xFF; //PD端口初始化输出11111111DDRA = 0x00; //将PA端口设为输入PORTB = 0xFF; //PD端口初始化输出11111111DDRB = 0xFF; //将PB端口设为输出PORTC = 0xFF; //PD端口初始化输出11111111 //51单片机培训DDRC = 0x00; //将PC端口设为输入PORTD = 0xFF; //PD端口初始化输出11111111DDRD = 0x02; //将PD端口的PD1设为输出,其它设为输入}//**********************************************void uart0_init(void) //初始化UART子函数{UCSRB = 0x00; //禁止UART发送和接收UCSRA = 0x02;//倍速UCSRC = 0x06;//8位数据位UBRRL = 0x67; //波特率9600UBRRH = 0x00;UCSRB = 0x18;// 允许UART发送和接收单片机C语言教程}——————————————————————————//**********************************************void init_devices(void) //芯片的初始化子函数{port_init();//调用端口初始化子函数uart0_init();//调用UART初始化子函数}//**********************************************void uart0_send(unsigned char i)//发送1个字符的子函数{while(!(UCSRA&(1<<UDRE)));//等待发送缓冲区为空单片机教材UDR=i;//发送1个字符}//************************************************unsigned char uart0_receive(void) //接收1个字符的子函数{while(!(UCSRA&(1<<RXC)));//等待接收数据return UDR;//返回接收到的数据}//---------------------------------------------------------------void main(void) //主函数{——————————————————————————unsigned char temp;//定义局部变量init_devices();//调用芯片初始化子函数AVR单片机教程while(1) //无限循环{temp=uart0_receive();//等待接收数据PORTB=~temp; //接收的数据转成低电平后点亮LEDuart0_send(temp);//再将接收的数据发送出去}}编译通过后,AVR单片机综合试验板接通5V稳压电源,将生成的ac13-1.hex文件下载到试验板上的单片机中,注意,标示“UART”及“LED”的双排针应插上单片机开发短路块。
AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信
AVR单片机(学习ing)-ATMEGA16的USART与PC
机串行通信
五、ATMEGA16 的USART 与PC 机串行通信五(01)、PC 机发送字符给单片机控制发光管亮,同时将其传回PC 机,其中单片机的发送和接收都采用
查询方式(下一篇中有例程~)
1、USART 的主要特点
通用同步和异步串行接收器和转发器(USART) 是一个高度灵活的串行通讯设备。
主要特点为:全双工操作( 独立的串行接收和发送寄存器) 异步或同步操作主机或从机提供时钟的同步操作高精度的波特率发生器支持5, 6, 7, 8, 或9 个数据位和1 个或2 个停止位硬件支持的奇偶校验操作数据过速检测帧错误检测噪声滤波,包括错误的起始位检测,以及数字低通滤波器三个独立的中断:发送结束中断, 发送数据寄存器空中断,以及接收结束中断多处理器通讯模式倍速异步通讯模式
2、异步串行收发器
USART 分为了三个主要部分: 时钟发生器,发送器和接收器。
控制寄存器由三个单元共享。
时钟发生器包含同步逻辑,通过它将波特率发生器及为从机
同步操作所使用的外部输入时钟同步起来。
XCK ( 发送器时钟) 引脚只用于同步传输模式。
发送器包括一个写缓冲器,串行移位寄存器,奇偶发生器以及处
理不同的帧格式所需的控制逻辑。
写缓冲器可以保持连续发送数据而不会在数
据帧之间引入延迟。
由于接收器具有时钟和数据恢复单元,它是USART 模块中最复杂的。
恢复单元用于异步数据的接收。
除了恢复单元,接收器还包括奇
偶校验,控制逻辑,移位寄存器和一个两级接收缓冲器UDR。
接收器支持与发送器相同的帧格式,而且可以检测帧错误,数据过速和奇偶校验错误。
PC机与AVR单片机之间串行通信的实现
B IO S 功能调用, 主要用查询 COM 口状态来进行读
写; 如果发送寄存器空, 即可进行下次发送, 通过查询发现 传送有错误, 通知 PC 机重新发送; 如果接收数据就绪, 就 可以读入数据, 通过查询发现有错误, 就通知发送端重发。
# include " std io 1h" # include "b io s1h" un signed cha r inbuf[ 100 ]= {0}, 3 in tp , 3 inep; un signed cha r ou tbuf[ 100 ]= {0}, 3 ou ttp , 3 ou tep; 发送字符 vo id ou tcha r (un signed cha r ou t ) { fo r (; ! ( b io scom ( 3, 0, 0) &0x2000) ; ) ; b io scom ( 1, ou t, 0) ; ) ?′ if (ou t! = ′ &&ou t! = ′′ p rin tf ( " % c" , ou t ) ; } 读取字符 vo id incha r () { 3 in tp = b io scom ( 2, 0, 0) ; 3 ( + + in tp ) = 0; } 初始化, 9 600 b s, 无偶校验, 1 位停止位, 8 位数据 vo id in it () { b io scom ( 0, 0xe3, 0) ; } m a in () { in tp = inbuf; inep = inbuf; ou tep = ou tbuf; ou ttp = ou tbuf; in it () ; p rin tf ( " n n" ) ; ;) fo r (; b io scom ( 2, 0, 0) ! = ′′ ); ou tcha r ( ′′ ); ?′ ou tcha r ( ′ p rin tf ( "ka ish ichuan shu: n" ) ; ; ou ttp + + , 3 ou ttp = fo r ( 3 ou ttp = getch () ; 3 ou ttp ! = ′′ getch () ) { ou tcha r ( 3 ou ttp ) ; if ( 3 ou ttp = = 8) 3 ( - - ou ttp ) = 0; else ou ttp + + ; if (b io scom ( 3, 0, 0) &0x0100) incha r () ; } 3 ou ttp = 0; p rin tf ( " nou tcha r: % s n" , ou tbuf ) ; p rin tf ( " incha r: % s n" , inbuf ) ; }
单片机与pc机之间的通信例程
单片机与PC机之间的通信例程1. 引言单片机与PC机之间的通信是嵌入式系统开发中非常重要的一部分。
通过单片机与PC机之间的通信,可以实现数据传输、命令控制等功能。
本文将介绍单片机与PC 机之间通信的基本原理以及编写通信例程的步骤。
2. 单片机与PC机通信原理单片机与PC机之间的通信可以通过串口(UART)或者USB接口实现。
串口是一种常见且简单的通信方式,适用于低速数据传输。
USB接口则具有更高的传输速率和更复杂的协议,适用于高速数据传输和复杂的控制。
2.1 串口通信原理串口通信使用两根线(TXD和RXD)进行数据传输。
发送端将数据通过TXD线发送到接收端,接收端通过RXD线接收数据。
发送端和接收端需要使用相同的波特率(Baud rate)进行通信,波特率决定了每秒钟传输的位数。
2.2 USB通信原理USB通信使用四根线进行数据传输:VCC(供电)、GND(地线)、D+、D-(数据线)。
USB接口还包括一个复杂的协议,如USB1.1、USB2.0、USB3.0等。
3. 编写通信例程的步骤编写单片机与PC机之间的通信例程,需要以下步骤:3.1 确定通信方式首先需要确定使用串口通信还是USB通信。
根据实际需求选择合适的通信方式。
3.2 配置硬件根据选择的通信方式,配置单片机和PC机的硬件接口。
如果使用串口通信,需要连接TXD和RXD线;如果使用USB通信,需要连接VCC、GND、D+、D-线。
3.3 编写单片机程序根据单片机的型号和开发环境,编写单片机程序。
程序中需要包含对串口或USB接口的初始化配置以及数据传输或命令控制的代码。
3.4 编写PC机程序在PC机上编写相应的程序,用于与单片机进行通信。
根据选择的通信方式,编写串口或USB接口相关的代码。
在使用串口通信时可以使用Python中的serial库进行串口读写操作。
3.5 测试与调试将编写好的单片机程序烧录到单片机中,并运行PC机程序。
通过监视器或调试工具查看数据传输情况,并进行必要的调试。
利用USART与PC通信,带CRC校验,485发送
crc_check();
if (rc_buff[rclenth-1]==CRC_HIG&&rc_buff[rclenth-2]==CRC_LOW )
{
urcom_rC_deel(); //最后为CRC校验被认为接收正确
}
void portset(void) //端口设置
{
TRISA=0b00010111; //本来打算接几个LED作为接收各种数据的标志
TRISB=0b00000111;
TRISC=0b10010100;
PORTB=0;
}
}
} else if(TXIF) //发送中断 { if(txlenth>=CRC_NUM+2) //发送最后一个字节
{
/*接收处理*/
void ur_recieve(void)
{
if(rclenth>3&&rctime>30) // 接收完成 ,接收字节小于3或接受时间过长认为无数据
{
CRC_NUM=rclenth-2; //除去高低CRC验证字节
return;
for(i=0;i<=5;i++)
tx_buff[i]=0;
CREN=0;
CREN = 1;
RCIE=1;
DE=0;
break;
}
}
}
TXIE=0; //禁止发送中断
send_last_flag=1;//发送最后一个字节标志;
crc_check();
tx_buff[4]=CRC_LOW;
PC与单片机的串口通讯的简单实例
PC与单片机的串口通讯的简单实例这几天看了些串口方面的资料,决定设计一个简单的实验,以强化所学的东西。
实验实现的功能主要是:用PC上的一个软件通过串口通讯控制单片机I/O 口的输出。
本次实验主要涉及PC端上位机的程序编写(用VC)与单片机程序的编写(用Keil)。
为了简化实验,PC端软件设计成具有8个按钮的对话框,每个按钮分别控制单片机P2口的一个引脚的高低电平。
为了体现直观的结果,P2口上接上8个发光二极管。
实验的原理图如下:PC与单片机的通讯协议如下:采用4800波特率,无校验位,8个数据位,1个停止位,一次传输一个控制字节。
一、上位机软件的编写本来控制单片机只需单向传输数据即可,为了熟悉PC端接受数据的功能,在应用软件将控制数据传输到单片机端后,单片机端回传数据给应用软件,并用16进制格式显示在编辑控件中。
VC实现对串口的控制主要有两种方式:mscomm控件与api函数。
由于ms comm控件实现简单,本实验采用该方式。
1.在VC中创建一个基于对话框的应用程序,在该程序中插入Mscomm控件。
修改对话框资源,增加Mscomm及8个按钮控件与一个编辑框。
并为Mscomm控件增加一个控件变量m-com。
2.在对话框的OnInitDialog()函数中初始化串口,代码如下:if(m_com.GetPortOpen())m_com.SetPortOpen(FALSE);m_com.SetCommPort(1);//选择com1if(!m_com.GetPortOpen())m_com.SetPortOpen(TRUE);//打开串口elseMessageBox("无法打开串口!");m_com.SetSettings("4800,n,8,1");//波特率4800,无校验,8个数据位,1个停止位m_com.SetInputMode(1); //1:表示以二进制方式检取数据m_com.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于//或等于1个字符时将引发一个接收数据的OnCom m事件m_com.SetInputLen(0); //设置当前接收区数据长度为0m_com.GetInput();//先预读缓冲区以清除残留数据3.为每个按钮添加命令函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“并行”通讯:是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,
干扰就会增加,数据也就容易出错。
“串行”通讯:形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。
但是并不是并口快,由于8位通道
之间的互相干扰。
传输时速度就受到了限制。
而且当传输出错时,要同时重新传8个位的数据。
串口没有干扰,传输重
发一位就可以了。
所以要比并口快。
串行通讯协议较多,单片机常用的有USART,SPI,TWI,1-Wire 等。
串行通讯有分为同步和异步通讯:通俗讲同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉
你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
同步通讯:收信发信双方在使用同步时钟,在同一时刻传输线上的数据就是要传输的信息。
异步通讯:以字符为传输单位,字符与字符之间是异步的,而字符的位是同步的
USART:异步串行通讯,常用与单片机和单片机,单片机和PC电脑间的数据传输。
波特率:表征通讯速度的参数,单位是位/秒(b/s),即每秒钟传输的二进制位数,如波特率9600,表示每秒钟传输9600个二进制位
数据。
收发双方必须采用同样的波特率。
波特率不同将无法正常通讯。
全双工通讯:指是的是可以同时发送和接收数据。
半双工通讯:指的是在同一时刻只能发送或只能接收数据。
单片机与PC通讯的电平转换:单片机的电压一般是TTL电平,电压0v-5v,PC机串口采用的是RS-232协议,它的的电压范围
是-15-+15v,电平不同,无法通讯。
要实现通讯,必须进行电平和逻辑关系的转换,一般用
MAX232集成芯片进行电平的转换。
ATmega16 串口结构:有一个全双工的串行口,有两条通讯线,TXD:数据发送线,RXD:数据接收线,对应的单片机外部引脚为PD1,PD0
相关寄存器:UDR 串口数据寄存器,
UCSRA 串口控制与状态寄存器A
UCSRB 串口控制与状态寄存器B
UCSRC 串口控制与状态寄存器C
UBRRH,UBRRL 波特率寄存
器
发生器对波特率发生器的输出时钟进行2、8或16 的分频,具体情况取决于工作模式,如下图:
如:系统时钟频率f=8MHZ,异步正常模式(16分频),波特率9600
则:UBRR=8000000/16*9600-1=52-1=51; 波特率寄存器赋值:
UBRRH=0; UBRRL=51;
操作步骤:
一、设置异步模式:UCSRC|=(1<<URSEL)|(1<<URMEL); //UCSRC和UBRRH寄存器共用一个地址,写UCSRC时,URSEL应置1
二、设置数据帧格式: 8位数据位,一位停止位,
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ);
三、设置波特率寄存器:UBRRL=51;UBRRH=0;
四、使能发送接收:UCSRB|=(1<<TXEN)|(1<<RXEN);
五、中断总使能:SREG=0X80;
//函数功能:通过PC 串口向单片发送数据,单片机接收数据后,送到PA口显示,再送回到PC机
#include<iom16v.h>
#include<macros.h>
#define fosc 8000000 //晶振8MHZ
#define baud 9600 //波特率定义
/*端口初始化函数*/
void init(void)
{
PORTA = 0xFF; //PA口输出高电平
DDRA = 0xFF; //PA口设置为输出
PORTD = 0X00; //USART的发送接收端口分别为PD0和PD1
DDRD|=(1<<PD1); //PD0为接收端口置为输入;PD1为发送端口置为输出
}
/*串口初始化函数*/
void uart_init(void)
{
UCSRB = 0x00;
UCSRA = 0x00;
UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); //异步,数据格式8,N,1
//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1。
UBRRL=51; //设置波特率寄存器
UBRRH=0;
UCSRB |= (1 << TXEN)|(1 << RXEN); //发送接收使能
}
/*发送数据函数*/
void send(unsigned char i)
{
while(!(UCSRA&(1<<UDRE))); //只有数据寄存器为空时才能发送数据
UDR=i;
}
/*以下是接收数据函数*/
unsigned char receive(void)
{
while(!(UCSRA&(1<<RXC))); //等待接收完成
return UDR;
}
/*主函数*/
void main(void)
{
unsigned char temp;
init();
uart_init();
while(1)
{
temp=receive(); //接收数据
PORTA=~temp; //将接收的数据取反后送PA口显示
send(temp); //向PC机发送数据
}
}
小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。