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