完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
有哪位大哥能帮我看看数码管显示的问题,显示不正确
//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< PORT_WAVE_ECHO &= ~(1< LEDDDR |= 0XFF; LED = 0xFF; } void Initial_Timer(void) { TCCR1B = 0; TCCR1A = 0x00; TCCR1B = (1< TIMSK |= (1< void GenerateTrig(void) { PORT_WAVE_TRIG |= (1< 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< LED ^= (1< else //下降沿 { falling_edge = ICR1L; temp = ICR1H; falling_edge |= temp<<8; TCCR1B |= (1< } 补充内容 (2016-3-17 09:24): ATMEGA128A芯片 |
|
相关推荐
1个回答
|
|
已解决,本人自己解决了
|
|
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5140 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7774 浏览 0 评论
3038 浏览 2 评论
3111 浏览 1 评论
10068 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 05:42 , Processed in 0.473817 second(s), Total 83, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号