基于AVR单片机--Atmega16的串口通信使用

合集下载

基于ATmega16单片机的USART串口通信测试程序

基于ATmega16单片机的USART串口通信测试程序

基于ATmega16单片机的USART串口通信测试程序/************************************************************** *************** 编译环境:ICC AVR。

文件名:基于ATmega16单片机的USART串口通信测试程序功能:利用ATmega16的USART,从TXD异步串出数据,将TXD 与RXD短接,从RXD输入,通过PC口送到一个LED数码管显示,实现了自发自收的过程?作者:赵国朋班级:鹏程001时间:2013年04月5日修改:无备住:一.硬件接口电路描述1.晶振:8MHz2.MCU的PC口与共阴极数码管相接3.TXD与RXD相接TXD --- RXD/************************************************************** ***************/ #include //包含单片机型号头文件#include //包含"位操作"头文件#define uchar unsigned char //宏定义#define uint unsigned int#define ulong unsigned long#define BAUD 9600 //波特率采用9600b/s#define CRYSTAL 8000000 //系统时钟为8MHz//计算和定义波特率设置参数#define BAUD_SETTING (uint)((ulong)CRYSTAL/(16*(ulong)BAUD)-1)#define BAUD_H (uchar)(BAUD_SETTING>>8)#define BAUD_L (uchar)(BAUD_SETTING)//USART控制和状态寄存器的标志位定义#define FRAMING_ERROR (1<<fe)< bdsfid="122" p=""></fe)<>#define PARITY_ERROR (1<<pe)< bdsfid="124" p=""></pe)<>#define DATA_OVERRUN (1<<dor)< bdsfid="126" p=""></dor)<>#define DATA_REGISTER_EMPTY (1<<udre)< bdsfid="128" p=""></udre)<>#pragma interrupt_handler USART_Rx_Isr:12 //USART接收中断服务#pragma data:dataflash Duan_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F /************ MCU初始化函数**************//************************************************************** **************** 函数名:MCU_Init()功能:MCU初始化参数:无返回值:无/************************************************************** **************** /void MCU_Init(){PORTC=0X00;DDRC=0XFF;PORTD=0X03;DDRD=0X02;}/************ USART初始化函数**************//************************************************************** **************** 函数名:USART_Init()功能:USART初始化参数:无返回值:无/************************************************************** **************** /void USART_Init(){// DDRD=0X02;//PORTD=0X03;UCSRA=0X00;UCSRB=(1<<rxcie)|(1<<rxen)|(1<<=""></rxcie)|(1<<rxen)|( 1<//UCSRB=0X98;UCSRC=(1<<ursel)|(1<<ucsz1)|(1<<="" bdsfid="161" p=""></ursel)|(1<<ucsz1)|(1<//UCSRC=0X86UBRRH=BAUD_H;UBRRL=BAUD_L;}/************ USART中断服务函数**************//************************************************************** **************** 函数名:USART_Rx_Isr()功能:USART中断服务,将欲显示的数码送到I/O寄存器参数:无返回值:无/************************************************************** **************** /void USART_Rx_Isr(){uchar status,data;//DDRC=0XFF;status=UCSRA;data=UDR;if((status&(FRAMING_ERROR|PARITY_ERROR|DATA_OVERRU N))==0)PORTC=Duan_table[data];}/************ USART发送数据函数**************//************************************************************** **************** 函数名:USART_Transmit()功能:将要发送的数据送到USART缓冲区UDR中参数:uchar data返回值:无/************************************************************** **************** /void USART_Transmit(uchar data)while(!(UCSRA&DATA_REGISTER_EMPTY));UDR=data;}/************ 延时函数**************//************************************************************** **************** 函数名:Delay_Us()、Delay_Ms()功能:微秒级、毫秒级延时参数:Us --- 欲延时的us数Ms --- 欲延时的ms数返回值:无/****************************************************************************** /void Delay_Us(uint Us){uint i;Us=Us*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值for( i=0;i<us;i++);< bdsfid="203" p=""></us;i++);<>}void Delay_Ms(uint Ms){uint i,j;for( i=0;i<ms;i++)< bdsfid="209" p=""></ms;i++)<>for(j=0;j<1141;j++);//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值}/************ 主函数**************//************************************************************** **************** 函数名:main()功能:参数:无返回值:无/************************************************************** **************** /void main()uchar i=0;//定义变量MCU_Init();USART_Init();SREG=BIT(7);//开全局中断while(1){for(i=0;i<16;i++) {USART_Transmit(i); Delay_Ms(500);}}}。

ATmega162双串口应用

