atmega128单片机系列例程_第1页
atmega128单片机系列例程_第2页
atmega128单片机系列例程_第3页
atmega128单片机系列例程_第4页
atmega128单片机系列例程_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、ATMEGA128相关例程说明:本文档由沧海一声笑原创由卩箱:H己学av单片机已经有相当一段时间了,一开始用的是atmegal2&觉得不是很好用。丁是H己去买了一块16L的芯片,觉得还彳亍。一开始用的是ICCAVR.应为它用起來比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但iccavr的缺点是太过丁简丽,调试程序时,感觉不是很好。后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建H动生成,只需修改几个参数就可以用。后來又用起了codevisionavr,虽然不太习惯,也谈不上不好用.需要注意

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

3、runsignedchar#defineuintunsignedintucharent;voidtimerlnit()TCCR1B=OXOO;先停止定时器1TCNT1H=OXFO;设定定时器初值TCNT1L=OXBE;TCCR1A=OXOO;启动定时器1TCCR1B=OXO5;使用1024分频interruptTIM1_OVFvoidtlmerl_ovMsr(void)TCNT1H=OXFO;重载定时器初值TCNT1L=OXBE;DDRE|=12;PORTE|=12;DDRA=Oxff;PORTA=cnt;输出led的值到端口Bcnt+;if(cnt=255)cnt=O;voidmain()/

4、DDRB=OXFF;SREG|=0X80;TIMSK=0X04;timerlnit();while(l);2、AD转换+数码管显示/*/*ADC测试程序*/*l寸标器件:ATmegal28*/*晶振:RC8MHZ*/*编译环境:ICCAVR7.13A*/*E-Mail: HYPERLINK mailto:*/*时间:2010年11月13日*/Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*/*/*包倉头文件*/#include#include/*数码管段码表*/externconstunsignedchartab=0 x3f/0 x06z0 x5Bz0 x4

5、F/0 x66,0 x6Dz0 x7D,0 x07/0 x7F,0 x6F;/*全局变吊.*/unsignedintadc_rel=O;/*函数功能:ADC初始化函数入口参数:出口参数:*voidadcjnit(void)DDRF&=OXFE;/PORTFO设代为输入,即作为ADCO口输入模拟电压PORTF&=OXFE;/PORTFO设置为输入低电平ADCSRA=OxOO;关ADCADMUX=0X00;采用Aef作为参考电压,ADC0单端输入,右对齐ACSR=(1ACD);ADCSRA=(1ADEN)|(1ADSC)|(1ADATE)|(1ADIE)|(1ADPS2)|(1ADPS1);/AD

6、EN,启动ADC;ADSC,ADC开始转换:ADIE,ADC中断使能:ADPSX,设世分频因子64/*两数功能:ADC中断函数入口参数:出口参数:*/#pragmainterrupt_handleadc_is:iv_ADCvoidadcjsr(void)/intdata_h,data_l;/dataJ=ADCL;/data_h=ADCH;ADCSRA=0 x00;ADCSRA=(1ADEN)|(1ADSC)|(KOxlff)PORTA|=12;elsePORTA&=(1VV2);*/*函数功能:延时子程序入口参数:出口参数:*/voiddelay(void)inti;for(i=0;i1800

7、;i+);/*函数功能:显示子程序入口参数:k出口参数:*/voiddisplay(unsignedintk)发光:极管显示初始化DDRE|=12;PORTE|=12;DDRA=OXFF;PORTA=k;#defineSS0#defineSCK1#defineMOSI2#defineMISO3#defineSS_H()PORTB|=(1SS)#defineSS_L()PORTB&=(1VVSS)#defineledO_en()(DDRB|=14;PORTB|=(14);开第一个数码管的位选#defineledO_dis()DDRB|=14;PORTB&=(1VV4);关第一个数码管的位选#de

