ATmega16单片机实现超声波测距,代码不知道错在哪里,没有结果?

#include <iom16v.h>#include <AVRdef.h>#include <io8515v.h>#include <stdio.h>#include <macros.h> #define uchar unsigned char #define uint unsigned int//RS置位 #define RS_SET PORTB|=BIT(0) //RS清零 #define RS_CLR PORTB&=~BIT(0) //RW置位 #define RW_SET PORTB|=BIT(1) //RW清零 #define RW_CLR PORTB&=~BIT(1)//EN置位 #define EN_SET PORTB|=BIT(2)//EN清零 #define EN_CLR PORTB&=~BIT(2) //外部中断0控制 #define INT0_OFF GICR&=~BIT(6) #define INT0_ON GICR|=BIT(6)//定时器1中断控制 #define TIMER1_INT_ON TIMSK|=BIT(5) #define TIMER1_INT_OFF TIMSK&=~BIT(5)//定时器1运行控制 #define TIMER1_OFF TCCR1B&=0XF8 #define TIMER1_ON TCCR1B=(TCCR1B&0XF8)|0X02 uchar DISTANCE_TABLE[]={0,0,0,0}; uchar TEMP_TABLE[]={0,0,0}; uchar RUN_FLAG=0,RESET_FLAG=0,TIMER1_OV_FLAG=0; uchar cnt=0,CAP_SUCCESS_FLAG=0,i=0; uint CAP_TABLE=0,temp=0; void delay(uint t) { while(t--); } void lcd_wcmd(uchar cmd) { RS_CLR; RW_CLR; EN_CLR; delay(50); PORTA=cmd; delay(100); EN_SET; delay(100); EN_CLR; } void lcd_pos(uchar hang,uchar lie) { if(hang==1) { lcd_wcmd(lie+0x7F); } else if (hang==2) { lcd_wcmd(lie+0xBF); } } void lcd_wdat(uchar dat) { RS_SET; RW_CLR; EN_CLR; delay(50); PORTA=dat; delay(100); EN_SET; delay(100); EN_CLR; } void IO_initial(void) { DDRA=0XFF; //配置PA为输出 DDRB=0XFF; //配置RS、RW、E为输出 DDRD=0; //配置PD口为输入 PORTD=0XFF; //配置PD6、PD2为带上拉输入 } void LCD1602_initial(void) { lcd_wcmd(0x38); delay(5000); lcd_wcmd(0x0c); delay(5000); lcd_wcmd(0x06); delay(5000); lcd_wcmd(0x01); delay(5000); } //函数说明将定时器1设置为输入捕获 void TIMER1_initial(void) { TCCR1A=0X00; TCCR1B=0X00;//0000 0000 TCNT1=0; ICR1=0; } void initial(void) { IO_initial(); PORTC&=~BIT(4); LCD1602_initial(); TIMER1_initial(); TIMSK|=BIT(5)|BIT(2); MCUCR=0X02; INT0_ON; SREG|=BIT(7); } //计算被测距离计算结果格式XXXXmm void count() { float m=340,dist=0; dist=m/2000; dist=dist*CAP_TABLE; //算出被测距离 DISTANCE_TABLE[0]=(int)dist/1000%10; DISTANCE_TABLE[1]=(int)dist/100%10; DISTANCE_TABLE[2]=(int)dist/10%10; DISTANCE_TABLE[3]=(int)dist%10; lcd_pos(2,10); for(i=0;i<4;i++) lcd_wdat('0'+DISTANCE_TABLE[i]); lcd_wdat('m'); lcd_wdat('m'); }//向模块发送启动信号 void SEND(void) { PORTB|=BIT(3); delay(16);//约为14us PORTB&=~BIT(3); } void main(void) { initial(); while(1) { SEND(); while(!(PIND&0X40)); TIMER1_ON; TIFR|=BIT(5); TIMER1_INT_ON; count(); for(i=0;i<40;i++) delay(60000); cnt--; } } //函数说明定时器1输入捕获中断函数 #pragma interrupt_handler T1_CAP:6 void T1_CAP(void) { TIMER1_OFF; TIMER1_INT_OFF; CAP_TABLE=ICR1; ICR1=0; TCNT1=0; TIFR|=BIT(5); }

第1个回答  2020-01-04
调试程序,可以根据自己的每一步要实现的,单步运行,看看有没有按照自己的要求来做。本回答被网友采纳
相似回答