|
學(xué)習(xí)《AVR單片機(jī)與傳感器模塊設(shè)計(jì)》(IAR) 教材,ATMega16 的A/D轉(zhuǎn)換編程實(shí)踐
編程通過 但是仿真 顯示不全
1.jpg (82.42 KB, 下載次數(shù): 48)
下載附件
2021-3-1 19:59 上傳
2.jpg (82.47 KB, 下載次數(shù): 51)
下載附件
2021-3-1 20:01 上傳
- #include <iom16.h>
- unsigned char const SEG7[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //用數(shù)組來預(yù)存數(shù)碼管顯示字符0~9的花樣數(shù)據(jù)
- unsigned char const ACT[4] = {0x01,0x02,0x04,0x08}; //定義動(dòng)態(tài)掃描位的變量以及接收到數(shù)據(jù)標(biāo)志 0xfe,0xfd,0xfb,0xf7
- unsigned int dis_val; //定義顯示變量
- unsigned char i; //定義動(dòng)態(tài)掃描位的變量
- //===========================端口初始化=======================================
- void port_init(void)
- {
- PORTA = 0x00;
- DDRA = 0x00; //PORTA初始化為懸浮輸入
- PORTB = 0xff;
- DDRB = 0xff;
- PORTC = 0xff;
- DDRC = 0xff;
- }
- //===========================ADC初始化========================================
- void adc_init(void)
- {
- ADCSRA = 0xEE; //使能ADC、開始轉(zhuǎn)換、自動(dòng)觸發(fā)、使能中斷、8預(yù)分頻
- ADMUX = 0x40; //使用AVCC做基準(zhǔn)電壓源、數(shù)據(jù)格式為右對(duì)齊、選擇通道0
- }
- //============================定時(shí)器0初始化===================================
- void timer0_init(void)
- {
- TCNT0 = 0x83; //定時(shí)1ms的初始值
- TCCR0 = 0x03; //64預(yù)分頻
- TIMSK = 0x01; //使能定時(shí)器0溢出中斷
- }
- //=============================設(shè)備初始化=====================================
- void init_devices(void)
- {
- port_init(); //調(diào)用端口初始化
- timer0_init(); //調(diào)用定時(shí)器0初始化
- adc_init(); //調(diào)用ADC初始化
- SREG = 0x80; //打開全局中斷
- }
- //===============================A/D轉(zhuǎn)換======================================
- unsigned int ADC_Convert(void)
- {
- unsigned int temp1,temp2;
- temp1 = (unsigned int)ADCL; //先讀取低8位數(shù)據(jù)
- temp2 = (unsigned int)ADCH; //再讀取高8位數(shù)據(jù)
- temp2 = (temp2<<8)+temp1; //高8位左移兩位與低8位合并成10位數(shù)據(jù)
- return(temp2); //返回合并后的值
- }
- //==============================數(shù)據(jù)轉(zhuǎn)換======================================
- unsigned int conv(unsigned int i)
- {
- long x;
- unsigned int y;
- x = (4840*(long)i)/1023; //把變量轉(zhuǎn)化成需要顯示的形式
- y = (unsigned int)x; //把無符號(hào)長(zhǎng)整型變量強(qiáng)制轉(zhuǎn)換成無符號(hào)整型變量
- return y; //返回轉(zhuǎn)換后的值
- }
- //==============================主函數(shù)========================================
- void main(void)
- {
- init_devices(); //調(diào)用設(shè)備初始化
- while(1)
- {
- ; //空循環(huán)
- }
- }
- //=======================中斷函數(shù)(定時(shí)器0溢出中斷)============================
- #pragma vector = TIMER0_OVF_vect
- __interrupt void TIMER0_OVF_Server(void)
- {
- TCNT0 = 0x83; //重載初值
- if(++i>3) //掃描位數(shù)為4位
- i = 0;
- switch(i)
- {
- case 0:PORTB = SEG7[dis_val%10]; //送個(gè)位待顯示的數(shù)據(jù)
- PORTC = ACT[0]; //打開個(gè)位顯示(點(diǎn)亮)
- break;
- case 1:PORTB = SEG7[(dis_val/10)%10]; //送十位待顯示的數(shù)據(jù)
- PORTC = ACT[1]; //打開十位顯示(點(diǎn)亮)
- break;
- case 2:PORTB = SEG7[(dis_val/100)%10]; //送百位待顯示的數(shù)據(jù)
- PORTC = ACT[2]; //打開百位顯示(點(diǎn)亮)
- break;
- case 3:PORTB = SEG7[dis_val/1000]&0x7F; //送千位待顯示的數(shù)據(jù)并點(diǎn)亮小數(shù)點(diǎn)
- PORTC = ACT[3]; //打開千位顯示(點(diǎn)亮)
- break;
- }
- }
- //=======================中斷函數(shù)(A/D轉(zhuǎn)換結(jié)束中斷)============================
- #pragma vector = ADC_vect
- __interrupt void ADC_Server(void)
- {
- dis_val = conv(ADC_Convert()); //獲取A/D轉(zhuǎn)換數(shù)據(jù)并送顯
- }
復(fù)制代碼
|
|