8、fineledl.en()DDRB|=15;PORTB|=(15);#defineledl_dis()DDRB|=15;PORTB&=(1VV5);#defineIed2_en()DDRB|=16;PORTB|=(16);#defineIed2_dis()DDRB|=16;PORTB&=(lv6);#defineIed3_en()DDRB|=17;PORTB|=(17);#defineIed3_dis()DDRB|=17;PORTB&=(1VV7);#defineOE7#definepoint3#definedp7#include#inelude0丄2尼4567,8,9/a,b,c,dzejc

9、onstunsignedchartable=0 x3F,0 x06/0 x5B/0 x4Fz0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F,0 x77,0 x7C,0 x39,0 x5Ez0 x79,0 x71,0 x00;volatileunsignedcharled_buffer4;voiddelay_lus(void)/Ius延时函数asm(Hnopj;voiddelay_nus(unsignedintn)Nus延时函数unsignedinti=0;for(i=0;in;i+)delay_lus();voiddelay_lms(void)/1ms延时函数unsig

10、nedinti;for(i=0;i1140;i+);voiddelay_nms(unsignedintn)/Nms延时函数unsignedinti=0;for(i=0;in;i+)delay_lms();/*完成spi的初始化*/voidspijnit(void)DDRB|=(1MOSI)|(1SCK)|(1SS);/SMOSI,SCK输出SPCR=(1VVSPE)|(1VVMSTR)|(1VVSPRO)|(1VVSPR1);使能SPI,主机模式/*spi主机传送数据*/voidSPI_MasterTransmit(charData)/*启动数据传输*/SPDR=Data;/*等待传输结束*/

11、while(!(SPSR&(1SPIF)/*完成对HC595的初始化*/voidHC_595nit(void)DDRC|=(1OE);设置PORTC7为输出PORTC&=(1VVOE);输出高电平,使能595PORTB=OXOF;同时打开四个数码管的位选spinit();led_buffer0=16;初始化数码管段码led_bufferl=16;led_buffer2=16;led_buffer3=16;/*HC595完成传送数据*/voidHC_595_OUT(unsignedchardata)SS_L();SPI_MasterTransmit(data);SS_H();voidleddis

12、_update(void)/*最低位数码管,第四个数码管*7if(point=O)HC_595_OUT(tableled_buffe3|(lvvdp);elseHC_595_OUT(tableled_buffe3);ledO_en();delay_nus(60);ledO_dis();if(point=l)HC_595_OUT(tableled_buffer2|(ldp);elseHC_595_OUT(tableled_buffer2);ledl_en();delay_nus(60);ledl_dis();if(point=2)HC_595_OUT(tableled_bufferl|(ldp)

13、;elseHC_595_OUT(tableled_bufferlJ);Ied2_en();delay_nus(60);Ied2_dis();/*最高位数码管,第一个数码管*/if(point=3)HC_595_OUT(tableled_buffer0|(l9999)HC_595_OUT(OxFF);当计数大于9999时,四个数码管同时输出8PORTB|=(14)|(15)|(16)|(1999)led_bufferO=data/lOOO;led_bufferl=(data%1000)/100;led_buffer2=(data%100)/10;led_buffer3=data%10;leddi

14、s_update();elseif(data99)led_bufferO=data/lOOO;关闭最高位的那个数码管led_bufferl=(data%1000)/100;led_buffer2=(data%100)/10;led_buffer3=data%10;leddis_update();elseif(data9)led_bufferO=data/lOOO;led_bufferl=16;led_buffer2=(data%100)/10;led_buffer3=data%10;leddis_update();elseled_buffer0=data/1000;led_bufferl=16

15、;led_buffer2=16;led_buffer3=data%10;leddis_update();volatileunsignedintcountnum=0;voidtimerlnit(void)TCCR1B=0 x00;/stopTCNT1H=0 x8F;/setupTCNT1L=0 x81;OCR1AH=0 x70;OCR1AL=0 x7F;OCR1BH=0 x70;OCR1BL=0 x7F;OCR1CH=0 x70;OCR1CL=0 x7F;ICR1H=0 x70;ICR1L=0 x7F;TCCR1A=0 x00;TCCR1B=0 x04;/startTimer#pragmaint

16、errupt_handletimerl_ovfjsr:15voidtimerl_ovfjsr(void)TCNT1H=0 x8F;/reloadcounterhighvalueTCNT1L=0 x81;/reloadcounterlowvaluecountnum+;if(countnum9999)countnum=0;voidinit_devices(void)CLI();/disableallinterruptstimerljnit();TIMSK=0 x04;/timerinterruptsourcesSEI();/re-enableinterrupts/*函数功能:主程序入口参数:出口参

17、数:*/voidmain(void)init_devices();HC_595nit();adcjnit();SEI();/开全局中断变戢display(O);while(l)delay();displayJed(adc_rel/1024.0*5*1000);3、对EEPROM进行读写操作/*文件:main.c用途:注意:内部8M晶振*/#includenconfig.hH/*向EEPROM里而写入数据输入虽:地址.数据*/voidEEPROM_wite(unsignedintuiAddress.unsignedcharucData)while(EECR&(lEEWE);等待上一次写操作结束E

18、EAR=uiAddress;地址EEDR=ucData;数据EECR|=(1EEMWE);誉位EEMWE,主机写使能EECR|=(1EEWE);置位EEWE,写使能,启动写操作/*从EEPROM指定的地址里面读出相应的数据*/unsignedcharEEPROM_read(unsignedintuiAddress)while(EECR&(lEEWE);等待上一次写操作结束EEAR=uiAddress;设呂地址寄存器EECR|=(1EERE);读使能returnEEDR;返回读入EEDR里而的数据voidmain(void)unsignedchartemp=123;unsignedchardat

19、a;HC_595Jnit();EEPROM_wnte(0 x01ztemp);data=EEPROM_read(Ox01);while(l)Seg7_Led_display(data);调用显示函数将写入的数据又读出來文件:eeproml2.rar大小:40KB卜载:里4.定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。在此模式下,计数器不断的累加,当计数到最大值Oxff后返回到0 x00重新开始,在TCNT0为0的同时,T/C溢出标志TOVO置位*/使用轮循方式,当TIFR溢出时,uc_led加1.输出到led时期发光/TIFR中断标志寄存器

20、#include#defineucharunsignedcharucharuc_led,k;voidmain()设置数码管输出高电平DDRE|=12;PORTE|=12;DDRA=0XFF;PORTF=OXFF;TCNT0=0X00;设定定时计数器的初值为0TCCR0=0X05;/使用1024分频(共有7种时钟)ucJed=0;k=0;while(l)while(!(TIFR&0X01);/循环检测TIFR中的溢出标志是否有效/PORTA=ucJed;uc_led+;if(ucjed=255)uc_led=O;k+;if(k=255)k=0;PORTA=k;TIFR|=0X01;写1到TIFR

21、的TOVO位清除溢出标志为TOVO5、定时器0中中断/*/*定时器TO测试程序/*目标器件:ATmegal28/*晶振:RC8MHZ*/*/*/*编译环境:ICCAVR7.13*/*E-Mail: HYPERLINK mailto: x01;/*函数功能:主程序入口参数:出口参数:*/voidmain(void)CLI();/disableallinterruptsport_init();timerOnit();MCUCR=0 x00;TIMSK=0 x01;/TO溢出使能SEI();/enableinterrupts定时器1测试程序/*/*/*定时器T1测试程序/*/*包倉头文件*/#inc

22、lude#inelude/*个局变;r*/intk;/*函数功能:端口初始化程序入口参数:出口参数:*/voidportjnit(void)DDRE|=12;PORTE|=140)k=0;PORTA0 x01;/*函数功能:主程序入口参数:出口参数:*/voidmain(void)CLI();/disableallinterruptsport_init();timerlnit();MCUCR=0 x00;TIMSK=0 x04;/TO溢出使能SEI();/enableinterrupts7、定时器1测试程序之二/*/*/*定时器T1测试程序/*定时时间为1秒*/*/*包倉头文件*/#inclu

23、de#include/*个局变;d*/intcountnum;/*函数功能:端口初始化程序入口参数:出口参数:*/voidportJnit(void)DDRE|=12;PORTE|=1#include/*牙宦义*/#definefosc8000000晶振8MHZ#definebaud2400波特率/*两数功能:uatO初始化程序入口参数:出口参数:*/voiduartOnit(void)UCSROB=0 x00;关闭UARTOOUCSROA=0 x00;不使用倍速发送(异步)UCSROC=(1UCSZO1)|(1UCSZOO);数据位为8位UBRR0L=(fosc/16/(baud+l)%25

24、6;异步正常惜况下的计算公式UBRR0H=(fosc/16/(baud+l)/256;UCSROB=(1RXENO)|(1TXENO);接收使能和发送使能/*因数功能:uartO发送单字节数据入口参数:c出口参数:*/voidputcharO(unsignedcharc)while(!(UCSROA&(1UDREO);/表明发送器已经准备就绪UDR0=C;将要发送的数据装入UDR0寄存器/*函数功能:uartO接收单字节数据入口参数:出口参数:*/unsignedchargetcharO(void)while(!(UCSROA&(1#include/*牙左义*/#definefosc80000

25、00晶振8MHZ#definebaud9600波特率/*函数功能:uatl初始化程序入口参数:出口参数:*/voiduartljnit(void)/USART1初始化UCSR1B=0 x00;关闭USART1UCSR1A=0 x00;不适使用倍速发送UCSR1C=(1VVUCSZ11)|(1VVUCSZ1O);数据位为八位UBRRlL=(fosc/16/(baud+l)%256;/异步疋常模式下,UBRR的计算公式UBRRlH=(fosc/16/(baud+l)/256;UCSR1B=(1RXEN1)|(1TXEN1);/接收使能,传送使能/*函数功能:uartl发送单字节数据入口参数:c出口

26、参数:*/voidputcharl(unsignedcharc)串口1发送字符while(!(UCSR1A&(1UDRE1);/表明发送器一准备就绪UDRl=c;/*函数功能:uartl接收单字节数据入口参数:出口参数:*/unsignedchargetcharl(void)/$口1接回收数据while(!(UCSRlA&(1VVRXC1);returnUDR1;将接收到的字符返回/*函数功能:uartl发送字符串数据入口参数:*s出口参数:*/voidputsl(char*s)while(*s)putcharl(*s);s+;putchal(OxOa);回车换行putcharl(OxOd);

27、/*函数功能:主程序入口参数:出口参数:*/voidmain(void)unsignedchari;uartljnit();putsl(”HELLO);while(l)putsl(Htestok!”);串口调试助手SCoMAssistant2.涪空重填|撿送的字符/数据htty/Zr血TindJE.163.如制发送手君发送|厂自动发送倜期改翅重选)自动发送周期:阿i亳秒选择发送文件还没有选择丈件发送文件MAILt*jSTATUS:CONIOFEHEBz24.00,1(,8,1.fRX::15577TX:銅Count-srRESET需要注总的是:1、耍保证串口通信的成功,PC机和单片机必须设用成

28、一样的波特率,这样才能够保证串口通信的成功。2、上面提到的串口指的是九针的串口,它的儿个相应的管脚定义如下:2接受数据(RXD)3发出数据(TXD)5伯号地线(SG)下面是引脚图10.ATMEGA128SPI驱动ATMEGA128单片机SPI通信驱动程序/*文件:spi.c用途:SPI驱动/*函数名称:spi_init(void)*功能描述:SPI初始化*输入:*输出:*全局变戢:无*调用模块:*说明:*注意:*/voidspijnit(void)DDRB|=(1MOSI)|(1SCK)|(KSS);/设置MOSI和SCK输出SPCR=(1SPE)|(1MSTR)|(1SPRO)|(1SPR1

29、);使能SPI,主机模式/SPE,使能SPI:MSTR,主机模式:SPRO和SPR1设置时钟频率/*函数名称:SPI_MasterTransmit(charData)*功能描述:SPI主机发送数拯*输入:Data需要通过SPI传输的数据*输出:*全局变戢:无*调用模块:*说明:*注意:*/voidSPI_MasterTransmit(charData)/*启动数据传输*/SPDR=Data;/*等待传输结束*/whlle(!(SPSR&(1SPIF)串行发送结束以后SPIF置位(即为1)11.PWM波形输出#include#include#defineuintunsignedint#defin

30、eucharunsignedcharvoiddelay_ms(uintn)uinti=Ozj;while(in)(for(j=0;j1000;j+);i+;voidpwmOnit(void)DDRB=0X10;TCCRO=OXOO;OCRO=OX7F;/8位的定时计数器的初值设定为0 x7fTCNTO=O;计数器TCCR0=0X6A;/设代为快速pwm模式,采取8分频voidmain(void)ucharwide;chartemp;pwmOJnit();while(l)delay_ms(50);if(+wide=255)wide=O;OCRO=wide;定时器1数码管显示(is)config.

31、h文件/*时间误差:0.00672秒每秒*/#defineSS0#defineSCK1#defineMOSI2#defineMISO3#defineSS_H()PORTB|=(1SS)#defineSS_L()PORTB&=(1VVSS)注意,不要漏掉了(开第一个数码管的位选#defineledO_en()DDRB|=14;PORTB|=(14);#defineledO_dis()DDRB|=14;PORTB&=(1VV4);#defineledl_en()DDRB|=15;PORTB|=(15);#defineledl_dis()DDRB|=15;PORTB&=(1VV5);#defineI

32、ed2_en()(DDRB|=16;PORTB|=(16);#defineIed2_dis()DDRB|=16;PORTB&=(1VV6);#defineIed3_en()(DDRB|=17;PORTB|=(17);#defineIed3_dis()DDRB|=17;PORTB&=(1VV7);#defineOE7#definepoint4#definedp7#include#ineludevoidportJnit(void)DDRA=OXFF;PORTA=OXFF;constunsignedchartable=0 x3F,0 x06/0 x5Bz0 x4Fz0 x66,0 x6D,0 x7D

33、,0 x07,0 x7F,0 x6F,0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71,0 x00;volatileunsignedcharled_buffer4;voiddelay_lus(void)/Ius延时函数asm(HnopH);voiddelay_nus(unsignedintn)Nus延时函数unsignedinti=0;for(i=0;ivn;i+)delay_lus();voiddelay_lms(void)/1ms延时函数unsignedinti;for(i=0;i1140;i+);voiddelay_nms(unsignedintn)Nms延时函数u

34、nsignedinti=0;for(i=0;ivn;i+)关第一个数码管的位选/0丄2加5,6,7,8,9/abedejdelay_lms();/*完成spi的初始化*/voidspijnit(void)DDRB|=(1VVMOSI)|(1VVSCK)|(1VVSS);设置MOSI,SCK输出SPCR=(1VVSPE)|(1VVMSTR)|(1VVSPRO)|(1VVSPR1);使能SPI,主机模式/*spi主机传送数据*/voidSPI_MasterTransmit(charData)/*启动数据传输*/SPDR=Data;/*等待传输结束*/while(!(SPSR&(1SPIF)f/*完

35、成对HC595的初始化*/voidHC_595Jnit(void)DDRC|=(1OE);设置PORTC7为输出PORTC&=(1OE);输出高电平,使能595PORTB=OXOF;同时打开四个数码管的位选spinit();led_buffer0=16;初始化数码管段码led_bufferl=16;led_buffer2=16;led_buffer3=16;/*HC595完成传送数据*/voidHC_595_OUT(unsignedchardata)SS_L();SPI_MasterTransmit(data);SS_H();voidleddis_update(void)/*最低位数码管,第四

36、个数码管*7if(point=O)HC_595_OUT(tableled_buffer3|(ldp);elseHC_595_OUT(tableled_buffer3);ledO_en();delay_nus(60);ledO_dis();if(point=l)HC_595_OUT(tableled_buffer2|(ldp);elseHC_595_OUT(tableled_buffer2J);ledl_en();delay_nus(60);ledl_dls();if(point=2)HC_595_OUT(tableled_bufferl|(ldp);elseHC_595_OUT(tablele

37、d_bufferlJ);Ied2_en();delay_nus(60);Ied2_dis();/*最高位数码管,第一个数码管*/if(point=3)HC_595_OUT(tableled_buffer0|(l9999)HC_595_OUT(OxFF);当计数大丁9999时,四个数码管同时输出8PORTB|=(14)|(15)|(16)|(1999)led_bufferO=data/lOOO;led_bufferl=(data%1000)/100;led_buffer2=(data%100)/10;led_buffer3=data%10;leddis_update();elseif(data9

38、9)led_buffer0=16;关闭最高位的那个数码管led_bufferl=(data%1000)/100;led_buffer2=(data%100)/10;led_buffer3=data%10;leddis_update();elseif(data9)led_buffe0=16;led_bufferl=16;led_buffer2=(data%100)/10;led_buffer3=data%10;leddis_update();elseled_buffe0=16;led_bufferl=16;led_buffer2=16;led_buffer3=data%10;leddis_upd

39、ate();voidinit_devices(void)CLI();portjnit();/disableallinterrupts端口初始化HC_595Jnit();/595初始化timerljnit();定时器1初始化/TIMSK=0X04;定时器1中断溢出使能或者写成TIMSK|=(1TOIE1);main.c文件*/#include#inelude#includeconfig.hH/*令加变n;*/intk;volatileunsignedintent;/*函数功能:定时器初始化程序入口参数:出口参数:*/voidtimerlnit(void)TCCR1B=0 x00;/stopTCN

40、T1H=OxFF;/setupIsTCNT1L=0 x3D;7/(12*16+2)*40*1024/8000000=0.99328sOCR1AH=0 x00;OCR1AL=0 xC3;OCR1BH=0 x00;OCR1BL=0 xC3;OCR1CH=0 x00;OCR1CL=0 xC3;ICR1H=0 x00;ICR1L=0 xC3;TCCR1A=0 x00;TCCR1B=0 x05;/startTimer1024DDRE|=12;PORTE|=140)k=0;PORTA0 x01;cnt+;if(cnt=10000)cnt=0;/*函数功能:主程序入口参数:出口参数:*/voidmain(v

41、oid)CLI();/disableallinterruptsinit_devices();MCUCR=0 x00;TIMSK=0 x04;/TO溢出使能SEI();/enableinterruptswhile(l)display_led(cnt);定时器1:定时计数(is)main.c文件:*/#include#inelude#includeconfig.h*/intk;volatileunsignedintent;unsignedcharfenpin=0 x01,0 x02,0 x03,0 x04,0 x05;分频系数分别为:1,8,64,256,1024;/*函数功能:定时器初始化程序入

42、口参数:出口参数:*/voidtimerlnit(void)TCCR1B=0 x00;/stopTCNT1H=OxFO;/setupIsTCNT1L=OxBE;/(16*16*15+4*16)*1024/8000000*2=0.999424STCCR1A=0 x00;TCCR1B=fenpin4;/startTimer1024DDRE|=12;PORTE|=12;/*函数功能:定时中断服务程序入口参数:出口参数:*/#pragmainterrupt_handletimerl_ovfjsr:15voidtimerl_ovfjsr(void)TCNT1H=OxFO;/reloadcounterhi

43、ghvalueTCNT1L=OxBE;/reloadcounterlowvaluecnt+;if(cnt=20000)cnt=O;/*因数功能:主程序入口参数:出口参数:*/voidmain(void)CLI();/disableallinterruptsinit_devices();MCUCR=0 x00;TIMSK=0 x04;/Tl溢出使能SEI();/enableinterruptswhile(l)display_led(cnt/2);config.h文件:/*时间误湼:0.00672秒毎秒*/#defineSS0#defineSCK1#defineMOSI2#defineMISO3#

44、defineSS_H()PORTB|=(1SS)#defineSS_L()PORTB&=(1VVSS)注意,不要漏掉了(#defineled0_en()(DDRB|=14;PORTB|=(14);开第一个数码管的位选#defineledO_dis()DDRB|=14;PORTB&=(lv4)汀关第一个数码管的位选#defineledl_en()DDRB|=15;PORTB|=(15);#defineledl_dis()DDRB|=15;PORTB&=(1VV5);#defineIed2_en()DDRB|=16;PORTB|=(16);#defineIed2_dis()DDRB|=16;POR

45、TB&=(1VV6);#defineIed3_en()DDRB|=17;PORTB|=(17);#defineIed3_dis()DDRB|=17;PORTB&=(1VV7);#defineOE7#definepoint4#definedp7#include#ineludevoidportJnit(void)DDRA=0XFF;PORTA=OXFF;0H45,6,7,8,9/abGcteJconstunsignedchartable=0 x3F,0 x06/0 x5Bz0 x4Fz0 x66,0 x6D,0 x7D,0 x07,0 x7Fz0 x6F,0 x77,0 x7C,0 x39,0 x

46、5Ez0 x79,0 x71,0 x00;volatileunsignedcharled_buffer4;voiddelay_lus(void)/Ius延时函数asm(FopH);voiddelay_nus(unsignedintn)Nus延时函数unsignedinti=0;for(i=0;in;i+)delay_lus();voiddelay_lms(void)/1ms延时函数unsignedinti;for(i=0;i1140;l+);voiddelay_nms(unsignedintn)/Nms延时函数unsignedinti=0;for(i=O;in;i+)delay_lms();/

47、*完成spi的初始化*/voidspijnit(void)DDRB|=(1VVMOSI)|(1VVSCK)|(1VVSS);设置MOSI,SCK输出SPCR=(1VVSPE)|(1VVMSTR)|(1VVSPRO)|(1VVSPR1);使能SPI,主机模式/*spi主机传送数据*/voidSPI_MasterTransmit(charData)/*启动数据传输*/SPDR=Data;/*等待传输结束*/while(!(SPSR&(1SPIF)f/*完成对HC595的初始化*/voidHC_595nit(void)DDRC|=(1OE);设置PORTC7为输出PORTC&=(1VVOE);输出高

48、电平,使能595PORTB=OXOF;同时打开四个数码管的位选spinit();led_buffer0=16;初始化数码管段码led_bufferl=16;led_buffer2=16;led_buffer3=16;/*HC595完成传送数据*/voidHC_595_OUT(unsignedchardata)SS_L();SPI_MasterTransmit(data);SS_H();voidleddis_update(void)/*授低位数码管,第四个数码管*7if(point=O)HC_595_OUT(tableled_buffe3|(lvvdp);elseHC_595_OUT(table

49、led_buffer3);ledO_en();delay_nus(60);ledO_dis();if(point=l)HC_595_OUT(tableled_buffe2|(lvvdp);elseHC_595_OUT(tableled_buffer2);ledl_en();delay_nus(60);ledl_dis();if(point=2)HC_595_OUT(tableled_bufferl|(l9999)HC_595_OUT(OxFF);当计数大丁9999时,四个数码管同时输出8PORTB|=(14)|(15)|(16)|(1999)led_buffer0=data/1000;led_bufferl=(data%1000)/100;led_b

温馨提示

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

最新文档

评论

0/150

提交评论