




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ATMEGA128 相關例程 自己學avr單片機已經有相當一段時間了,一開始用的是 atmega128 ,覺得不是很好用。于是自己去買 了一塊16L的芯片,覺得還行。一開始用的是 ICC AVR,應為它用起來比較簡單,不像 winavr那樣, 要寫個Makefie ,比較的麻煩,但icc avr的缺點是太過于簡陋,調試程序時,感覺不是很好。后來經同學介紹,用起了 code vision avr winavr,其實也是比較的簡單,只不過要加一個 自動生成,只需修改幾個參數(shù)就可以用。后來又用起了 用. makefile 而已,其實 makefile可以用軟件自帶的組建 雖然不太習慣,也談不上不好
2、需要注意的是,三個不同的軟件所帶的同文件不一樣。 是avr/io.h ,不過makefile 中要設置芯片為atmega128. 而cvavr則是 記得一開始的時候,我對這些不同的同文件不是很理解,是從一個學長那里了解到,才弄明白的。其實前 兩個軟件只需把頭文件稍微改一下基本上可以通用。而最后一個軟件的中斷的寫法似乎不太一樣,因而和 錢兩個軟件的兼容性是最差的。 icc avr 是 iom128v.h (姑且以128為例),winavr mega128.h 總體說winavr給人的感覺是比較專業(yè) 自己學習時多總結吧! 1、流水燈 /* 硬件環(huán)境:atmega128 開發(fā)板 軟件環(huán)境:CodeV
3、isionAVR-C */ #include #define uchar unsigned char #define uint unsigned int uchar cnt; void timer1_init() TCCR1B=0X00; / 先停止定時器1 TCNT1H=0XF0; / 設定定時器初值 TCNT1L=0XBE; TCCR1A=0X00; / 啟動定時器1 TCCR1B=0X05; / 使用1024分頻 interrupt TIM1_OVF void timer1_ovf_isr(void) TCNT1H=0XF0; /重載定時器初值 TCNT1L=0XBE; DDRE|=12
4、; P0RTE|=12; DDRA=0 xff; PORTA=cnt; cnt+; if(cnt=255) cnt=0; /輸岀led的值到端口 B void main() DDRB=0XFF; SREG|=0X80; TIMSK=0X04; timer1_init(); while(1) ; 2、AD轉換+數(shù)碼管顯示 /* */ /*ADC測試程序 */ /*目標器件:ATmega128 /* 晶振:RC 8MHZ */ */ /* 編譯環(huán)境:ICCAVR 7.13A */ /*E-Mail: /*時間:2010年11月13日 */ */ /Aref 接AVCC(+5V), 采用Aref作參
5、考電壓 /*用數(shù)碼管顯示 AD轉換的結果*/ /* */ /* 包含頭文件 */ #include #include /* 數(shù)碼管段碼表 */ extern const unsigned char tab=0 x3f,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07, 0 x7F,0 x6F; 全局變量 * unsigned int adc_rel=0; /* * 函數(shù)功能 :ADC 初始化函數(shù) 入口參數(shù) : 出口參數(shù) : * */ void adc_init(void) DDRF PORTF ADCSRA=0 x00; /PORTF0 設置為輸入,即作為 A
6、DC0 口輸入模擬電壓 /PORTF0 設置為輸入低電平 / 關 ADC ADMUX = 0X00; ACSR=(1ACD); / 采用 Aref 作為參考電壓, ADC0 單端輸入,右對齊 ADCSRA = (1ADEN)|(1ADSC)|(1ADATE)|(1ADIE)|(1ADPS2)|(1ADPS1); /ADEN ,啟動 ADC;ADSC,ADC 開始轉換; ADIE,ADC 中斷使能; ADPSx, 設置分頻因子 64 /* * 函數(shù)功能 :ADC 中斷函數(shù) 入口參數(shù) : 出口參數(shù) : * */ #pragma interrupt_handler adc_isr:iv_ADC vo
7、id adc_isr(void) /int data_h,data_l; /data_l=ADCL; /data_h=ADCH; ADCSRA = 0 x00; ADCSRA = (1ADEN)|(1ADSC)|(10 x1ff) PORTA|=12; else PORTA */ * * 函數(shù)功能 : 延時子程序 入口參數(shù) : 出口參數(shù) : * */ void delay(void) int i; for(i=0;i1800;i+); /* * 函數(shù)功能 : 顯示子程序 入口參數(shù) :k 出口參數(shù) : * */ void display(unsigned int k)/發(fā)光二極管顯示初始化 DD
8、RE|=12; PORTE|=12; DDRA=0XFF; PORTA=k; #define SS 0 #define SCK 1 #define MOSI 2 #define MISO 3 #define SS_H() PORTB|=(1SS) #define SS_L() PORTBPORTB|=(14); #define led0_dis() DDRB|=14;PORTB #define led1_en() DDRB|=15;PORTB|=(15); #define led1_dis() DDRB|=15;PORTB #define led2_en() DDRB|=16;PORTB|=(
9、16); #define led2_dis() DDRB|=16;PORTB #define led3_en() DDRB|=17;PORTB|=(17); #define led3_dis() DDRB|=17;PORTB #define OE 7 #define point 3 #define dp 7 #include #include const unsigned char table=0 x3F,0 x06,0 x5B,0 x4F,0 x66, 0 x6D,0 x7D,0 x07,0 x7F,0 x6F, 0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71,0 x
10、00; /0,1,2,3,4 /5,6,7,8,9 /a,b,c,d,e,f volatile unsigned char led_buffer4; void delay_1us(void) asm(nop); void delay_nus(unsigned int n) unsigned int i=0; for (i=0;in;i+) delay_1us(); /1us 延時函數(shù) /N us 延時函數(shù) void delay_1ms(void) unsigned int i; for (i=0;i1140;i+); /1ms 延時函數(shù) void delay_nms(unsigned int
11、n) /N ms 延時函數(shù) unsigned int i=0; for (i=0;in;i+) delay_1ms(); /* 完成 spi 的初始化 */ void spi_init(void) DDRB |= (1MOSI)|(1SCK)|(1SS);/ 設置 MOSI SPCR = (1SPE)|(1MSTR)|(1SPR0)|(1SPR1);/ /*spi 主機傳送數(shù)據(jù) */ void SPI_MasterTransmit(char Data) /* 啟動數(shù)據(jù)傳輸 */ SPDR = Data; /* 等待傳輸結束 */ while(!(SPSR / 設置 PORTC7 為輸出 POR
12、TC / 輸出高電平,使能 595 PORTB = 0 x0F;/ 同時打開四個數(shù)碼管的位選 spi_init(); led_buffer0=16;/ 初始化數(shù)碼管段碼 led_buffer1=16; led_buffer2=16; led_buffer3=16; /*HC595 完成傳送數(shù)據(jù) */ void HC_595_OUT(unsigned char data) SS_L(); SPI_MasterTransmit(data); SS_H(); void leddis_update(void) /* 最低位數(shù)碼管,第四個數(shù)碼管 */ if(point=0) HC_595_OUT(tab
13、leled_buffer3|(1dp); else HC_595_OUT(tableled_buffer3); led0_en(); delay_nus(60); led0_dis(); if(point=1) HC_595_OUT(tableled_buffer2|(1dp); else HC_595_OUT(tableled_buffer2); led1_en(); delay_nus(60); led1_dis(); if(point=2) HC_595_OUT(tableled_buffer1|(1dp); else HC_595_OUT(tableled_buffer1); led2
14、_en(); delay_nus(60); led2_dis(); /* 最高位數(shù)碼管,第一個數(shù)碼管 */ if(point=3) HC_595_OUT(tableled_buffer0|(19999) HC_595_OUT(0 xFF);/ 當計數(shù)大于 9999 時,四個數(shù)碼管同時輸出 8 PORTB|=(14)|(15)|(16)|(1999) led_buffer0=data/1000; led_buffer1=(data%1000)/100; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else if
15、(data99) led_buffer0=data/1000; / 關閉最高位的那個數(shù)碼管 led_buffer1=(data%1000)/100; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else if(data9) led_buffer0=data/1000; led_buffer1=16; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else led_buffer0=data/1000; led_buffer1=1
16、6; led_buffer2=16; led_buffer3=data%10; leddis_update(); volatile unsigned int countnum=0; void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1H = 0 x8F; /setup TCNT1L = 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;
17、 TCCR1A = 0 x00; TCCR1B = 0 x04; /start Timer #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) TCNT1H = 0 x8F; /reload counter high value TCNT1L = 0 x81; /reload counter low value countnum+; if(countnum9999) countnum=0; void init_devices(void) CLI(); /disable all interrupts time
18、r1_init(); TIMSK = 0 x04; /timer interrupt sources SEI(); /re-enable interrupts /* * 函數(shù)功能:主程序 入口參數(shù): 岀口參數(shù): * */ void main(void) init_devices(); HC_595_init(); adc_init(); SEI();/開全局中斷變量 display(0); while(1) delay(); display_led(adc_rel/1024.0*5*1000); 3、對EEPROM 進行讀寫操作 /* 文件:main.c 用途: 注意:內部8M晶振 * #in
19、clude config.h /*向EEPROM 里面寫入數(shù)據(jù) 輸入量:地址,數(shù)據(jù)*/ void EEPROM_write(unsigned int uiAddress,unsigned char ucData) while(EECR/等待上一次寫操作結束 EEAR = uiAddress;/ 地址 EEDR = ucData; EECR |=(1EEMWE); EECR |=(1EEWE); /數(shù)據(jù) /置位EEMWE,主機寫使能 /置位EEWE,寫使能,啟動寫操作 /*從EEPROM指定的地址里面讀出相應的數(shù)據(jù) */ unsigned char EEPROM_read(unsigned in
20、t uiAddress) while(EECR/等待上一次寫操作結束 EEAR = uiAddress;/設置地址寄存器 EECR |=(1EERE);/ 讀使能 return EEDR;/返回讀入 EEDR里面的數(shù)據(jù) void main(void) unsigned char temp=123; unsigned char data; HC_595_init(); EEPROM_write(0 x01,temp); data=EEPROM_read(0 x01); while(1) /調用顯示函數(shù)將寫入的數(shù)據(jù)又讀岀來 Seg7_Led_display(data); 文件:eeprom12.r
21、ar 大小:40KB 下載:下載 4、定時器0 (輪循方式) TCNT0 /*定時器0和2 (均為八位的定時計數(shù)器)有四種工作模式,此例是工作在普通模式。 在此模式下,計數(shù)器不斷的累加,當計數(shù)到最大值0 xff后返回到0 x00重新開始, 為0的同時,T/C溢出標志TOV0置位*/ /使用輪循方式,當TIFR溢出時,uc_led加1,輸出到led時期發(fā)光 /TIFR 中斷標志寄存器 #include #define uchar unsigned char uchar uc_led,k; void main() /設置數(shù)碼管輸岀高電平 DDRE|=12; PORTE|=12; DDRA=0XFF
22、; PORTF=0XFF; TCNT0=0X00;設定定時計數(shù)器的初值為0 TCCR0=0X05;/ 使用1024 分頻(共有 7種時鐘) uc_led=O; k=0; while(1) while(!(TIFR/循環(huán)檢測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測試程序*/ /* 目標器件:ATmega128*/ /* 晶振:RC
23、8MHZ*/ /* 編譯環(huán)境:ICCAVR 7.13*/ */ */ /*E-Mail: /*時間:2010年3月14日 /*TCCRn定時計數(shù)器控制寄存器 TCNTn計數(shù)器,不斷的計數(shù) TIMSK定時計數(shù)器中斷屏蔽寄存器 TIFR中斷標志寄存器 */ */ 包含頭文件 * */ #include #include /* 全局變量 * */ int k; 函數(shù)功能 : 端口初始化程序 入口參數(shù) : 出口參數(shù) : * */ void port_init (void) DDRE|=12; PORTE|=1150) k=0; PORTA 人=0 x01; * 函數(shù)功能 : 主程序 入口參數(shù) : 出口
24、參數(shù) : * */ void main (void) CLI(); /disable all interrupts port_init(); timer0_init(); MCUCR = 0 x00; TIMSK = 0 x01; /T0 溢出使能 SEI(); /enable interrupts 6 、定時器 1 測試程序 /* */ /* 定時器 T1 測試程序 */ * */ 包含頭文件 * #include #include 全局變量 * int k; /* * 函數(shù)功能 : 端口初始化程序 入口參數(shù) : 出口參數(shù) : * */ void port_init (void) DDRE|
25、=12; PORTE|=140) k=0; PORTA 人=0 x01; * 函數(shù)功能:主程序 入口參數(shù): 岀口參數(shù): * */ void main (void) CLI(); /disable all interrupts port_init(); timer1_init(); MCUCR = 0 x00; TIMSK = 0 x04;T0溢出使能 SEI(); /enable interrupts 7、定時器1測試程序之二 */ */ /*定時器T1測試程序 /*定時時間為1秒*/ */ 包含頭文件 * #include #include */ 全局變量 * int countnum; *
26、 函數(shù)功能:端口初始化程序 入口參數(shù): 岀口參數(shù): * */ void port_init (void) DDRE|=12; PORTE|=12; DDRA=0XFF; PORTA=0XFF; /* * 函數(shù)功能 : 定時器初始化程序 入口參數(shù) : 出口參數(shù) : * */ void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1H = 0 x8F; /setup TCNT1L = 0 x81; OCR1AH = 0 x70; OCR1AL = 0 x7F; OCR1BH = 0 x70; OCR1BL = 0 x7F; OCR1CH = 0 x70;
27、 OCR1CL = 0 x7F; ICR1H = 0 x70; ICR1L = 0 x7F; TCCR1A = 0 x00; TCCR1B = 0 x04; /start Timer /* * 函數(shù)功能 : 定時中斷服務程序 入口參數(shù) : 出口參數(shù) : * */ #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) TCNT1H = 0 x8F; /reload counter high value TCNT1L = 0 x81; /reload counter low value countnum+; if
28、(countnum=256) countnum=0; kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk * 函數(shù)功能:主程序 入口參數(shù): 岀口參數(shù): * */ void main (void) CLI(); /disable all interrupts port_init(); timer1_init(); TIMSK = 0 x04;/TO 溢出使能 SEI(); /enable interrupts while(1) PORTA=countnum; 8、串 口通信(USART0 ) * */ /*串
29、口 0測試程序*/ /* 目標器件:ATmega128*/ /* 晶振:RC 8MHZ*/ /* 編譯環(huán)境:ICCAVR 7.13A*/ /*時間:2010年3月14日*/ */ /*E-Mail: */ 包含頭文件 */ * #include #include 宏定義 /* */ #define fosc 8000000/ 晶振 8MHZ #define baud 2400 / 波特率 函數(shù)功能 :uart0 初始化程序 入口參數(shù) : 出口參數(shù) : * */ void uart0_init(void) / 關閉 UART00 UCSR0B = 0 x00; UCSR0A = 0 x00; /
30、 不使用倍速發(fā)送(異步) / 數(shù)據(jù)位為 8 位 / 異步正常情況下的計算公式 / 接收使能和發(fā)送使能 UCSR0C =(1UCSZ01)|(1UCSZ00); UBRR0L=(fosc/16/(baud+1)%256; UBRR0H=(fosc/16/(baud+1)/256; UCSR0B =(1RXEN0)|(1TXEN0); /* * 函數(shù)功能 :uart0 發(fā)送單字節(jié)數(shù)據(jù) 入口參數(shù) :c 出口參數(shù) : * */ void putchar0(unsigned char c) while (!(UCSR0A/ 表明發(fā)送器已經準備就緒 UDR0=c; / 將要發(fā)送的數(shù)據(jù)裝入 UDR0 寄存器
31、 * 函數(shù)功能 :uart0 接收單字節(jié)數(shù)據(jù) 入口參數(shù) : 出口參數(shù) : * */ unsigned char getchar0(void) 表明已經接收完畢 while(!(UCSR0A/ return UDR0; * 函數(shù)功能 :uart0 發(fā)送字符串數(shù)據(jù) 入口參數(shù) :*s 岀口參數(shù): * */ void putsO(char *s) while (*s) putcharO(*s); s+; putcharO(OxOa);/ 回車換行 /putcharO(OxOd); * 函數(shù)功能:主程序 入口參數(shù): 岀口參數(shù): * */ void main(void) unsigned char i;
32、uartO_init();/UARTO 初始化 putsO(HELLO!); while(1) putsO(test ok!); 9、串 口通信(USART1 ) */ /*串口 1測試程序*/ /* 目標器件:ATmega128*/ /* 晶振:RC 8MHZ*/ /*選用的波特率:9600 (也可以另外設定),改了波特率后需要將電源拔了再插上方可使用*/ /* 編譯環(huán)境:ICCAVR 7.13*/ */ */ /*E-Mail: /*時間:2010年1月14日 * */ 包含頭文件 * #include #include 宏定義 */ #define fosc 8000000 / 晶振 8
33、MHZ #define baud 9600 /波特率 * 函數(shù)功能 :uart1 初始化程序 入口參數(shù) : 出口參數(shù) : * */ void uart1_init(void) /USART1 初始化 UCSR1B = 0 x00;/ 關閉 USART1 UCSR1A = 0 x00;/ 不適使用倍速發(fā)送 UCSR1C = (1UCSZ11)|(1UCSZ10);/ UBRR1L=(fosc/16/(baud+1)%256;/ UBRR1H=(fosc/16/(baud+1)/256; UCSR1B =(1RXEN1)|(1TXEN1); / 數(shù)據(jù)位為八位 異步正常模式下, UBRR 的計算公式
34、 接收使能,傳送使能 /* * 函數(shù)功能 :uart1 發(fā)送單字節(jié)數(shù)據(jù) 入口參數(shù) :c 出口參數(shù) : * */ void putchar1(unsigned char c)/ 串口 1 發(fā)送字符 while (!(UCSR1A/ 表明發(fā)送器一準備就緒 UDR1=c; /* * 函數(shù)功能 :uart1 接收單字節(jié)數(shù)據(jù) 入口參數(shù) : 出口參數(shù) : */ unsigned char getchar1(void) / 串口 1 接回收數(shù)據(jù) while(!(UCSR1A return UDR1;/ 將接收到的字符返回 /* * 函數(shù)功能 :uart1 發(fā)送字符串數(shù)據(jù) 入口參數(shù) :*s 出口參數(shù) : *
35、*/ void puts1(char *s) while (*s) putchar1(*s); s+; putchar1(0 x0a);/ 回車換行 putchar1(0 x0d); /* * 函數(shù)功能 : 主程序 入口參數(shù) : 出口參數(shù) : * */ void main(void) unsigned char i; uart1_init(); puts1(HELLO!); while(1) puts1(test ok!); 需要注意的是: 1、 要保證串口通信的成功,PC機和單片機必須設置成一樣的波特率,這樣才能夠保證串口通信的成功。 2、上面提到的串口指的是九針的串口,它的幾個相應的管腳定
36、義如下: 2接受數(shù)據(jù)(RXD) 3發(fā)岀數(shù)據(jù)(TXD) 5信號地線(SG) 下面是引腳圖 10 、 ATMEGA128 SPI馬驅動 ATMEGA128 單片機SPI通信驅動程序 /* 文件:spi.c 用途:SPI驅動 * 函數(shù)名稱:spi_init(void) *功能描述:SPI初始化 *輸入: *輸岀: * 全局變量:無 *調用模塊: *說明: *注意: * */ void spi_init(void) DDRB |= (1vvM0SI)|(1vSCK)|(1vvSS);/ 設置 MOSI 和 SCK 輸出 SPCR = (1vvSPE)|(1vvMSTR)|(1vvSPR0)|(1vSP
37、R1);/使能 SPI,主機模式 /SPE,使能SPI ; MSTR,主機模式;SPR0和SPR1設置時鐘頻率 /* * 函數(shù)名稱:SPI_MasterTransmit(char Data) *功能描述:SPI主機發(fā)送數(shù)據(jù) *輸入: Data 需要通過SPI傳輸?shù)臄?shù)據(jù) *輸岀: * 全局變量:無 *調用模塊: *說明: *注意: * */ void SPI_MasterTransmit(char Data) /*啟動數(shù)據(jù)傳輸*/ SPDR = Data; /*等待傳輸結束*/ while(!(SPSR while(ivn) for(j=0;j1000;j+); i+; void pwm0_in
38、it(void) DDRB=0X10; TCCR0=0X00; 0CR0=0X7F;/8位的定時計數(shù)器的初值設定為0 x7f TCNT0=0; / 計數(shù)器 TCCR0=0X6A;設置為快速pwm模式,采取8分頻 void main(void) uchar wide; char temp; pwm0_init(); while(1) delay_ms(50); if(+wide=255) wide=0; OCR0=wide; 定時器1數(shù)碼管顯示(1s) config.h 文件 /*時間誤差:0.00672 秒每秒*/ #define SS 0 #define SCK 1 #define MOSI
39、 2 #define MISO 3 #define SS_H() PORTB|=(1SS) #define SS_L() PORTBPORTB|=(1vv4); #define led0_dis() DDRB|=14;PORTB #define led1_en() DDRB|=1v5;PORTB|=(1v5); #define led1_dis() DDRB|=1vv5;PORTB #define led2_en() DDRB|=1vv6;PORTB|=(1vv6); #define led2_dis() DDRB|=1vv6;PORTB#define led3_en() DDRB|=17;P
40、ORTB|=(17); #define led3_dis() DDRB|=17;PORTB #define OE 7 #define point 4 #define dp 7 #include #include void port_init (void) DDRA=0XFF; PORTA=0XFF; /0,1,2,3,4 /5,6,7,8,9 /a,b,c,d,e,f const unsigned char table=0 x3F,0 x06,0 x5B,0 x4F,0 x66, 0 x6D,0 x7D,0 x07,0 x7F,0 x6F, 0 x77,0 x7C,0 x39,0 x5E,0
41、x79,0 x71,0 x00; volatile unsigned char led_buffer4; void delay_1us(void) asm(nop); void delay_nus(unsigned int n) unsigned int i=0; for (i=0;in;i+) delay_1us(); void delay_1ms(void) unsigned int i; for (i=0;i1140;i+); void delay_nms(unsigned int n) unsigned int i=0; for (i=0;in;i+) delay_1ms(); /*
42、完成 spi 的初始化 */ /1us 延時函數(shù) /N us 延時函數(shù) /1ms 延時函數(shù) /N ms 延時函數(shù) SCK 輸出 使能 SPI ,主機模式 void spi_init(void) DDRB |= (1MOSI)|(1SCK)|(1SS);/設置 MOSI SPCR = (1SPE)|(1MSTR)|(1SPR0)|(1SPR1);/ /*spi 主機傳送數(shù)據(jù) */ void SPI_MasterTransmit(char Data) /* 啟動數(shù)據(jù)傳輸 */ SPDR = Data; /* 等待傳輸結束 */ while(!(SPSR / 設置 PORTC7 為輸出 PORTC
43、/ 輸出高電平,使能 595 PORTB = 0 x0F;/ 同時打開四個數(shù)碼管的位選 spi_init(); led_buffer0=16;/ 初始化數(shù)碼管段碼 led_buffer1=16; led_buffer2=16; led_buffer3=16; /*HC595 完成傳送數(shù)據(jù) */ void HC_595_OUT(unsigned char data) SS_L(); SPI_MasterTransmit(data); SS_H(); void leddis_update(void) /* 最低位數(shù)碼管,第四個數(shù)碼管 */ if(point=0) HC_595_OUT(tablel
44、ed_buffer3|(1dp); else HC_595_OUT(tableled_buffer3); led0_en(); delay_nus(60); led0_dis(); if(point=1) HC_595_OUT(tableled_buffer2|(1dp); else HC_595_OUT(tableled_buffer2); led1_en(); delay_nus(60); led1_dis(); if(point=2) HC_595_OUT(tableled_buffer1|(1dp); else HC_595_OUT(tableled_buffer1); led2_en
45、(); delay_nus(60); led2_dis(); /* 最高位數(shù)碼管,第一個數(shù)碼管 */ if(point=3) HC_595_OUT(tableled_buffer0|(19999) HC_595_OUT(0 xFF); / 當計數(shù)大于 9999 時,四個數(shù)碼管同時輸出 8 PORTB|=(14)|(15)|(16)|(1999) led_buffer0=data/1000; led_buffer1=(data%1000)/100; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else if(d
46、ata99) led_buffer0=16; / 關閉最高位的那個數(shù)碼管 led_buffer1=(data%1000)/100; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else if(data9) led_buffer0=16; led_buffer1=16; led_buffer2=(data%100)/10; led_buffer3=data%10; leddis_update(); else led_buffer0=16; led_buffer1=16; led_buffer2=16; led_
47、buffer3=data%10; leddis_update(); void init_devices(void) CLI(); port_init(); HC_595_init(); timer1_init(); /TIMSK = 0 x04; /disable all interrupts / 端口初始化 /595 初始化 / 定時器 1 初始化 / 定時器 1 中斷溢出使能 / 或者寫成 TIMSK|=(1TOIE1); main.c 文件 包含頭文件 * #include #include #include config.h 全局變量 /* * int k; volatile unsi
48、gned int cnt; * 函數(shù)功能 : 定時器初始化程序 入口參數(shù) : 出口參數(shù) : * */ void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1H = 0 xFF; /setup 1s TCNT1L = 0 x3D; / (12*16+2)*40*1024/8000000=0.99328s OCR1AH = 0 x00; OCR1AL = 0 xC3; OCR1BH = 0 x00; OCR1BL = 0 xC3; OCR1CH = 0 x00; OCR1CL = 0 xC3; ICR1H = 0 x00; ICR1L = 0 xC3;
49、 TCCR1A = 0 x00; TCCR1B = 0 x05; /start Timer 1024 DDRE|=12; PORTE|=140) k=0; PORTA 人=0 x01; cnt+; if(cnt=10000) cnt=0; /* * 函數(shù)功能:主程序 入口參數(shù): 岀口參數(shù): * */ void main (void) CLI(); /disable all interrupts init_devices(); MCUCR = 0 x00; TIMSK = 0 x04;T0溢出使能 SEI(); /enable interrupts while(1) display_led(cn
50、t); 定時器1 :定時計數(shù)(1s ) main.c 文件: 包含頭文件 */ * #include #include #include config.h 全局變量 /* */ int k; volatile unsigned int cnt; unsigned char fenpin=0 x01,0 x02,0 x03,0 x04,0 x05; /分頻系數(shù)分別為:1,8,64,256,1024; * 函數(shù)功能:定時器初始化程序 入口參數(shù): 岀口參數(shù): * */ void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1H = 0 xF0; /setu
51、p 1s TCNT1L = 0 xBE; /(16*16*15+4*16)*1024/8000000*2=0.999424S TCCR1A = 0 x00; TCCR1B = fenpin4; /start Timer 1024 DDRE|=12; PORTE|=12; /* * 函數(shù)功能 : 定時中斷服務程序 入口參數(shù) : 出口參數(shù) : * */ #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) TCNT1H = 0 xF0; /reload counter high value TCNT1L = 0
52、xBE; /reload counter low value cnt+; if(cnt=20000) cnt=0; /* * 函數(shù)功能 : 主程序 入口參數(shù) : 出口參數(shù) : * */ void main (void) CLI(); /disable all interrupts init_devices(); MCUCR = 0 x00; TIMSK = 0 x04; /T1 溢出使能 SEI(); /enable interrupts while(1) display_led(cnt/2); config.h 文件: /* 時間誤差: 0.00672 秒每秒 */ #define SS 0
53、 #define SCK 1 #define MOSI 2 #define MISO 3 #define SS_H() PORTB|=(1SS) #define SS_L() PORTBPORTB|=(14); #define led0_dis() DDRB|=14;PORTB #define led1_en() DDRB|=15;PORTB|=(15); #define led1_dis() DDRB|=15;PORTB #define led2_en() DDRB|=16;PORTB|=(16); #define led2_dis() DDRB|=16;PORTB #define led3
54、_en() DDRB|=17;PORTB|=(17); #define led3_dis() DDRB|=17;PORTB #define OE 7 #define point 4 #define dp 7 #include / 開第一個數(shù)碼管的位選 / 關第一個數(shù)碼管的位選 #include void port_init (void) DDRA=0XFF; PORTA=0XFF; const unsigned char table=0 x3F,0 x06,0 x5B,0 x4F,0 x66, 0 x6D,0 x7D,0 x07,0 x7F,0 x6F, 0 x77,0 x7C,0 x39,0
55、 x5E,0 x79,0 x71,0 x00; /0,1,2,3,4 /5,6,7,8,9 /a,b,c,d,e,f volatile unsigned char led_buffer4; void delay_1us(void) asm(nop); void delay_nus(unsigned int n) unsigned int i=0; for (i=0;in;i+) delay_1us(); /1us 延時函數(shù) /N us 延時函數(shù) void delay_1ms(void) /1ms 延時函數(shù) unsigned int i; for (i=0;i1140;i+); void del
56、ay_nms(unsigned int n)/N ms 延時函數(shù) unsigned int i=0; for (i=0;in;i+) delay_1ms(); /* 完成 spi 的初始化 */ void spi_init(void) DDRB |= (1MOSI)|(1SCK)|(1SS);/ 設置 MOSI , SCK 輸出 SPCR = (1SPE)|(1MSTR)|(1SPR0)|(1SPR1);/ 使能 SPI ,主機模式 /*spi 主機傳送數(shù)據(jù) */ void SPI_MasterTransmit(char Data) /* 啟動數(shù)據(jù)傳輸 */ SPDR = Data; /* 等
57、待傳輸結束 */ while(!(SPSR / 設置 PORTC7 為輸出 PORTC / 輸出高電平,使能 595 PORTB = 0 x0F;/ 同時打開四個數(shù)碼管的位選 spi_init(); led_buffer0=16;/ 初始化數(shù)碼管段碼 led_buffer1=16; led_buffer2=16; led_buffer3=16; /*HC595 完成傳送數(shù)據(jù) */ void HC_595_OUT(unsigned char data) SS_L(); SPI_MasterTransmit(data); SS_H(); void leddis_update(void) /* 最低
58、位數(shù)碼管,第四個數(shù)碼管 */ if(point=0) HC_595_OUT(tableled_buffer3|(1dp); else HC_595_OUT(tableled_buffer3); led0_en(); delay_nus(60); led0_dis(); if(point=1) HC_595_OUT(tableled_buffer2|(1dp); else HC_595_OUT(tableled_buffer2); led1_en(); delay_nus(60); led1_dis(); if(point=2) HC_595_OUT(tableled_buffer1|(1dp); else HC_595_OUT(tableled_buffer1); led2_en(); delay_nus(60); led2_dis(); /* 最高位數(shù)碼管,第一個數(shù)碼管 */ if(point=3) HC_595_OUT(tableled_buffer0|(19999) HC_595_OUT(0 xFF); / 當計數(shù)大于 9999 時,四個數(shù)碼管同時輸出 8 PORTB|=(14)|(15)|(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)園區(qū)的水質監(jiān)測與管理研究
- 工程機械的動載荷特性研究
- 40人公司管理制度
- ab公司管理制度
- 標準公司內部管理制度
- 校區(qū)裝修現(xiàn)場管理制度
- 校園學生安全管理制度
- 校園廣播學生管理制度
- 校園疫情輿論管理制度
- 校園防控交通管理制度
- 漂發(fā)染發(fā)知識培訓課件
- 2025年山東威海文旅發(fā)展集團有限公司招聘筆試參考題庫含答案解析
- 《美國西部拓荒運動》課件
- 燃氣管道安全事故應急預案
- 口腔護士配臺流程
- 擔保合同約定協(xié)議書(2篇)
- 【MOOC期末】《結構力學》(東南大學)中國大學慕課答案
- 《檔案數(shù)字化管理》課件
- 《國防動員實施》課件
- 建筑法知識培訓課件
- 法院書記員聘用必背考試題庫(含答案)
評論
0/150
提交評論