ATmega128几个常用程序例子

上传人:仙*** 文档编号:89182812 上传时间:2022-05-12 格式:DOC 页数:38 大小:159.50KB
返回 下载 相关 举报
ATmega128几个常用程序例子_第1页
第1页 / 共38页
ATmega128几个常用程序例子_第2页
第2页 / 共38页
ATmega128几个常用程序例子_第3页
第3页 / 共38页
点击查看更多>>
资源描述
ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用.于是自己去买了一块16L的芯片,觉得还行.一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好.后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用.后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样.icc avr 是iom128v.h姑且以128为例,winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h.记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的.其实前两个软件只需把头文件稍微改一下基本上可以通用.而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的.总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include #define uchar unsigned char#define uint unsigned intuchar t;void timer1_init TCCR1B=0X00; /先停止定时器1 TT1H=0XF0; /设定定时器初值 TT1L=0XBE; TCCR1A=0X00; /启动定时器1 TCCR1B=0X05; /使用1024分频interrupt TIM1_OVF void timer1_ovf_isr TT1H=0XF0; /重载定时器初值 TT1L=0XBE; DDRE|=12; PORTE|=12; DDRA=0xff; PORTA=t; /输出led的值到端口B t+; if t=0;void main /DDRB=0XFF; SREG|=0X80; TIMSK=0X04; timer1_init; while ; 2、AD转换+数码管显示/*/*ADC测试程序 */*目标器件:ATmega128 */*晶振:RC 8MHZ */*编译环境:ICCAVR 7.13A */*E-Mail:number007cool163 */*时间:2010年11月13日 */Aref接AVCC,采用Aref作参考电压/*用数码管显示AD转换的结果*/*/*包含头文件*/#include #include /*数码管段码表*/extern const unsigned char tab=0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F;/*全局变量*/unsigned int adc_rel=0;/*函数功能:ADC初始化函数入口参数:出口参数:*/void adc_initDDRF&=0XFE; /PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; /PORTF0设置为输入低电平ADCSRA=0x00; /关ADCADMUX = 0X00; /采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=1;ADCSRA = 1|1|1|1|1|1;/ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64/*函数功能:ADC中断函数入口参数:出口参数:*/#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr /int data_h,data_l; /data_l=ADCL; /data_h=ADCH; ADCSRA = 0x00; ADCSRA = 1|1|1; adc_rel=ADC; /* if0x1ff PORTA|=12; else PORTA&=1; */*函数功能:延时子程序入口参数:出口参数:*/void delay int i; fori=0;i;/*函数功能:显示子程序入口参数:k出口参数:*/void display/发光二极管显示初始化 DDRE|=12;PORTE|=12;DDRA=0XFF;PORTA=k;#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H PORTB|=1#define SS_L PORTB&=1#define led0_enDDRB|=14;PORTB|=1; /开第一个数码管的位选#define led0_disDDRB|=14;PORTB&=1; /关第一个数码管的位选#define led1_enDDRB|=15;PORTB|=1;#define led1_disDDRB|=15;PORTB&=1;#define led2_enDDRB|=16;PORTB|=1;#define led2_disDDRB|=16;PORTB&=1;#define led3_enDDRB|=17;PORTB|=1;#define led3_disDDRB|=17;PORTB&=1;#define OE 7#define point 3#define dp 7#include #include const unsigned char table=0x3F,0x06,0x5B,0x4F,0x66, /0,1,2,3,4 0x6D,0x7D,0x07,0x7F,0x6F, /5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00; /a,b,c,d,e,fvolatile unsigned char led_buffer4;void delay_1us /1us延时函数 asm; void delay_nus /N us延时函数 unsigned int i=0; for i=0;i delay_1us; void delay_1ms /1ms延时函数 unsigned int i; for i=0;i; void delay_nms /N ms延时函数 unsigned int i=0; for i=0;i delay_1ms; /*完成spi的初始化*/void spi_init DDRB |= 1|1|1;/设置MOSI,SCK输出 SPCR = 1|1|1|1;/使能SPI,主机模式/*spi主机传送数据*/void SPI_MasterTransmit /* 启动数据传输 */ SPDR = Data; /* 等待传输结束 */ while!SPSR & 1 ;/*完成对HC595的初始化*/void HC_595_initDDRC |= 1; /设置PORTC7为输出PORTC &= 1; /输出高电平,使能595PORTB = 0x0F; /同时打开四个数码管的位选spi_init;led_buffer0=16; /初始化数码管段码led_buffer1=16;led_buffer2=16;led_buffer3=16;/*HC595完成传送数据*/void HC_595_OUT SS_L; SPI_MasterTransmit; SS_H;void leddis_update /*最低位数码管,第四个数码管*/ if HC_595_OUTtableled_buffer3|1; else HC_595_OUT; led0_en; delay_nus; led0_dis; if HC_595_OUTtableled_buffer2|1; else HC_595_OUT; led1_en; delay_nus; led1_dis; if HC_595_OUTtableled_buffer1|1; else HC_595_OUT; led2_en; delay_nus; led2_dis; /*最高位数码管,第一个数码管*/ if HC_595_OUTtableled_buffer0|1; else HC_595_OUT; led3_en; delay_nus; led3_dis;void display_led if9999 HC_595_OUT;/当计数大于9999时,四个数码管同时输出8 PORTB|=1|1|1|1; else if999 led_buffer0=data/1000; led_buffer1=/100; led_buffer2=/10; led_buffer3=data%10; leddis_update;else if99 led_buffer0=data/1000; /关闭最高位的那个数码管 led_buffer1=/100; led_buffer2=/10; led_buffer3=data%10; leddis_update; else if9 led_buffer0=data/1000; led_buffer1=16; led_buffer2=/10; led_buffer3=data%10; leddis_update;else led_buffer0=data/1000; led_buffer1=16; led_buffer2=16; led_buffer3=data%10; leddis_update;volatile unsigned int countnum=0; void timer1_initTCCR1B = 0x00; /stopTT1H = 0x8F; /setupTT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; /start Timer#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isrTT1H = 0x8F; /reload counter high valueTT1L = 0x81; /reload counter low valuecountnum+;if9999 countnum=0;void init_devicesCLI; /disable all interruptstimer1_init;TIMSK = 0x04; /timer interrupt sourcesSEI; /re-enable interrupts/*函数功能:主程序入口参数:出口参数:*/void main init_devices; HC_595_init; adc_init; SEI;/开全局中断变量 display; while delay; display_led; 3、对EEPROM进行读写操作/*文件:main.c用途:注意:内部8M晶振*/#include config.h/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_writewhileEECR&1; /等待上一次写操作结束EEAR = uiAddress; /地址EEDR = ucData; /数据EECR |=1; /置位EEMWE,主机写使能EECR |=1; /置位EEWE,写使能,启动写操作/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_readwhileEECR&1; /等待上一次写操作结束EEAR = uiAddress; /设置地址寄存器EECR |=1; /读使能return EEDR; /返回读入EEDR里面的数据void mainunsigned char temp=123;unsigned char data;HC_595_init;EEPROM_write;data=EEPROM_read;while Seg7_Led_display; /调用显示函数将写入的数据又读出来文件:eeprom12.rar大小:40KB下载:下载4、定时器0轮循方式/*定时器0和2均为八位的定时计数器有四种工作模式,此例是工作在普通模式.在此模式下,计数器不断的累加,当计数到最大值0xff后返回到0x00重新开始,在TT0为0 的同时,T/C溢出标志TOV0置位*/使用轮循方式,当TIFR溢出时,uc_led加1,输出到led时期发光/TIFR中断标志寄存器#include #define uchar unsigned charuchar uc_led,k;void main/设置数码管输出高电平DDRE|=12; PORTE|=12;DDRA=0XFF;PORTF=0XFF;TT0=0X00;/设定定时计数器的初值为0TCCR0=0X05;/使用1024分频共有7种时钟uc_led=0;k=0;while while!;/循环检测TIFR中的溢出标志是否有效 /PORTA=uc_led; uc_led+; if uc_led=0; k+;if k=0; PORTA=k;TIFR|=0X01; /写1到TIFR的TOV0位清除溢出标志为TOV05、定时器0中中断/*/*定时器T0测试程序 */*目标器件:ATmega128 */*晶振:RC 8MHZ */*编译环境:ICCAVR 7.13 */*E-Mail:number007cool163 */*时间:2010年3月14日 */*TCCRn定时计数器控制寄存器 TTn计数器,不断的计数 TIMSK定时计数器中断屏蔽寄存器 TIFR中断标志寄存器*/*/*包含头文件*/#include #include /*全局变量*/int k;/*函数功能:端口初始化程序入口参数:出口参数:*/void port_init DDRE|=12; PORTE|=12; DDRA=0XFF; PORTA=0XFF;/*函数功能:定时器初始化程序入口参数:出口参数:*/void timer0_init TCCR0 = 0x00; /stop ASSR = 0x00; /set async mode TT0 = 0x3c; OCR0 = 0x00; TCCR0 = 0x05; /1024分频/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragma interrupt_handler timer0_ovf_isr:17void timer0_ovf_isr TT0 = 0x3c; k=k+1; if150 k=0; PORTA = 0x01; /*函数功能:主程序入口参数:出口参数:*/void main CLI; /disable all interrupts port_init; timer0_init; MCUCR = 0x00; TIMSK = 0x01; /T0溢出使能 SEI; /enable interrupts 6、定时器1测试程序/*/*定时器T1测试程序 */*/*包含头文件*/#include #include /*全局变量*/int k;/*函数功能:端口初始化程序入口参数:出口参数:*/void port_init DDRE|=12; PORTE|=12; DDRA=0XFF; PORTA=0XFF;/*函数功能:定时器初始化程序入口参数:出口参数:*/void timer1_initTCCR1B = 0x00; /stop,关掉TT1H = 0xFF; /setup 0.2s设置高4位初值TT1L = 0x3D; /设置低四位初值OCR1AH = 0x00; OCR1AL = 0xC3;OCR1BH = 0x00;OCR1BL = 0xC3;OCR1CH = 0x00;OCR1CL = 0xC3;ICR1H = 0x00;ICR1L = 0xC3;TCCR1A = 0x00;TCCR1B = 0x05; /start Timer 1024/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr TT1H = 0xFF; /reload counter high value TT1L = 0x3D; /reload counter low value k=k+1; if40 k=0; PORTA = 0x01; /*函数功能:主程序入口参数:出口参数:*/void main CLI; /disable all interrupts port_init; timer1_init; MCUCR = 0x00; TIMSK = 0x04; /T0溢出使能 SEI; /enable interrupts 7、定时器1测试程序之二/*/*定时器T1测试程序 */*定时时间为1秒 */*/*包含头文件*/#include #include /*全局变量*/int countnum;/*函数功能:端口初始化程序入口参数:出口参数:*/void port_init DDRE|=12; PORTE|=12; DDRA=0XFF; PORTA=0XFF;/*函数功能:定时器初始化程序入口参数:出口参数:*/void timer1_initTCCR1B = 0x00; /stopTT1H = 0x8F; /setupTT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; /start Timer/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isrTT1H = 0x8F; /reload counter high valueTT1L = 0x81; /reload counter low valuecountnum+;if countnum=0;/*函数功能:主程序入口参数:出口参数:*/void main CLI; /disable all interrupts port_init; timer1_init; TIMSK = 0x04; /T0溢出使能 SEI; /enable interrupts while PORTA=countnum; 8、串口通信USART0/*/*串口0测试程序 */*目标器件:ATmega128 */*晶振:RC 8MHZ */*编译环境:ICCAVR 7.13A */*时间:2010年3月14日*/*E-Mail:number007cool163 */*/*包含头文件*/#include#include/*宏定义*/#define fosc 8000000 /晶振8MHZ#define baud 2400/波特率/*函数功能:uart0初始化程序入口参数:出口参数:*/void uart0_initUCSR0B = 0x00; /关闭UART00UCSR0A = 0x00; /不使用倍速发送异步UCSR0C =1|1; /数据位为8位UBRR0L=fosc/16/%256; /异步正常情况下的计算公式UBRR0H=fosc/16/256;UCSR0B =1|1; /接收使能和发送使能/*函数功能:uart0发送单字节数据入口参数:c出口参数:*/void putchar0 while !UCSR0A&1;/表明发送器已经准备就绪 UDR0=c; /将要发送的数据装入UDR0寄存器/*函数功能:uart0接收单字节数据入口参数:出口参数:*/unsigned char getchar0 while!UCSR0A& 1;/表明已经接收完毕 return UDR0;/*函数功能:uart0发送字符串数据入口参数:*s出口参数:*/void puts0while putchar0;s+; putchar0;/回车换行/putchar0;/*函数功能:主程序入口参数:出口参数:*/void mainunsigned char i;uart0_init;/UART0初始化puts0;while puts0; 9、串口通信USART1/*/*串口1测试程序 */*目标器件:ATmega128 */*晶振:RC 8MHZ */*选用的波特率:9600也可以另外设定,改了波特率后需要将电源拔了再插上方可使用*/*编译环境:ICCAVR 7.13 */*E-Mail:number007cool163 */*时间:2010年1月14日 */*/*包含头文件*/#include#include/*宏定义*/#define fosc 8000000 /晶振8MHZ#define baud 9600/波特率/*函数功能:uart1初始化程序入口参数:出口参数:*/void uart1_init /USART1初始化UCSR1B = 0x00; /关闭USART1UCSR1A = 0x00; /不适使用倍速发送UCSR1C = 1|1;/数据位为八位UBRR1L=fosc/16/%256;/异步正常模式下,UBRR的计算公式UBRR1H=fosc/16/256;UCSR1B =1|1;/
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!