基于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 指令来禁止中断时,中断禁止立即生效。

  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;
}。

相关文档
最新文档