ATmega128几个常用程序例子_第1页
ATmega128几个常用程序例子_第2页
ATmega128几个常用程序例子_第3页
ATmega128几个常用程序例子_第4页
ATmega128几个常用程序例子_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。于是自己去买了一块16L的芯片,觉得还行。一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的

2、同文件不一样。icc avr 是iom128v.h(姑且以128为例),winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。其实前两个软件只需把头文件稍微改一下基本上可以通用。而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h

3、>#define  uchar unsigned char#define  uint  unsigned intuchar cnt;void timer1_init()    TCCR1B=0X00;   /先停止定时器1    TCNT1H=0XF0;   /设定定时器初值    TCNT1L=0XBE;       TCCR1A=0X00;   /启动定时器

4、1    TCCR1B=0X05;   /使用1024分频interrupt TIM1_OVF void timer1_ovf_isr(void)      TCNT1H=0XF0;      /重载定时器初值      TCNT1L=0XBE;            DDRE|=1<<

5、2;      PORTE|=1<<2;      DDRA=0xff;      PORTA=cnt;        /输出led的值到端口B      cnt+;      if(cnt=255)      cnt

6、=0;void main()    /DDRB=0XFF;    SREG|=0X80;    TIMSK=0X04;    timer1_init();    while(1)    ;    2、AD转换+数码管显示/*/*ADC测试程序            &#

7、160;                             */*目标器件:ATmega128                  &#

8、160;               */*晶振:RC 8MHZ                                 

9、      */*编译环境:ICCAVR 7.13A                                 */*E-Mail:number007cool     

10、60;                                       */*时间:2010年11月13日        

11、60;                                            */Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD

12、转换的结果*/*/*包含头文件*/#include <iom128v.h>#include <macros.h>/*数码管段码表*/extern const unsigned char tab=0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,                         &

13、#160;        0x7F,0x6F;/*全局变量*/unsigned int adc_rel=0;/*函数功能:ADC初始化函数入口参数:出口参数:*/void adc_init(void)DDRF&=0XFE;      /PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE;  /PORTF0设置为输入低电平ADCSRA=0x00;  /关ADCADMUX = 0X00;   

14、;    /采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);/ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64/*函数功能:ADC中断函数入口参数:出口参数:*/#pragma interrupt_handler adc_isr:iv_ADCvoid adc

15、_isr(void)   /int data_h,data_l;  /data_l=ADCL;  /data_h=ADCH;  ADCSRA = 0x00;    ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);   adc_rel=ADC;  /*  if(adc_rel>0x1ff)       PORTA|=1<<2;    else &

16、#160;     PORTA&=(1<<2);   */ /*函数功能:延时子程序入口参数:出口参数:*/void delay(void)   int i;    for(i=0;i<1800;i+);/*函数功能:显示子程序入口参数:k出口参数:*/void display(unsigned int k)/发光二极管显示初始化  DDRE|=1<<2; PORTE|=1<<2; DDRA=0X

17、FF; PORTA=k;#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=(1<<SS)#define led0_en() DDRB|=1<<4;PORTB|=(1<<4);     /开第一个数码管的位选#define led0_dis() DDRB|=1<<4;PORTB&=(1<&l

18、t;4);    /关第一个数码管的位选#define led1_en() DDRB|=1<<5;PORTB|=(1<<5);#define led1_dis() DDRB|=1<<5;PORTB&=(1<<5);#define led2_en() DDRB|=1<<6;PORTB|=(1<<6);#define led2_dis() DDRB|=1<<6;PORTB&=(1<<6);#define led3_en

19、() DDRB|=1<<7;PORTB|=(1<<7);#define led3_dis() DDRB|=1<<7;PORTB&=(1<<7);#define OE 7#define point   3#define dp  7#include <iom128v.h>#include <macros.h>const unsigned char table=0x3F,0x06,0x5B,0x4F,0x66,     &

20、#160;       /0,1,2,3,4                                 0x6D,0x7D,0x07,0x7F,0x6F,     

21、        /5,6,7,8,9               0x77,0x7C,0x39,0x5E,0x79,0x71,0x00;              /a,b,c,d,e,fvolatile unsigned char led_buffer4;v