ATmega162双串口应用
}
/*UART1初始化*/
void uart1_init(void)
{
UCSR1A = 0x00;
UCSR1B |= (1 << RXCIE1)|(1 << TXEN1)|(1 << RXEN1); //接收中断、发送接收使能
UCSR1C |= (1<<URSEL1)|(1 << UCSZ11)|(1 << UCSZ10); //8位数据位
UDR1 = i; //发送数据
}
#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC
void uart1_rx_isr(void) //UART1接收中断服务程序
{
uart1_transmit(UDR1); //将接收到的数据通过UART1发送
while(1)
{
;
}
}
/************************************
编译环境:ICC-AVR
芯片型号:ATmega162
时钟频率:11.0592MHz
函数功能:将ATmega162双串口串联起来,
通过PC串口向单片机发送数据,
单片机接收数据后再送回PC机
PORTB = 0x00;
}
/*UART0初始化*/
void uart0_init(void)
{
UCSR0A = 0x00;
UCSR0B |= (1 << RXCIE0)|(1 << TXEN0)|(1 << RXEN0); //接收中断、发送接收使能

ATMEGA16的USART串口发送与接收数据示例程序

ATMEGA16的USART串口发送与接收数据示例程序

//ATMEGA16的USART串口发送与接收数据示例程序,采取中断的方式//发送200个FF,接收数据显示在数码管上,接收数据格式如09//编译环境 ICCAVR//系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms//作者:David//日期:2013.10.20//*********************************************************************** // 包含文件//***********************************************************************#include <iom16v.h>#include <macros.h>#include <string.h>#include <stdio.h>#include <signal.h> //中断信号头文件//*********************************************************************** // 定义变量区//*********************************************************************** #define CH451_RESET 0x0201 //复位#define CH451_LEFTMOV 0x0300 //设置移动方式-左移#define CH451_LEFTCYC 0x0301 //设置移动方式-左循#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循#define CH451_SYSOFF 0x0400 //关显示、键盘、看门狗#define CH451_SYSON1 0x0401 //开显示#define CH451_SYSON2 0x0403 //开显示、键盘#define CH451_SYSON3 0x0407 //开显示、键盘、看门狗功能#define CH451_DSP 0x0500 //设置默认显示方式#define CH451_BCD 0x058f //设置BCD译码方式#define CH451_TWINKLE 0x0600 //设置闪烁控制#define CH451_DIG0 0x0800 //数码管位0显示#define CH451_DIG1 0x0900 //数码管位1显示#define CH451_DIG2 0x0a00 //数码管位2显示#define CH451_DIG3 0x0b00 //数码管位3显示#define CH451_DIG4 0x0c00 //数码管位4显示#define CH451_DIG5 0x0d00 //数码管位5显示#define CH451_DIG6 0x0e00 //数码管位6显示#define CH451_DIG7 0x0f00 //数码管位7显示#define l ed0 0x0000 //数码管位0显示的数据0#define l ed1 0x0001 //数码管位0显示的数据1#define l ed2 0x0002 //数码管位0显示的数据2#define l ed3 0x0003 //数码管位0显示的数据3#define l ed4 0x0004 //数码管位0显示的数据4#define l ed5 0x0005 //数码管位0显示的数据5#define l ed6 0x0006 //数码管位0显示的数据6#define l ed7 0x0007 //数码管位0显示的数据7#define l edno 0x0010 //数码管灭#define dclk0 PORTD &= ~(1 << PD6) //串行数据时钟,上升延激活#define dclk1 PORTD |= (1 << PD6)#define din0 PORTD &= ~(1 << PD5) //串行数据输出,接CH451的数据输入#define din1 PORTD |= (1 << PD5)#define load0 PORTD &= ~(1 << PD4) //串行命令加载,上升延激活#define load1 PORTD |= (1 << PD4)#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define fosc 7372800 //晶振频率#define baud 9600 //设置波特率的大小uint tx_count=200,tx_flag=0xff;uchar A1,A2,A3;uchar usart_tx_data;uchar usart_rx_data;uchar table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06, //显示用数据0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};//*************************************************************************// 初始化子程序//*************************************************************************void system_init(){PORTD=0x7F; //PD0设置为输入,PD1输出DDRD=0x72; //上拉电阻使能有效}void ch451_init() //先低后高,选择4线输入{din0;din1;}void usart_init(){UCSRB = 0x00;UCSRA=0x00; //单倍速模式UBRRL = (fosc/16/baud-1)%256; //写波特率的值UBRRH = (fosc/16/baud-1)/256;UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //UCSRC=086;写UCSRC寄存器 //异步通信无校验,8位数据1位停止位UCSRB=0xF8; //接收中断和发送中断允许}//***********************************************************************// 延时程序////***********************************************************************void delay_1ms(void){unsigned int i;for(i = 1; i < (unsigned int)(1144 - 2); i++);}void delay_ms(unsigned int n){unsigned int i = 0;while(i < n){delay_1ms();i++;}}//*************************************************************************// 数据处理函数//*************************************************************************void data_do(uchar temp_d){uchar A2t;A1=temp_d/100; //分出百,十,和个位A2t=temp_d%100;A2=A2t/10;A3=A2t%10;}//*************************************************************************// 串口相关中断服务子程序//************************************************************************* /* //数据发送结束中断向量#pragma interrupt_handler USART_TXC:14void USART_TXC() //中断服务程序{delay_ms(10); //相关操作}*///数据接收结束中断向量#pragma interrupt_handler USART_RXC:12void USART_RXC() //中断服务程序{CLI();//关中断usart_rx_data=UDR; //将接收到的数据取出data_do(usart_rx_data); //数据处理,得到个位十位百位SEI(); //开中断}/* //数据寄存器空中断向量#pragma interrupt_handler USART_UDRE:13void USART_UDRE() //中断服务程序{UDR=usart_tx_data; //发送数据到数据寄存器tx_count--;if(tx_count==0x00){tx_flag=0x01;}}*///************************************************************************* // 串口发送相关程序//************************************************************************* //发送单个字符void PutChar(char c){//PORTC |= (1 << PC3); //改变1487控制口为输出态,PC3=1 发送允许,接收禁止while(!(UCSRA & (1 << UDRE)));UDR = c;while(!(UCSRA&(1<<TXC)));UCSRA |= (1 <<TXC);//将发送结束标志位清零//PORTC &= ~(1 << PC3); //改变1487控制口为输出态,PC3=0 接收允许,发送禁止}//发送不带换行回车的字符串void PutNStr(unsigned char *Str){while (*Str != '\0'){PutChar(*Str);Str++;}}//发送带换行回车的字符串void PutStr(unsigned char *Str){while (*Str != '\0'){PutChar(*Str);Str++;}PutChar(0x0D);PutChar(0x0A);}//*************************************************************************// 输出命令子程序// 定义一无符号整型变量存储12字节的命令字//************************************************************************void ch451_write(unsigned int command){unsigned char i;load0; //命令开始for(i=0;i<12;i++){ //送入12位数据,低位在前if(command&1){din1;}elsedin0;dclk0;dclk1; //上升沿有效command>>=1;}load1; //加载数据}//*************************************************************************// 显示函数//*************************************************************************void display(uchar b_data,uchar s_data,uchar g_data){system_init();ch451_init();ch451_write(CH451_SYSOFF); //关显示、键盘、看门狗ch451_write(CH451_SYSON1); //开显示ch451_write(CH451_BCD); //设置BCD译码方式ch451_write(CH451_TWINKLE); //设置闪烁控制ch451_write(CH451_DIG0|table[b_data]); //显示接收到的值ch451_write(CH451_DIG1|table[s_data]);ch451_write(CH451_DIG2|table[g_data]);ch451_write(CH451_DIG3|ledno);ch451_write(CH451_DIG4|ledno);ch451_write(CH451_DIG5|ledno);ch451_write(CH451_DIG6|ledno);ch451_write(CH451_DIG7|ledno);}//*************************************************************************// 主程序//*************************************************************************void main(){system_init(); //系统初始化usart_init(); //usart串口初始化配置//usart_tx_data=0xff;SREG|=0x80; //开启全局中断while(1){/*while(tx_flag!=0x01) //数据发送是否完成,也可用发送完成中断 {//usart_tx_data=0xff;PutChar(0xFF);tx_count--;if(tx_count==0x00){tx_flag=0x01;}//delay_ms(10);}*///UCSRB=0xF0;display(A1,A2,A3); //显示接收到的数据 }}。

实现ATmega16单片机AD键盘与PC机的串口通信并用LCD1602显示程序

实现ATmega16单片机AD键盘与PC机的串口通信并用LCD1602显示程序
平台ATmega16
编程软件CodeVisionAV
实现功能:单片机与PC机(电脑)之间的串口通信。具体就是单片机最小系统上的AD键盘按键按下后发送键值到串口助手上显示,串口助手发送一串字符到最小系统上的lcd1602显示。
(程序或有冗余)
#include <mega16.h>
#include <delay.h>
data=rx_buffer[rx_rd_index]; //读取缓冲队列中的数据
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli") //关中断
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
// USART Receiver buffer:接收器缓冲
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

基于AVR单片机的串口通信

基于AVR单片机的串口通信

囝2
主从机软件部分如下: 下面为主机的初始化和中断服务程序
.include“8535def.inc”
Ij。砷reset
.clef SPldrd=r2
.clef .def .clef
tempi=r16 temp2=r17 ent=r18
.equ block0=¥0060
.dqu k啦;dI=50
·eseg
参考文献 1李勋,耿德根.AVR单片机应用技术.北京:北京航空航天
大学出版社,2000 2丁化成,耿德根,李君凯.A'VR单片机应用设计.北京:北京
航空航天大学出敝社,2002 3宋建国AVR单片机原理及应用.北京:北京航空航天大学
出舨社,2000 4耿德根,宋建国,马潮,叶勇建.AVR高速嵌人式单片机原理
本文研究的血红细胞沉降率测量仪与传统血红细胞沉降率测量仪相比较,具有以下创新点: 1)提出新的快速血红细胞沉降率测量方法,提高了血红细胞沉降率的测量速度; 2)采用CPLD和AVR单片机相结合,实现电动机的高精度、高稳定性控制,从而提高了血红细胞沉降率的测量精度; 3)在医疗设备中应用红外测量技术。 最后对设计制作的血红细胞沉降率测量仪进行了实验验证,分析了误差来源以及改进方法。实验结果表明,本文设计的ESR测量仪的测量精度高,稳 定性好,达到了设计要求。
ATMEL公司研发的AVR单片机提供一个同步串行通信接口SPI(Serial Peripheral Interface),用户能够通过计算机的并行接口或串行接口对其内部程 序存储器编程.实际上,利用串口实现AVR单片机ISP(In Sys-tern Programmable)功能就是使用计算机的串口来驱动AVR单片机ISP串行编程所需的信号波 形,从而实现计算机对AVR单片机的编程.首先介绍AVR单片机ISP功能的原理,然后讨论利用串口实现AVR单片机ISP功能的一种方法,给出编程电缆原理图、 编程电缆监控程序通信协议和编程工具软件.

