搜索
bottom↓
回复: 1

问下马老师第10章ad转换例子程序的执行顺序问题

[复制链接]

出0入0汤圆

发表于 2007-6-8 09:02:49 | 显示全部楼层 |阅读模式
就是这段程序:

#include <mega16.h>



flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

flash char position[6]={0xfe,0xfd,0xfb,0xf7};



unsigned char dis_buff[4]={0,0,0,0},posit;

bit time_2ms_ok;



// ADC电压值送显示缓冲区函数

void adc_to_disbuffer(unsigned int adc)               

{

                char i;

                for (i=0;i<=3;i++)

                {

                        dis_buff=adc % 10;

                        adc /= 10;

                }

}



// Timer 0 比较匹配中断服务

interrupt [TIM0_COMP] void timer0_comp_isr(void)

{

                time_2ms_ok = 1;

}



// ADC 转换完成中断服务

interrupt [ADC_INT] void adc_isr(void)

{   

    unsigned int adc_data,adc_v;

    adc_data=ADCW;                  //读取ADC置换结果                  

    adc_v=(unsigned long)adc_data*5000/1024;    //换算成电压值

    adc_to_disbuffer(adc_v);

}



void display(void)        // 4位LED数码管动态扫描函数

{

    PORTA |= 0x0f;       

                PORTC = led_7[dis_buff[posit]];

                if (posit==3) PORTC |= 0x80;

                PORTA &= position[posit];

                if (++posit >=4 ) posit = 0;

}

// 系统主程序

void main(void)

{

                DDRA=0x0f;        // !!见以下说明

                PORTA=0x0f;        // !!见以下说明                               

                DDRC=0xff;    // LED显示控制I/O端口初始化

                PORTC=0x00;

                // T/C0 初始化

                TCCR0=0x0B;   // 内部时钟,64分频(4M/64=62.5KHz),CTC模式

                TCNT0=0x00;     

                OCR0=0x7C;    // OCR0 = 0x7C(124),(124+1)/62.5=2ms

                TIMSK=0x02;   // 允许T/C0比较中断



    // ADC 初始化

    ADMUX=0x47;     // 参考电源AVcc、ADC7单端输入

    SFIOR&=0x1F;   

    SFIOR|=0x60;    // 选择T/C0比较匹配中断为ADC触发源

    ADCSRA=0xAD;    // ADC允许、自动触发转换、ADC转换中断允许、ADCclk=125Kz



    #asm("sei")     // 开放全局中断



    while (1)

    {

        if (time_2ms_ok)

        {

                        display();          // LED扫描显示        

                        time_2ms_ok = 0;

        }

    }

}

我对时间匹配触发ad转换不太明白,是不是这样的执行顺序:主函数一直执行while (1){...}

时间匹配时,开显示time_2ms_ok=1;同时触发ad转换(ad转化开始).ad转换过程完成后产生中断,如果

time_2ms_ok为1则显示出来并清0.

一般的程序有1条主线,这里有2个中断,我不怎么能把握好程序的流程,执行顺序.

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-6-8 17:54:40 | 显示全部楼层
是的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 20:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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