AVR单片机串口USART与PC通讯实例

合集下载

51单片机和计算机之间实现串口通信的电路图

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串口通讯)

AVR程序范例(USART串口通讯)
RsBytes = 0; //将数组下标数RsBytes清零,以便下次使用
}
}
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机串口通讯程序

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通讯实例和中断程序分析

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 单片机 串口通信 串行通讯 详细例程介绍

AVR 单片机 串口通信 串行通讯 详细例程介绍
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机的串行通讯

用c+builder60实现avr单片机与pc机的串行通讯
2 设备设计与维修2
用 ! " " #$%&’()*+ , 实现 -./ 单片机与 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简单的串口通信程序
本例子是学习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单片机之间串行通信的实现

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], 夏博锐
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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文章分类单片机。

相关文档
最新文档