查看: 1427|回复: 6
打印 上一主题 下一主题

基于ATmega16单片机ADC模数转换程序--数码管显示

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-7 19:45:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
。。。话不多说。。直接上代码。。若有错误请多指教(实测可行)
  1. /******************************************************
  2. //文件名称:
  3. //作    者:LXE
  4. //版    本:
  5. //日    期:2014.8.7
  6. //说    明:PA0口为ADC输入口PB口用以发送段码PA4~PA7用以发送位码  8M时钟
  7. //修改记录:
  8. *******************************************************/
  9. #include <iom16v.h>
  10. #include <macros.h>

  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define ulong unsigned long

  14. uchar seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //断码表PB0~PB7
  15. uchar table[]={0x10,0x20,0x40,0x80};                                //位码表PA4~PA7
  16. uchar buf[]={0,0,0,0};                                              //数据缓存区
  17. uchar k = 0;
  18. /*******************************************************
  19. //函数名称:uint get_ADC(void)
  20. //函数功能:进行ADC模数转换
  21. //输入参数:无
  22. //返回参数:ad_data
  23. ********************************************************/
  24. uint get_ADC(void)
  25. {
  26.     uint ad_data;
  27.     DDRA &= ~BIT(0);                                    //PA0设为输入
  28.     PORTA &= ~BIT(0);                                   //PA0不上拉
  29.     SFIOR = 0x00;                                       //ADC转换触发源为连续自动转换
  30.     ADMUX = (1<<REFS0);                                 //0x40;ADC参考电源AVcc,AREF并接电容,选择单端输入,输入口为PA0
  31.     ADCSR = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);  //0xC6;ADC使能置1,转换开始位置1,ADC时钟分频为64分频  8M时钟
  32.     while(!(ADCSR & (1<<ADIF)));                        //等待转换结束,ADC中断标志置位
  33.     ad_data = ADC;                                      //读取ADC值
  34.     ADCSR |= (1<<ADIF);                                 //ADC中断标志位写入1"清零"
  35.     ADCSR = 0x00;                                       //关闭ADC转换
  36.     return ad_data;                                     //返回本次ADC转换值
  37. }
  38. /*******************************************************
  39. //函数名称:void Adc_to_display(void)
  40. //函数功能:将得到的ADC值转换为10进制数
  41. //输入参数:无
  42. //返回参数:无
  43. ********************************************************/
  44. void Adc_to_display(void)
  45. {
  46.     uint adc = 0;
  47.     ulong temp = 0;
  48.     temp = get_ADC();
  49.     adc = temp*5000/1024;                                //ADC值转换为电压值
  50.     buf[3] =  adc / 1000;                                //获取电压值存入buf缓存区
  51.     buf[2] =  adc % 1000 /100;                           //获取电压值存入buf缓存区
  52.     buf[1] =  adc % 100 /10;                             //获取电压值存入buf缓存区
  53.     buf[0] =  adc % 10;                                  //获取电压值存入buf缓存区
  54. }
  55. /*******************************************************
  56. //函数名称:void timer0_ovf_isr(void)
  57. //函数功能:定时器0溢出中断2ms
  58. //输入参数:无
  59. //返回参数:无
  60. ********************************************************/
  61. #pragma interrupt_handler timer0_ovf_isr:10
  62. void timer0_ovf_isr(void)
  63. {
  64.     if(k > 3){k = 0;}                                   //用四个数码管显示
  65.     PORTB = seg[buf[k]];                                //PB口发送段码
  66.     PORTA  = ~table[k];                                 //PC口发送位码
  67.     k++;
  68. }
  69. /*******************************************************
  70. //函数名称:void main(void)
  71. //函数功能:主函数
  72. //输入参数:无
  73. //返回参数:无
  74. ********************************************************/
  75. void main(void)
  76. {
  77.     DDRA  = 0xFF;               //设置PA口为输出方式
  78.     PORTA = 0xFF;               //设置PA口为上拉模式
  79.     DDRB  = 0xFF;               //设置PB口为输出方式
  80.     PORTB = 0xFF;               //设置PB口为上拉模式
  81.     /*******初始化定时器0******/
  82.     TCNT0 = 0x4E;               //赋初值
  83.     TCCR0 = 0x03;               //设置TC0为CLK/1024分频,启动TC0
  84.     TIMSK = 0x01;               //设置定时计数器的屏蔽寄存器
  85.     SEI();                      //中断使能
  86.     while(1)
  87.     {
  88.         Adc_to_display();              //ADC值转换
  89.     }
  90. }
复制代码


回复

使用道具 举报

地板
发表于 2014-8-8 09:12:54 | 只看该作者
受教了。。。呵呵
回复 支持 反对

使用道具 举报

4#
发表于 2014-8-8 09:19:10 | 只看该作者
不错,领悟了
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2014-8-9 08:58:23 | 只看该作者
张衍波 发表于 2014-8-8 13:36
老好人呢,,,,

这话是几个意思??
回复 支持 反对

使用道具 举报

7#
发表于 2014-8-9 11:20:32 | 只看该作者
八错,我决定用你的{:soso_e102:}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表