ATmega128经典程序例子Word文档格式.docx
《ATmega128经典程序例子Word文档格式.docx》由会员分享,可在线阅读,更多相关《ATmega128经典程序例子Word文档格式.docx(42页珍藏版)》请在冰点文库上搜索。
![ATmega128经典程序例子Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/a12dbf7a-c482-4fc9-b4ba-411c416c9203/a12dbf7a-c482-4fc9-b4ba-411c416c92031.gif)
cnt=0;
voidmain()
//DDRB=0XFF;
SREG|=0X80;
TIMSK=0X04;
timer1_init();
while
(1)
{;
}
2、AD转换+数码管显示程序
/***************************************************************************/
/*ADC测试程序
*/
/*目标器件:
ATmega128
/*晶振:
RC8MHZ
/*编译环境:
ICCAVR7.13A
/*E-Mail:
number007cool@
/*时间:
2010年11月13日
//Aref接AVCC(+5V),采用Aref作参考电压
/*用数码管显示AD转换的结果*/
/*********************************包含头文件********************************/
iom128v.h>
macros.h>
/********************************数码管段码表*******************************/
externconstunsignedchartab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F};
/*********************************全局变量**********************************/
unsignedintadc_rel=0;
/****************************************************************************
函数功能:
ADC初始化函数
入口参数:
出口参数:
****************************************************************************/
voidadc_init(void)
DDRF&
=0XFE;
//PORTF0设置为输入,即作为ADC0口输入模拟电压
PORTF&
//PORTF0设置为输入低电平
ADCSRA=0x00;
//关ADC
ADMUX=0X00;
//采用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中断函数
#pragmainterrupt_handleradc_isr:
iv_ADC
voidadc_isr(void)
//intdata_h,data_l;
//data_l=ADCL;
//data_h=ADCH;
ADCSRA=0x00;
ADCSRA=(1<
ADIE);
adc_rel=ADC;
/*
if(adc_rel>
0x1ff)
{
PORTA|=1<
else
PORTA&
=~(1<
2);
延时子程序
voiddelay(void)
inti;
for(i=0;
i<
1800;
i++);
显示子程序
k
voiddisplay(unsignedintk)//发光二极管显示初始化
PORTE|=1<
DDRA=0XFF;
PORTA=k;
#defineSS0
#defineSCK1
#defineMOSI2
#defineMISO3
#defineSS_H()PORTB|=(1<
SS)
#defineSS_L()PORTB&
#defineled0_en()
{DDRB|=1<
4;
PORTB|=(1<
4);
}
//开第一个数码管的位选
#defineled0_dis()
PORTB&
//关第一个数码管的位选
#defineled1_en()
5;
5);
#defineled1_dis()
#defineled2_en()
6;
6);
#defineled2_dis()
#defineled3_en()
7;
7);
#defineled3_dis()
#defineOE7
#definepoint
3
#definedp
7
constunsignedchartable[]={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,f
volatileunsignedcharled_buffer[4];
voiddelay_1us(void)
//1us延时函数
asm("
nop"
);
voiddelay_nus(unsignedintn)
//Nus延时函数
unsignedinti=0;
for(i=0;
n;
i++)
delay_1us();
voiddelay_1ms(void)
//1ms延时函数
unsignedinti;
1140;
voiddelay_nms(unsignedintn)
//Nms延时函数
delay_1ms();
/*完成spi的初始化*/
voidspi_init(void)
DDRB|=(1<
MOSI)|(1<
SCK)|(1<
SS);
//设置MOSI,SCK输出
SPCR=(1<
SPE)|(1<
MSTR)|(1<
SPR0)|(1<
SPR1);
//使能SPI,主机模式
/*spi主机传送数据*/
voidSPI_MasterTransmit(charData)
/*启动数据传输*/
SPDR=Data;
/*等待传输结束*/
while(!
(SPSR&
(1<
SPIF)))
;
/*完成对HC595的初始化*/
voidHC_595_init(void)
DDRC|=(1<
OE);
//设置PORTC7为输出
PORTC&
=(1<
//输出高电平,使能595
PORTB=0x0F;
//同时打开四个数码管的位选
spi_init();
led_buffer[0]=16;
//初始化数码管段码
led_buffer[1]=16;
led_buffer[2]=16;
led_buffer[3]=16;
/*HC595完成传送数据*/
voidHC_595_OUT(unsignedchardata)
SS_L();
SPI_MasterTransmit(data);
SS_H();
voidleddis_update(void)
/*最低位数码管,第四个数码管*/
if(point==0)
HC_595_OUT(table[led_buffer[3]]|(1<
dp));
else
HC_595_OUT(table[led_buffer[3]]);
led0_en();
delay_nus(60);
led0_dis();
if(point==1)
HC_595_OUT(table[led_buffer[2]]|(1<
HC_595_OUT(table[led_buffer[2]]);
led1_en();
led1_dis();
if(point==2)
HC_595_OUT(table[led_buffer[1]]|(1<
HC_595_OUT(table[led_buffer[1]]);
led2_en();
led2_dis();
/*最高位数码管,第一个数码管*/
if(point==3)
HC_595_OUT(table[led_buffer[0]]|(1<
HC_595_OUT(table[led_buffer[0]]);
led3_en();
led3_dis();
voiddisplay_led(unsignedintdata)
if(data>
9999)
HC_595_OUT(0xFF);
//当计数大于9999时,四个数码管同时输出8
PORTB|=((1<
4)|(1<
5)|(1<
6)|(1<
7));
elseif(data>
999)
led_buffer[0]=data/1000;
led_buffer[1]=(data%1000)/100;
led_buffer[2]=(data%100)/10;
led_buffer[3]=data%10;
leddis_update();
99)
//关闭最高位的那个数码管
elseif(data>
9)
led_buffer[1]=16;
else
led_buffer[2]=16;
volatileunsignedintcountnum=0;
voidtimer1_init(void)
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;
//startTimer
#pragmainterrupt_handlertimer1_ovf_isr:
15
voidtimer1_ovf_isr(void)
//reloadcounterhighvalue
//reloadcounterlowvalue
countnum++;
if(countnum>
9999)countnum=0;
voidinit_devices(void)
CLI();
//disableallinterrupts
timer1_init();
TIMSK=0x04;
//timerinterruptsources
SEI();
//re-enableinterrupts
主程序
voidmain(void)
init_devices();
HC_595_init();
adc_init();
SEI();
//开全局中断变量
display(0);
delay();
display_led(adc_rel/1024.0*5*1000);
3、对EEPROM进行读写操作程序
/************************************************
文件:
main.c
用途:
注意:
内部8M晶振
************************************************/
#include"
config.h"
/*向EEPROM里面写入数据
输入量:
地址,数据*/
voidEEPROM_write(unsignedintuiAddress,unsignedcharucData)
while(EECR&
(1<
EEWE));
//等待上一次写操作结束
EEAR=uiAddress;
//地址
EEDR=ucData;
//数据
EECR|=(1<
EEMWE);
//置位EEMWE,主机写使能
EEWE);
//置位EEWE,写使能,启动写操作
/*从EEPROM指定的地址里面读出相应的数据*/
unsignedcharEEPROM_read(unsignedintuiAddress)
//设置地址寄存器
EERE);
//读使能
returnEEDR;
//返回读入EEDR里面的数据
unsignedchartemp=123;
unsignedchardata;
HC_595_init();
EEPROM_write(0x01,temp);
data=EEPROM_read(0x01);
while
(1)
Seg7_Led_display(data);
//调用显示函数将写入的数据又读出来
文件:
eeprom12.rar
大小:
40KB
下载:
下载
4、定时器0(轮循方式)程序
/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。
在此模式下,计数器不断的累加,当计数到最大值0xff后返回到0x00重新开始,在TCNT0
为0的同时,T/C溢出标志TOV0置位*/
//使用轮循方式,当TIFR溢出时,uc_led加1,输出到led时期发光
//TIFR中断标志寄存器
#defineucharunsignedchar
ucharuc_led,k;
//设置数码管输出高电平
DDRE|=1<
PORTF=0XFF;
TCNT0=0X00;
//设定定时计数器的初值为0
TCCR0=0X05;
//使用1024分频(共有7种时钟)
uc_led=0;
k=0;
(TIFR&
0X01));
//循环检测TIFR中的溢出标志是否有效
//PORTA=uc_led;
uc_led++;
if(uc_led==255)
{uc_led=0;
k++;
if(k==255)
k=0;
PORTA=k;
TIFR|=0X01;
//写1到TIFR的TOV0位清除溢出标志为TOV0
5、定时器0中中断程序
/*定时器T0测试程序
ICCAVR7.13
2010年3月14日
/*TCCRn定时计数器控制