AVR技术论坛
直播中

nervpe

8年用户 145经验值
擅长:RF/无线
私信 关注
[AVR问答]

求助 4位数码管显示超声测距

有哪位大哥能帮我看看数码管显示的问题,显示不正确

//AVRstudio6下写的晶振8M.

#include
#define  F_CPU 8000000
#include til/delay.h>
#include
#include                  //中断信号头文件

#define LED          PORTE                //数据口
#define LEDDDR       DDRE                 //数据口方向寄存器

#define PORT_DATA  PORTC                  //定义c为数码管段码
#define PORT_SEL   PORTA                  //定义A为数码管位码
#define DDR_DATA   DDRC                   //输出方向
#define DDR_SEL    DDRA

#define DDR_WAVE_TRIG   DDRD              //电平检测PD6为TRIG,PD4为ECHO
#define DDR_WAVE_ECHO   DDRD
#define PORT_WAVE_TRIG  PORTD
#define PORT_WAVE_ECHO  PORTD
#define PIN__WAVE_TRIG  PIND
#define PIN__WAVE_ECHO  PIND
#define TRIG  PD6
#define ECHO  PD4

#define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)

#define uchar           unsigned char
#define uint            unsigned int
#define ulong           unsigned long

volatile ulong ov_counter=0;
volatile uint rising_edge,falling_edge;
volatile ulong pulse_clocks = 1000;    //高电平宽度
volatile uint temp;
/*****************************************************
                      数码管显示程序
*****************************************************/
const uchar  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const uchar  data[]={0xfe,0Xfd,0Xfb,0Xf7};

void Display(char *p)
{
char i,sel=0x01;
for(i=0;i<4;i++)
{
PORT_SEL = sel;     // 1 表示选通
PORT_DATA = ~table[p];

if(i == 0)
PORT_DATA &= ~(1<<7);

delay_ms(4);
PORT_DATA= 0xFF ;
sel= sel<<1;
}
}
void Calc_Distance( char* p)
{
       
        volatile unsigned long TN = 0;
        TN = (falling_edge*17/100);// 单位为mm
       
                p[0]=TN%10;            //个位
                p[1]=(TN/10)%10;       //十位
                p[2]=(TN/100)%10;      //百位
                p[3]=(TN/1000)%10;     //千位
                PORT_DATA=~p[0];
                PORT_SEL=0xfe;
                delay_ms(4);
                PORT_DATA=~p[1];
                PORT_SEL=0xfd;
                delay_ms(4);
                PORT_DATA=~p[2];
                PORT_SEL=0xfb;
                delay_ms(4);
                PORT_DATA=~p[3];
                PORT_SEL=0xf7;
                delay_ms(4);
}
  /*****************************************************
                      脉冲发生程序
*****************************************************/
void Io_Init(Void)
{
DDR_DATA = 0xFF;
PORT_DATA = 0x00;

DDR_SEL  = 0x0F;
PORT_SEL = 0x0F;

DDR_WAVE_ECHO &= ~(1< DDR_WAVE_TRIG |= (1<
PORT_WAVE_ECHO &= ~(1< PORT_WAVE_TRIG &= ~(1<
  LEDDDR |= 0XFF;
  LED = 0xFF;
}
void Initial_Timer(void)
{
TCCR1B = 0;
TCCR1A = 0x00;
TCCR1B = (1<
TIMSK |= (1< }

void GenerateTrig(void)
{
PORT_WAVE_TRIG |= (1< delay_us(30);
PORT_WAVE_TRIG &= ~(1< }
  /*****************************************************
                      主程序
*****************************************************/
void main()
{
unsigned int count = 0;
Io_Init();
Initial_Timer();
asm("SEI"); //打开全局中断

while(1)
{

Calc_Distance(data);

count++;
if(count > 100)//产生一次Trig
{
count = 0;
GenerateTrig();
}

Display(data);
}

}

ISR(TIMER1_OVF_vect)
{
ov_counter++;
}

ISR(TIMER1_CAPT_vect)                //信号捕获
{
    if(PIN__WAVE_ECHO & (1<< ECHO)) //上升沿
{
   TCNT1H = 0;
   TCNT1L = 0;
   TCCR1B &= ~(1<    ov_counter=0;

LED ^= (1< LED |= ~((1<     }
    else //下降沿
{
   falling_edge = ICR1L;
   temp = ICR1H;
   falling_edge |= temp<<8;

TCCR1B |= (1< LED ^= (1< LED |= ~((1<     }
}




补充内容 (2016-3-17 09:24):
ATMEGA128A芯片
已退回5积分

回帖(1)

nervpe

2016-4-11 14:11:49
已解决,本人自己解决了
举报

更多回帖

×
20
完善资料,
赚取积分