AVR开发笔记

1、开发环境

采用AvrStudio+WinAVR。先装AvrStudio,再装WinAVR。下载及安装方法见:

http://jingyan.baidu.com/article/8cdccae9487d39315413cd88.html

2、硬件准备

开发板为arduino uno R3,芯片为atmega328p(单独买了一块atmega8),烧录器为Risym,淘宝买的。烧录软件为progisp1.72。芯片资料从atmel官网上下,地址:

http://www.atmel.com/search.aspx?filter=0&btnG=Search&site=en_collection&client=support_frontend&proxystylesheet=support_frontend&output=xml_no_dtd&getfields=*&oe=UTF-8&ie=UTF-8&ud=1&exclude_apps=1&num=1000&access=p&sort=date:D:L:d1&entqr=3&entqrm=0&lr=lang_en&ulang=&ip=10.120.2.11&wc=200&wc_mc=1&q=+inmeta:asset_type~Datasheets+inmeta:product_family%3DAtmel%2520AVR%25208%252D%2520and%252032%252Dbit%2520Microcontrollers&dnavs=inmeta:asset_type~Datasheets+inmeta:product_family%3DAtmel%2520AVR%25208%252D%2520and%252032%252Dbit%2520Microcontrollers 

烧录器与开发板用ISP连接,连接方法不提了。烧录器需进行设置,见下图

3、UART程序问题

winavr与avrstudio程序优化比较厉害,和keil后很多区别

1、不同芯片寄存器名不一样,已avrstudio右上角I/O view里的为准

2、中断响应函数声明方法为:SIGNAL(SIG_UART_RECV)//AVR Studio用此方式,SIG_UART_RECV是中断号,定义在winavr安装目录的iom16.h头文件中,文件位置在winavr安装目录/avr/include/avr

3、中断程序中操作的变量应在声明时加上 volatile 声明,否则gcc不认,会被优化掉

4、用cli();关中断,用sei();开中断。

5、头文件声明见源码

源码:

#include <avr/io.h>                //IO相关头文件
#include <avr/interrupt.h>         //中断相关头文件

#define LED_BIT     0x20     //定义LED对应的I/O口操作位
#define NOP()  __asm("nop")
volatile unsigned char RecvData;
volatile unsigned char UART_RecvData;

/*串口初始化函数*/
void Uart_Init(void)

 //UCSRA = 0x02;  /*倍速*/
 UCSRC = 0x86;  //异步,8位数据,无奇偶校验,一个停止位,无倍速
 UCSRA = 0x00;
 UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //使能接收,使能发送
 UBRRL = 103;  /*9600*/
 UART_RecvData = 0;
}
/*数据发送,查询方式*/
void Uart_Transmit(unsigned char i)
{
 while (!(UCSRA & (1<<UDRE)));  /* 等待发送缓冲器为空*/
 UDR = i;    /* 发送数据*/
}
//串口接收中断  
SIGNAL(SIG_UART_RECV)//AVR Studio用此方式
{     
 RecvData = UDR;            //发送接收到的字符
 UART_RecvData = 1;
 PORTB =~PORTB;//PD7 低电平LED 灭

int main(void)
{
 //unsigned char temp;
 DDRB = 0xFF;    /*方向输出*/
 PORTB = 0xFF;    /*电平设置*/
 PORTB |= LED_BIT;//PD7 高电平LED 亮
 cli();
 Uart_Init(); 
 sei();
 Uart_Transmit('O');
 Uart_Transmit('K');
 while (1)
 { 
  if(UART_RecvData == 1)
  {
   UART_RecvData = 0;
   Uart_Transmit(RecvData);
  }
 }
 return 0;
}

 

#include <iom16v.h> #include <macros.h> #define RS_0 PORTD &= ~(1 << PD3) #define RS_1 PORTD |= (1 << PD3) #define RW_0 PORTD &= ~(1 << PD4) #define RW_1 PORTD |= (1 << PD4) #define EN_0 PORTD &= ~(1 << PD6) #define EN_1 PORTD |= (1 << PD6) //微秒级延时程序晶振8MHZ void delay_us(int time) { do { time--; } while (time>1); } //毫秒级延时程序晶振8MHZ void delay_ms(unsigned int time) { while(time!=0) { delay_us(1000); time--; } } /*显示屏命令写入函数*/ void LCD_write_com(unsigned char com) { RS_0; RW_0; PORTB = com; EN_1; delay_us(20); EN_0; } /*显示屏命令写入函数*/ void LCD_write_data(unsigned char data) { RS_1; RW_0; PORTB = data; EN_1; delay_us(200); EN_0; } /*显示屏清空显示*/ void LCD_clear(void) { LCD_write_com(0x01); delay_ms(5); } /*显示屏字符串写入函数*/ void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_write_com(0x80 + x); } else { LCD_write_com(0xC0 + x); } while (*s) { LCD_write_data( *s); s ++; } } /*显示屏单字符写入函数*/ void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) { if (y == 0) { LCD_write_com(0x80 + x); } else { LCD_write_com(0xC0 + x); } LCD_write_data( data); } /*显示屏初始化函数*/ void LCD_init(void) { DDRB = 0xFF; /*I/O口方向设置*/ DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6); LCD_write_com(0x38); /*显示模式设置*/ delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); LCD_write_com(0x08); /*显示关闭*/ LCD_write_com(0x01); /*显示清屏*/ LCD_write_com(0x06); /*显示光标移动设置*/ delay_ms(5); LCD_write_com(0x0C); /*显示开及光标设置*/ } void main(void) { unsigned char i; unsigned char *p; PORTA = 0xFF; /*打开上拉*/ DDRA = 0x00; /*方向输入*/ PORTB = 0xFF; /*电平设置*/ DDRB = 0xFF; /*方向输出*/ PORTC = 0x7F; DDRC = 0x80; PORTD = 0xFF; DDRD = 0x00; delay_ms(100); LCD_init(); while (1) { i = 1; p = "yixiangongren"; //LCD_clear(); LCD_write_str(1,0,"www.eehome.cn"); delay_ms(50); while (*p) { LCD_write_char(i,1,*p); i ++; p ++; //delay_ms(50); } delay_ms(500); } } 本文来自: 电子工程师之家http://www.eehome.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值