ATMEGA16_串口接收程序

ATMEGA16_串口接收程序
UCSRB|=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//接收结束中断使能,接收使能,发送使能
SREG=0X80;//打开全局中断
}
/****************************************************
发送数据函数
****************************************************/
写数据函数规定写数据的流程
*******************************************/
void write_data(uchar data) //data
{
uchar start_data,Hdata,Ldata;
start_data=0xfa; //写数据
Hdata=data&0xf0; //取高四位
Ldata=(data<<4)&0xf0; //取低四位
sendbyte(start_data);//发送起始信号
delay_us(1);
sendbyte(Hdata);//发送高四位
delay_us(1);
sendbyte(Ldata);//发送低四位
delay_us(1);
}
/**********************************************
LCD初始化函数
************************************************/
void LCD_init()
{
write_com(0x01);
delay(5) ; //清屏指令

AVR单片机项目十二 ATmega16单片机I2C通信接口应用

AVR单片机项目十二 ATmega16单片机I2C通信接口应用

【任务1】 项目知识点学习 二、I2C总线的协议
3、I2C总线的仲裁
图12-3 I2C总线的仲裁过程
【任务1】 项目知识点学习 二、I2C总线的协议
4、I2C总线的数据传输
图12-4 I2C总线的数据传输过程
【任务1】 项目知识点学习 二、I2C总线的协议
4、I2C总线的数据传输
图12-5 I2C总线的数据传输格式图
【任务1】 项目知识点学习 三、时钟芯片PCF8563的相关知识
3、时钟芯片PCF8563的基本原理及内部寄存器概述
所有16个寄存器设计成可寻址的8位并行寄存器,但不 是所有位都有用。前两个寄存器(内存地址00H,01H ) 用于控制寄存器和状态寄存器,内存地址02H~08H用于 时钟计数器(秒~年计数器),地址09H~0CH用于报警 寄存器(定义报警条件),地址0DH控制CLKOUT管脚的 输出频率,地址0EH 和0FH分别用于定时器控制寄存器和 定时器寄存器。秒、分钟、小时、日、月、年、分钟报警 、小时报警、日报警寄存器,编码格式为BCD,星期和星 期报警寄存器不以BCD格式编码。
单片机应用技术
项目十二
ATmega16单片机I2C通信接口应用
【知识目标】
掌握SPI串行通信协议 了解ATmega16单片机SPI串行通信接口结构 了解与SPI串行通信有关的寄存器的功能 了解TLC5615D/A芯片
【能力目标】 掌握ATmega16单片机的I2C串行通信接口相关寄 存器的配置方法 掌握PCF8563无线通信模块方法 掌握简单的单片机I2C串行通信总线系统程序的编 写、调试方法
【任务1】 项目知识点学习 三、时钟芯片PCF8563的相关知识
1、时钟芯片PCF8563概述 PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片。具 有多种报警功能、定时器功能、时钟输出功能以及中断输 出功能能完成各种复杂的定时服务,甚至可为单片机提供 看门狗功能。内部时钟电路内部振荡电路、内部低电压检 测电路1.0V 以及两线制I2C 总线通讯方式,不但使外围电 路及其简洁,而且也增加了芯片的可靠性。同时每次读写 数据后,内嵌的字地址寄存器会自动产生增量。当然作为 时钟芯片,亦解决了2000 年问题。已被广泛用于电表、水 表、电话、便携式仪器及电池供电的仪器仪表等产品领域。

AVR ATmega16中文说明书

AVR  ATmega16中文说明书

ALU- 算术逻辑单元AVR ALU 与32 个通用工作寄存器(R0-R31)直接相连。

寄存器与寄存器之间、寄存器与立即数之间的ALU 运算只需要一个时钟周期。

ALU 操作分为3 类:算术、逻辑和位操作。

此外还提供了支持无/ 有符号数和分数乘法的乘法器。

具体请参见指令集。

状态寄存器状态寄存器包含了最近执行的算术指令的结果信息。

这些信息可以用来改变程序流程以实现条件操作。

如指令集所述,所有ALU 运算都将影响状态寄存器的内容。

这样,在许多情况下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。

在进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。

这些工作需要软件来处理。

AVR 中断寄存器SREG 定义如下:•Bit 7 –I: 全局中断使能I 置位时使能全局中断。

单独的中断使能由其他独立的控制寄存器控制。

如果I 清零,则不论单独中断标志置位与否,都不会产生中断。

任意一个中断发生后I 清零,而执行RETI指令后I 恢复置位以使能中断。

I 也可以通过SEI 和CLI 指令来置位和清零。

•Bit 6 –T: 位拷贝存储位拷贝指令BLD 和BST 利用T 作为目的或源地址。

BST 把寄存器的某一位拷贝到T,而BLD 把T 拷贝到寄存器的某一位。

•Bit 5 –H: 半进位标志半进位标志H 表示算术操作发生了半进位。

此标志对于BCD 运算非常有用。

详见指令集的说明。

•Bit 4 –S: 符号位, S = N ⊕VS 为负数标志N 与2 的补码溢出标志V 的异或。

详见指令集的说明。

•Bit 3 –V: 2 的补码溢出标志支持2 的补码运算。

详见指令集的说明。

•Bit 2 –N: 负数标志表明算术或逻辑操作结果为负。

详见指令集的说明。

• Bit 1 – Z: 零标志表明算术或逻辑操作结果为零。

详见指令集的说明。

• Bit 0 – C: 进位标志表明算术或逻辑操作发生了进位。

详见指令集的说明使用CLI 指令来禁止中断时,中断禁止立即生效。

AVR通过串口给芯片烧录程序(ATMega16)

AVR通过串口给芯片烧录程序(ATMega16)

AVR通过串口给芯片烧录程序(ATMega16)AVR通过串口给芯片烧录程序(ATMega16)相信大家都用过STC系列的51单片机,STC系列的单片机烧录程序都很简单,只需要通过串口就可以实现程序的烧录。

于是就想让avr 的芯片也能实现通过串口就能下载的功能,这样就可以省去购买usbasp下载线或者高压编程器的费用了。

仔细研究avr的芯片手册,发现都是带有bootloader功能,同时这个bootloader功能可以读写芯片的整个flash存储区,并且包括bootloader区,而且还有另外一个特点:如果bootloader功能开启以后,每次复位都会从bootloader启动。

接下来再来研究一下STC芯片的烧录功能:当在烧录软件中按下“下载”按钮以后,烧录软件会通过传给给STC芯片不停的发送一串数据,此时给STC芯片下电,然后上电,芯片上电以后,首先检测是否有烧录的请求,如果有就开始烧录程序,如果没有就开始执行芯片flash中的程序。

于是就有一个大概的思路了,可以给avr的芯片写一个bootloader的串口通信的程序,首先检测是否有烧录请求,如果有就更新flash中的程序,如果没有烧录请求,则执行flash中原有的程序。

经过几天的努力这个通过串口给atmega16烧录程序的固件和上位机终于完成了,为了方便大家这里共享处原理图和固件程序。

其实这种功能应该有人已经实现了,至少国外的开源硬件arduino就是通过这种方式给atmega8烧录程序的,但是atmega16我没有找到现成的,于是就自己实现了一个。

烧录软件使用winavr中的avrdude程序。

这也是一个开源项目,avrdude是一个控制台程序,操作不是很方便,于是写了一个应用程序封装了一下。

原理图:原理图实际上就是一个带有串口的avr最小系统。

烧录bootloader程序:下载ATMega16串口下载.rar 安装包,解压到本地目录,使用usbasp把“bootloader" 文件夹下的固件烧录到atmega16里,然后修改熔丝位:验证烧录程序:把自制的板子通过串口和电脑相连,运行“AvrSelfProgram.exe” 程序:在软件中选择正确的串口,并浏览打开要烧录的hex固件,此时按下板子上的复位按钮,然后点击“写FLASH”按钮。

ATmega16单片机实现串口收发数据

ATmega16单片机实现串口收发数据

1、编译环境:CodeVisionAVR2、功能:实现以5AH开头的6个字节数据帧的接收及发送3、接收及发送方式:中断接收,查询发送4、校验方式:所有字节相加模除256等于0则接收正确,否则不予接收程序如下所示:#include "mega16.h"#define uchar unsigned char #define uint unsigned int #define BAUD 9600 #define F_CLK 400000 0#define MATCH_OK 1; #define MATCH_ERROR 0; #define UDRE 5volatile uchar i=0;volatile uchar recc_flag=0; //命令字节接收标志(recieve command 简写成 recc) volatile uchar comm_flag=0; //命令帧接收完毕标志(command 简写成 comm) volatile uchar comm; //定义变量,用于传递UDR0中接收到的命令字volatile uchar command[6]={0x00,0x00,0x00,0x00,0x00,0x00}; //定义长度为6的数组用于接收长度为6字节的命令帧,并将所有元素初始化为0x00/*延时*/void delay(uint t) {while(t--); }/*****//*******帧头校验******/ uchar check_comm(void) {uchar i;uint result=0;for(i=0;i<6;i++) {result+=command[i]; }if((result%256)==0) {return MATCH_OK; } else {return MATCH_ERROR; } }/*********************/void uart_init(void) {UCSRA=0x00;UCSRB=0x98; //接收结束中断使能;数据接收使能;数据发送使能UCSRC=0x06; //工作在异步模式;无校验;1位停止位;字符长度为8位 UBRRH=(F_CLK/BAUD/16-1)/256;UBRRL=(F_CLK/BAUD/16-1)%256; //系统时钟为4MHz,波特率为9600bps }void init_device(void) {#asm("cli") //关中断PORTA=0x04; DDRA=0x04; PORTB=0xFE; DDRB=0xFF; PORTD=0xFF; DDRD=0x02; MCUCR=0x00; TIMSK=0x00;uart_init(); //串口初始化#asm("sei") //重开中断 }interrupt[USART_RXC] void usart_rec(void) {comm=UDR; recc_flag=1; }/*****USART0口发送命令字节程序*****/ void usart0_transcomm(uchar x) {while(!(UCSRA&(1<<UDRE))); //数据寄存器空时才能发送数据 UDR=command[x]; }/**********************************//*****命令帧的单个字节存储程序******/ void save_single_byte(uchar y) {if(y<6){command[y]=comm;} recc_flag=0; }/***********************************//********命令帧保存程序********/ void save_comm(void) {uchar mount=5;if(recc_flag==1) //接收标志置位,说明接收到命令字,则存储 {save_single_byte(i);i++; //指向下一个数组元素 if(command[0]!=0x5A) {i=0;#asm("cli")delay(1000000); #asm("sei") }if(i==6) //若数组存满6个字节{comm_flag=1; //命令帧接收完毕,将接收完毕标志置位 } } }/*****************************//******USART0发送命令帧程序******/ void send_comm(void) {uchar j;if(comm_flag==1) //命令帧接收完毕后才允许发送,////应在发送前进行校验,在此不予考虑//// {#asm("cli")if(check_comm()) {for(j=0;j<6;j++) {usart0_transcomm(j); //调用单字节发送程序 } }#asm("sei") i=0; }comm_flag=0; //命令帧发送完毕后,接收完毕标志清零 }/*******************************//****主程序****/ void main(void) {init_device();while(1) {save_comm(); send_comm(); }}。

avr单片机USART串口通讯初始化配置说明

avr单片机USART串口通讯初始化配置说明

avr单片机USART串口通讯初始化配置说明avr atmega16 单片机通用同步和异步串行接收器和转发器(USART)是一个高度灵活的串行通讯设备,其工作模式及其初始化,寄存器说明如下。

//*******************USART控制和状态寄存器A(UCSRA)*************** /*USART 控制和状态寄存器A(UCSRA)bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0RXC TXC UDRE FE DOR PE U2X MPCMRXC: USART 接收结束接收缓冲器中有未读出的数据时RXC 置位,否则清零。

接收器禁止时,接收缓冲器被刷新,导致RXC 清零。

RXC 标志可用来产生接收结束中断TXC: USART 发送结束发送移位缓冲器中的数据被送出,且当发送缓冲器(UDR) 为空时TXC 置位。

执行发送结束中断时TXC 标志自动清零,也可以通过写0进行清除操作。

TXC 标志可用来产生发送结束中断( 见对TXCIE 位的描述)。

UDRE: USART 数据寄存器空UDRE标志指出发送缓冲器(UDR)是否准备好接收新数据。

UDRE为1说明缓冲器为空,已准备好进行数据接收。

UDRE标志可用来产生数据寄存器空中断复位后UDRE 置位,表明发送器已经就绪。

FE: 帧错误如果接收缓冲器接收到的下一个字符有帧错误,即接收缓冲器中的下一个字符的第一个停止位为0,那么FE 置位。

这一位一直有效直到接收缓冲器(UDR) 被读取。

当接收到的停止位为1 时,FE 标志为0。

对UCSRA 进行写入时,这一位要写0。

DOR: 数据溢出数据溢出时DOR 置位。

当接收缓冲器满( 包含了两个数据),接收移位寄存器又有数据,若此时检测到一个新的起始位,数据溢出就产生了。

这一位一直有效直到接收缓冲器(UDR) 被读取。

对UCSRA 进行写入时,这一位要写0。

PE: 奇偶校验错误当奇偶校验使能(UPM1 1),且接收缓冲器中所接收到的下一个字符有奇偶校验错误时UPE 置位。

AVR单片机ATmega16与计算机串行通信的实现

AVR单片机ATmega16与计算机串行通信的实现

AVR单片机ATmega16与计算机串行通信的实现韦晓茹;蔡志坚;居戬之【期刊名称】《微型机与应用》【年(卷),期】2012(31)14【摘要】介绍AVR单片机ATmega16和计算机的串行通信的软、硬件设计,采用VisualBasic6.0中的MSComm通信控件实现计算机与单片机ATmega16之间的串行通信。

文章详细阐述了程序的设计流程,并给出了部分程序代码。

实验证明该系统可以实现ATmega16与计算机之间的通信。

%The hardware and software of serial EIA-232 communication between AVR single chip ATmegal6 and the computer are proposed. Communication control MSComm is used to realize the communication between the computer and the single chip. The flows of the program design are illustrated in details, and parts of program are also given. The experiment result indicates that the system works well.【总页数】4页(P30-33)【作者】韦晓茹;蔡志坚;居戬之【作者单位】苏州大学信息光学工程研究所,江苏苏州215006;苏州大学信息光学工程研究所,江苏苏州215006;苏州大学信息光学工程研究所,江苏苏州215006【正文语种】中文【中图分类】TN386.5【相关文献】1.Delphi环境下实现与AVR单片机的串行通信 [J], 李凯;左文香;夏国明;郭玉霞;张铁壁2.基于AVR单片机ATmega16的小型农用气象站设计 [J], 赵建周;韩庆妙3.PC机与AVR单片机之间串行通信的实现 [J], 丁易新4.PC机与AVR单片机之间串行通信的实现 [J], 姜文谦5.PC机与AVR单片机之间串行通信的实现 [J], 夏博锐因版权原因,仅展示原文概要,查看原文内容请购买。

5.ATmega16串行通信及AVR其他资源

5.ATmega16串行通信及AVR其他资源

五、异步串行通行通信UART 2、ATmega16串行通信口结构特点
(1)特点
● 全双工操作( 独立的串行接收和发送寄存器) ●异步或同步操作
● 高精度的波特率发生器
●支持5, 6, 7, 8, 或9 个数据位和1 个或2 个停止位 ● 硬件支持的奇偶校验操作 ● 帧错误检测 ●三个独立的中断:发送结束中断, 发送数据寄存器空中断,以及接收 结束中断 ● 多处理器通讯模式 ● 倍速异步通讯模式
五、异步串行通行通信UART
(2)控制和状态寄存器—UCSRA
• Bit 1 – U2X: 倍速发送 这一位仅对异步操作有影响。使用同步操作时将此位清零。 此位置1 可将波特率分频因子从16 降到8,传输速率加倍。 • Bit 0 – MPCM: 多处理器通信模式 设置此位将启动多处理器通信模式。MPCM 置位后,USART 接收器 接收到的那些不包含地址信息的输入帧都将被忽略。发送器不受MPCM 设置的影响。
五、异步串行通行通信UART
(3)控制和状态寄存器—UCSRB、C
UCSRC寄存器与波特率寄存器UBRRH寄存器共用相同的I/O地址。对 该寄存器的访问, “访问UBRRH/ UCSRC 寄存器” 。 • Bit 7 – URSEL: 寄存器选择 通过该位选择访问UCSRC 寄存器或UBRRH 寄存器。当读/写UCSRC 时,URSEL 为1。 • Bit 6 – UMSEL: USART 模式选择 通过这一位来选择同步或异步工作模式。
只有当UCSRA寄存器的UDRE标志置位后才可以对发送缓冲器进 行写操作。如果UDRE没有置位,写UDR 被忽略。 /*********以下是发送数据函数********/ void uart0_send(unsigned char i) { while(!(UCSRA&(1<<UDRE))); //只有数据寄存器为空时才能发送数据

AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信

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。

接收器支持与发送器相同的帧格式,而且可以检测帧错误,数据过速和奇偶校验错误。

GYJ-0144_ ATMEGA16A单片机精简开发板 AVR单片机可编程开发板 带串口通讯

GYJ-0144_ ATMEGA16A单片机精简开发板 AVR单片机可编程开发板 带串口通讯

【图片展示】
4. power voltage ♦ 供电电压
DC5V
具有电源指示灯
具有螺旋压接供电端子
支持 USB 供电 排针供电 下载口供电
所有 PB 口有四位指示灯
支持串口通讯
四位独立按键输入
带手动复位功能
5. Features♦ 主要特征
所有 IO 口都引出
可插拔单片机芯片座
标准的 8M 晶振(晶振可插拔可以自行更
换)
具有上电复位和手动复位
C 语言编程提供原理图、尺寸 Nhomakorabea、例程、编程软件,
下载软件
6. Ambient Temperature ♦ 环境温度 -30℃ to +70℃
7. Ambient humidity♦ 环境湿度
20% to 80%RH
【标注说明】
【提供资料】
【原理图】提供 PDF 格式 【尺寸图】
【简要说明】
序 号 Type ♦ 产品型号
GYJ-0144
1. Appearance♦ 产品外形图
参考图在下面
2. Outline ♦ 外形尺寸 长 x 宽 x 高 85mmX 61mmX 18mm
3. Important chips♦ 重要芯片
ATMEGA16A/16L、ATMEGA32A/32L

AT-mega系列单片机原理及应用第5章-ATmega-单片机的串行通信接口99133课件

AT-mega系列单片机原理及应用第5章-ATmega-单片机的串行通信接口99133课件
• 所有USART 寄存器的位定义 • 波特率发生器 • 发送器操作 • 发送缓冲器的功能 • 接收器操作
• 2、接收器缓冲器有两个方面的改进:
• 增加了一个缓冲器。两个缓冲器的操作好象是一 个循环的FIFO。因此对于每个接收到的数据只能 读一次!更重要的是错误标志FE 和DOR,以及 第9个数据位RXB8与数据一起存放于接收缓冲器。 因此必须在读取UDR 寄存器之前访问状态标志位。 否则将丢失错误状态。
}
5.2 全双工的串行设备接口SPI的功能及使用方法 5.2.1 从机模式
当SPI 配置为主机时,从机选择引脚SS 总是为输 入。SS 为低将激活SPI 接口, MISO成为输出( 用户 必须进行相应的端口配置) 引脚,其他引脚成为输入 引脚。当SS 为高时,所有的引脚成为输入,SPI 逻辑 复位,不再接收数据。
SPIF WCOL MODF
XTAL
MSB
除法器 +4+16+64+128
选择
SPI时钟(主)
8位移位寄存器 读数据缓冲器
LSB
时钟 时钟逻辑
SPR1 SPR0
SPI控制
MSTR SPE
SPI状态寄存器
88
SPI控制寄存器
SPI中断请求 内部数据总线
SPIE SPE DWOM MSTR CPOL CPHA SPR1 SPR0
工作于SPI 从机模式时,控制逻辑对SCK 引脚的 输入信号进行采样。为了保证对时钟信号的正确采样, SPI 时钟不能超过fosc/4。
SPI 使能后,MOSI、MISO、SCK 和SS 引脚的 数据方向将按照表5.1所示自动进行配置。
表5.1 SPI引脚重载
例5.1 将SPI 初始化为主机,以及进行简单的数据发 送 。 其 中 DDR_SPI 必 须 由 实 际 的 数 据 方 向 寄 存 器 代 替 ; DD_MOSI、DD_MISO和DD_SCK必须由实际的数据代替。 如MOSI 为PB5 引脚,则DD_MOSI 要用DDB5 取代, DDR_SPI 则用DDRB 取代。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于AVR单片机--Atmega16的串口通信使用
//以下程序经验正可以用,MCU:M16,晶振:8M,直接用USB转串口线上的公头(针头),
//第2针(RXD)接M16上的PD1口(15脚TXD),第3针(TXD)接M16上的PD0口(14脚RXD),
//第5针接地,此时若板上有MAX232,则需把MAX232芯片去掉,这样才能正常工作
#include<avr/io.h>
#include<avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 8000000//晶振频率
#define BAUD 9600 //波特率
void USART_send(uchar date)//发送一个字节
{
while(!(UCSRA&(1<<UDRE)));//等待USART数据寄存器为空,UDRE为1说明缓冲器为空,已准备好进行数据接收或发送
UDR=date;//发送数据
}
void init()
{
DDRB=0xff;//设置PB口为输出
PORTB&=~(_BV(PB4)|_BV(PB5)|_BV(PB6)|_BV(PB7));//让高4位的LED灭
//波特率寄存器设置
UBRRH=(fosc/BAUD/16-1)/256;
UBRRL=(fosc/BAUD/16-1)%256;
//UCSRB|=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
UCSRB|=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//使能发送,接收,接收完成中断
sei();//开全局中断
}
int main()
{
init();
USART_send('d');//发送数据'd'
while(1);
}
volatile char date1;
SIGNAL(SIG_UART_RECV)
{
date1=UDR;//接收数据
PORTB=date1;
}。

相关文档
最新文档