22、oid delay_1us(void)                 /1us延时函数     asm("nop");  void delay_nus(unsigned int n)       /N us延时函数     unsigned int i=0;   fo

23、r (i=0;i<n;i+)   delay_1us();    void delay_1ms(void)                 /1ms延时函数     unsigned int i;   for (i=0;i<1140;i+);    void delay_nms(unsigned int n)

24、0;      /N ms延时函数     unsigned int i=0;   for (i=0;i<n;i+)   delay_1ms();  /*完成spi的初始化*/void spi_init(void)   DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);/设置MOSI,SCK输出   SPCR = (1<<SPE)|(1<<M

25、STR)|(1<<SPR0)|(1<<SPR1);/使能SPI,主机模式/*spi主机传送数据*/void SPI_MasterTransmit(char Data)   /* 启动数据传输 */   SPDR = Data;   /* 等待传输结束 */   while(!(SPSR & (1<<SPIF)   ;/*完成对HC595的初始化*/void HC_595_init(void) DDRC |= (1<<OE);

26、60;  /设置PORTC7为输出 PORTC &= (1<<OE);  /输出高电平,使能595 PORTB = 0x0F;      /同时打开四个数码管的位选 spi_init(); led_buffer0=16;  /初始化数码管段码 led_buffer1=16; led_buffer2=16; led_buffer3=16;/*HC595完成传送数据*/void HC_595_OUT(unsigned char d

27、ata)   SS_L();  SPI_MasterTransmit(data);   SS_H();void leddis_update(void)  /*最低位数码管,第四个数码管*/  if(point=0)  HC_595_OUT(tableled_buffer3|(1<<dp);  else  HC_595_OUT(tableled_buffer3);  led0_en();   delay_nus(60);   led0_dis();

28、0;     if(point=1)  HC_595_OUT(tableled_buffer2|(1<<dp);   else  HC_595_OUT(tableled_buffer2);  led1_en();   delay_nus(60);   led1_dis();   if(point=2)  HC_595_OUT(tableled_buffer1|(1<<dp);   else  HC_595_OUT(tableled_buffe

29、r1);  led2_en();   delay_nus(60);   led2_dis();  /*最高位数码管,第一个数码管*/  if(point=3)  HC_595_OUT(tableled_buffer0|(1<<dp);  else  HC_595_OUT(tableled_buffer0);   led3_en();   delay_nus(60);   led3_dis();void display_led(unsigned int data) 

30、 if(data>9999)       HC_595_OUT(0xFF);/当计数大于9999时,四个数码管同时输出8  PORTB|=(1<<4)|(1<<5)|(1<<6)|(1<<7);     else if(data>999)   led_buffer0=data/1000;        led_buffer1=(data%1000)/100; 

31、; led_buffer2=(data%100)/10;  led_buffer3=data%10;  leddis_update();   else if(data>99)   led_buffer0=data/1000;         /关闭最高位的那个数码管  led_buffer1=(data%1000)/100;  led_buffer2=(data%100)/10;  led_buffer3=da

32、ta%10;  leddis_update();    else if(data>9)    led_buffer0=data/1000;       led_buffer1=16;     led_buffer2=(data%100)/10;     led_buffer3=data%10;     leddis_update(); 

33、60;else    led_buffer0=data/1000;       led_buffer1=16;     led_buffer2=16;     led_buffer3=data%10;     leddis_update();   volatile unsigned int countnum=0; void timer1_init(void) 

34、;TCCR1B = 0x00; /stop TCNT1H = 0x8F; /setup TCNT1L = 0x81; OCR1AH = 0x70; OCR1AL = 0x7F; OCR1BH = 0x70; OCR1BL = 0x7F; OCR1CH = 0x70; OCR1CL = 0x7F; ICR1H  = 0x70; ICR1L  = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; /start Timer#pragma i

35、nterrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void) TCNT1H = 0x8F; /reload counter high value TCNT1L = 0x81; /reload counter low value countnum+; if(countnum>9999) countnum=0;void init_devices(void) CLI(); /disable all interrupts timer1_init(); TIMSK = 0

36、x04; /timer interrupt sources SEI(); /re-enable interrupts/*函数功能:主程序入口参数:出口参数:*/void main(void)  init_devices();   HC_595_init();  adc_init();  SEI();/开全局中断变量  display(0);  while(1)      delay();    display_led(adc_rel/1024.0*5*10

37、00);  3、对EEPROM进行读写操作 /*文件:main.c用途:注意:内部8M晶振*/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData) while(EECR&(1<<EEWE);    /等待上一次写操作结束 EEAR = uiAddress;     /地址 EE

38、DR = ucData;      /数据 EECR |=(1<<EEMWE);     /置位EEMWE,主机写使能 EECR |=(1<<EEWE);     /置位EEWE,写使能,启动写操作/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress) while(EECR&(1<<EEWE);

39、60; /等待上一次写操作结束 EEAR = uiAddress;       /设置地址寄存器 EECR |=(1<<EERE);       /读使能 return EEDR;            /返回读入EEDR里面的数据void main(void) unsigned char temp=123;

40、0;unsigned char data; HC_595_init();  EEPROM_write(0x01,temp); data=EEPROM_read(0x01); while(1)     Seg7_Led_display(data);  /调用显示函数将写入的数据又读出来 文件:eeprom12.rar大小:40KB下载:下载4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。在此模式下,计数器不断的累加,当计数到最大值0x

41、ff后返回到0x00重新开始,在TCNT0为0 的同时,T/C溢出标志TOV0置位*/使用轮循方式,当TIFR溢出时,uc_led加1,输出到led时期发光/TIFR中断标志寄存器#include <iom128v.h>#define uchar unsigned charuchar uc_led,k;void main()/设置数码管输出高电平 DDRE|=1<<2;      PORTE|=1<<2; DDRA=0XFF; PORTF=0XFF;  TCN

42、T0=0X00;/设定定时计数器的初值为0 TCCR0=0X05;/使用1024分频(共有7种时钟) uc_led=0; k=0;  while(1)   while(!(TIFR&0X01);/循环检测TIFR中的溢出标志是否有效  /PORTA=uc_led;  uc_led+;  if(uc_led=255)   uc_led=0;  k+; if(k=255)   k=0;   PORTA=k;

43、60; TIFR|=0X01; /写1到TIFR的TOV0位清除溢出标志为TOV0 5、定时器0中中断/*/*定时器T0测试程序                                      */*

44、目标器件:ATmega128                                  */*晶振:RC 8MHZ            &#

45、160;                          */*编译环境:ICCAVR 7.13                     

46、                   */*E-Mail:number007cool                            

47、                 */*时间:2010年3月14日                               &

48、#160;                      */*TCCRn定时计数器控制寄存器  TCNTn计数器,不断的计数  TIMSK定时计数器中断屏蔽寄存器  TIFR中断标志寄存器*/*/*包含头文件*/#include <iom128v.h>#include <macros.h>/*全局变量*/int k;/*函数功能:端口初

49、始化程序入口参数:出口参数:*/void port_init (void)   DDRE|=1<<2;  PORTE|=1<<2;  DDRA=0XFF;  PORTA=0XFF;/*函数功能:定时器初始化程序入口参数:出口参数:*/void timer0_init(void)   TCCR0 = 0x00; /stop    ASSR  = 0x00; /set async mode    TCNT0 = 0x3c;    OCR

50、0  = 0x00;   TCCR0 = 0x05; /1024分频/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragma interrupt_handler timer0_ovf_isr:17void timer0_ovf_isr(void)   TCNT0 = 0x3c;   k=k+1;   if(k>150)      k=0;   PORTA = 0x01;   /*函数功能:主程序入口参数:出口

51、参数:*/void main (void)   CLI();     /disable all interrupts    port_init();   timer0_init();   MCUCR = 0x00;  TIMSK = 0x01;    /T0溢出使能   SEI();      /enable interrupts    

52、6、定时器1测试程序/*/*定时器T1测试程序                                      */*/*包含头文件*/#include <iom128v.h>#include <mac

53、ros.h>/*全局变量*/int k;/*函数功能:端口初始化程序入口参数:出口参数:*/void port_init (void)     DDRE|=1<<2;  PORTE|=1<<2;   DDRA=0XFF;   PORTA=0XFF;/*函数功能:定时器初始化程序入口参数:出口参数:*/void timer1_init(void) TCCR1B = 0x00; /stop,关掉 TCNT1H = 0xFF; /setup  0.2s

54、设置高4位初值 TCNT1L = 0x3D; /设置低四位初值  OCR1AH = 0x00;  OCR1AL = 0xC3;  OCR1BH = 0x00; OCR1BL = 0xC3;  OCR1CH = 0x00; OCR1CL = 0xC3;  ICR1H  = 0x00; ICR1L  = 0xC3;  TCCR1A = 0x00; TCCR1B = 0x05; /start Timer  102

55、4/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void)   TCNT1H = 0xFF; /reload counter high value   TCNT1L = 0x3D; /reload counter low value   k=k+1;   if(k>40)      k=0;   PORTA = 0x0

56、1;   /*函数功能:主程序入口参数:出口参数:*/void main (void)   CLI();     /disable all interrupts    port_init();   timer1_init();   MCUCR = 0x00;  TIMSK = 0x04;    /T0溢出使能   SEI();      /enab

57、le interrupts      7、定时器1测试程序之二/*/*定时器T1测试程序                                      */*定时时间为1秒

58、60;                 */*/*包含头文件*/#include <iom128v.h>#include <macros.h>/*全局变量*/int countnum;/*函数功能:端口初始化程序入口参数:出口参数:*/void port_init (void)     DDRE|=1<<2;  PORTE|=1<<2;&#

59、160;  DDRA=0XFF;   PORTA=0XFF;/*函数功能:定时器初始化程序入口参数:出口参数:*/void timer1_init(void) TCCR1B = 0x00; /stop TCNT1H = 0x8F; /setup TCNT1L = 0x81; OCR1AH = 0x70; OCR1AL = 0x7F; OCR1BH = 0x70; OCR1BL = 0x7F; OCR1CH = 0x70; OCR1CL = 0x7F; ICR1H&#

60、160; = 0x70; ICR1L  = 0x7F; TCCR1A = 0x00; TCCR1B = 0x04; /start Timer/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void) TCNT1H = 0x8F; /reload counter high value TCNT1L = 0x81; /reload counter low value countnum+; 

61、if(countnum=256) countnum=0;/*函数功能:主程序入口参数:出口参数:*/void main (void)   CLI();     /disable all interrupts    port_init();   timer1_init();  TIMSK = 0x04;    /T0溢出使能   SEI();      /enable interrupts

62、    while(1)     PORTA=countnum;       8、串口通信(USART0) /*/*串口0测试程序                              

63、            */*目标器件:ATmega128                                  */*晶振:RC 8MHZ

64、0;                                      */*编译环境:ICCAVR 7.13A         &

65、#160;                       */*时间:2010年3月14日*/*E-Mail:number007cool                    

66、60;                        */*/*包含头文件*/#include<iom128v.h>#include<macros.h>/*宏定义*/#define fosc 8000000  /晶振8MHZ#define baud 2400  /波特率/*函数功能:uart0初始化程序入口参数:出

67、口参数:*/void uart0_init(void) UCSR0B = 0x00;                     /关闭UART00 UCSR0A = 0x00;                  

68、    /不使用倍速发送(异步) UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);    /数据位为8位 UBRR0L=(fosc/16/(baud+1)%256;      /异步正常情况下的计算公式 UBRR0H=(fosc/16/(baud+1)/256; UCSR0B =(1<<RXEN0)|(1<<TXEN0);     

69、/接收使能和发送使能/*函数功能:uart0发送单字节数据入口参数:c出口参数:*/void putchar0(unsigned char c)          while (!(UCSR0A&(1<<UDRE0);/表明发送器已经准备就绪    UDR0=c;    /将要发送的数据装入UDR0寄存器   /*函数功能:uart0接收单字节数据入口参数:出口参数:*/unsigned char getc

70、har0(void)       while(!(UCSR0A& (1<<RXC0);/表明已经接收完毕       return UDR0;  /*函数功能:uart0发送字符串数据入口参数:*s出口参数:*/   void puts0(char *s)  while (*s)    putchar0(*s);  s+;       putchar0(0x0a);/回车换行 /putchar0(0x0d);   /*函数功能:主程序入口参数:出口参数:*/v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论