ATmega128经典程序例子Word文档格式.docx

上传人:b****3 文档编号:7861647 上传时间:2023-05-09 格式:DOCX 页数:42 大小:82.19KB
下载 相关 举报
ATmega128经典程序例子Word文档格式.docx_第1页
第1页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第2页
第2页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第3页
第3页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第4页
第4页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第5页
第5页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第6页
第6页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第7页
第7页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第8页
第8页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第9页
第9页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第10页
第10页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第11页
第11页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第12页
第12页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第13页
第13页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第14页
第14页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第15页
第15页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第16页
第16页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第17页
第17页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第18页
第18页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第19页
第19页 / 共42页
ATmega128经典程序例子Word文档格式.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

ATmega128经典程序例子Word文档格式.docx

《ATmega128经典程序例子Word文档格式.docx》由会员分享,可在线阅读,更多相关《ATmega128经典程序例子Word文档格式.docx(42页珍藏版)》请在冰点文库上搜索。

ATmega128经典程序例子Word文档格式.docx

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定时计数器控制

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2