[Atmel] 用AtmelStudio6.2跑mega16例程(13):ADC

[复制链接]
1294|0
 楼主| ddllxxrr 发表于 2014-9-12 21:38 | 显示全部楼层 |阅读模式
下面这个程序是靠T0的T/C0比较匹配中断为ADC触发源.

把ADC转换的结果显示到LED上。

以下是程序:
  1. /*
  2. * GccApplication20.c
  3. *
  4. * Created: 2014-9-12 20:02:00
  5. *  Author: Administrator
  6. */


  7. #include <avr/io.h>
  8. #include <avr/interrupt.h>
  9. #define uchar unsigned char
  10. #define uint  unsigned int
  11. #define ulong unsigned long
  12. uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,  //共阳极LED  0~F的段码
  13. 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  14. //uchar dis_buff[4]={0,0,0,0};
  15. uchar cnt;
  16. uint adc_v;
  17. uchar val1,val2,val3,val4;
  18. uchar  m,n;
  19. uint adc_data;
  20. void  delay(uint k)            //延时约0.1ms
  21. {
  22.        
  23.         for(m=0;m<k;m++)
  24.         {
  25.                 for(n=0;n<114;n++);
  26.         }
  27. }
  28. //interrupt [TIM0_COMP] void timer0_comp_isr(void)  // T/C0比较匹配中断服务
  29. ISR(TIMER0_COMP_vect)
  30. {
  31.         cnt=0x01;
  32. }
  33. //interrupt [ADC_INT] void adc_isr(void)  // ADC转换完成中断服务
  34. ISR(ADC_vect)
  35. {
  36.        
  37.         adc_data=ADCW;                      //读取ADC置换结果
  38.         adc_v=(ulong)adc_data*5000/1024;    //换算成电压值
  39. }
  40. void display(void)
  41. {
  42.        
  43.         val1=adc_v/1000;
  44.         val2=(adc_v/100)%10;
  45.         val3=(adc_v/10)%10;
  46.         val4=adc_v%10;
  47.         PORTD=0x01;
  48.         PORTC=tab[val1];
  49.         //PORTC.7=0;                            //小数点
  50.         PORTC &=~(1<<7);
  51.         delay(10);
  52.         PORTD=0x02;
  53.         PORTC=tab[val2];
  54.         delay(10);
  55.         PORTD=0x04;
  56.         PORTC=tab[val3];
  57.         delay(10);
  58.         PORTD=0x08;
  59.         PORTC=tab[val4];
  60.         delay(10);
  61. }
  62. int main(void)
  63. {
  64.         DDRA=0x00;      //模拟量由PA0输入
  65.         PORTA=0x00;
  66.         DDRC=0xFF;
  67.         PORTC=0xFF;     //PORTC端口与LED段码相连
  68.         DDRD=0xFF;
  69.         PORTD=0xFF;
  70.         TCCR0=0x0B;     // 内部时钟,64分频(8M/64=125KHz),CTC模式
  71.         TCNT0=0x00;
  72.         OCR0=0xF9;    // OCR0 = 0xF9(249),(249+1)/125=2ms
  73.         TIMSK=0x02;    // 允许T/C0比较中断
  74.         ADMUX=0x40;     // 参考电源AVcc、ADC7单端输入
  75.         SFIOR&=0x1F;
  76.         SFIOR|=0x60;    // 选择T/C0比较匹配中断为ADC触发源
  77.         ADCSRA=0xAE;    // ADC允许、自动触发转换、ADC转换中断允许、ADCclk=125Kz
  78.         //#asm("sei")     // 开放全局中断
  79.         sei();
  80.         while (1)
  81.         {
  82.                 if (cnt==0x01)
  83.                 {
  84.                         display(); // LED扫描显示
  85.                         cnt=0x00;
  86.                 }
  87.         }
  88. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部