3658|1

17

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

avr 输入捕获 [复制链接]

#include
#include
#include
#define uchar unsigned char
#define uint  unsigned int
const uchar seg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uint cap1=0,cap2=0;
volatile uchar full_time=0,flag=0;
uchar a[6];
uchar i;
void Port_init()      //端口初始化
{
        PORTA=0X00;DDRA=0XFF;
        PORTB=0X00;DDRB=0XFF;
        PORTD=0X00;DDRD=0X00;
}
void T1_init()       //定时器1初始化
{
        TIMSK|=_BV(TICIE1)|_BV(TOIE1);
        TCCR1B|=_BV(ICNC1)|_BV(ICES1)|_BV(CS12)|_BV(CS10);
}
void display()        //数码管扫描
{
        for(i=0;i<6;i++)
        {
                PORTB=_BV(i);
                PORTA=seg_code[a[5-i]];
                _delay_ms(1);
        }
}
int main(void)
{
        Port_init();
        T1_init();
        sei();          //开总中断
    while(1)
    {
                if(flag==1)
                {
                        if(cap1==0)
                                cap1=ICR1;    //将第一次获得的ICR1值赋给cap1
                        else
                                cap2=ICR1;    //将第二次获得的ICR1值赋给cap2
                        switch(full_time)         
                        {
                                case 0:cap2=cap2-cap1;break;       //定时器1没有溢出时获得两次ICR1差值赋给cap2
                                case 1:if(cap2<=cap1) cap2=65535-cap1+cap2;else  break;   //发生一次溢出时判断cap2是否小于cap1,如果小于根据计算获得两次差值,否则此数据无效
                                case 2:break;   //溢出次数大于或者等于两次,此数据无效
                        }
                }
                TIMSK=0X00;    //禁止输入捕获
                cap2=4000000*1024/cap2;   //将获得的差值,转换成频率值
                a=cap2%10;
                cap2/=10;
                display();
                TCNT1=cap1=cap2=full_time=flag=0;   //清零TCNT1和各标志位
    }                       
}
ISR(TIMER1_OVF_vect)
{
        full_time++;           //溢出次数
}
ISR(TIMER1_CAPT_vect)
{
        flag=1;             //输入捕获标志
}
点赞 关注
 

回复
举报

17

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
大家给帮忙看看,这个程序哪里错了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表