谁有 AVR atmega128超声波测距c语言程序,希望可以帮忙注释一下,急用

谁有 AVR atmega128超声波测距c语言程序,希望可以帮忙注释一下,急用,第1张

/***************超声波测距程序*********************/

void uls()

{

unsigned int data=0

PORTB&=0xfe //PB0低电平TRIG发射端

PORTB|=0x01 //PB0高电橡祥李梁迟平

Delayus(15)//延时23.2us

PORTB&=0xfe //PB0低电平

while((PINE&0x80)==0) //PE7ECHO接收端

for((PINE&0x80)!=0data++) //这个就是

{Delayus(10)}//data与距离的换算跟这个延时的参数有关

if(data<60)//36cm这个data就是你设定的距离,宴码不过要换算下,最好用串口看下

{

PORTA=~PINA

}

改为以下程序自己验证吧,是PB0输出LED,PC0输入,是吧??镇者??

//ICC-AVR application builder : 2012/11/18 13:39:36// Target : M128

// Crystal: 4.0000Mhz

#include <iom128v.h>

#include <macros.h>

#define uchar unsigned char

#pragma interrupt_handler int1:2

void int1(void)

{

EIMSK=0X00

PORTB = 0x01

EIMSK=0X01

}

void main()

{

int1()//PB0为上拉电阻

DDRB = 0xff

PORTB = 0x00//PBO为低电平,LED不亮.

DDRC=0X00//C口闭前最后输入端.

DDRC=0XFF

while(1)

{

if((PINA &BIT(0))==0) //判断是否PA0口御态薯按下键了。

{PORTC |=BIT(0)} //亮

else

{PORTC &=~BIT(0)} //灭

}

}

从根本上来说,如果你使用UART1,就不要同时使用PD3和PD2做GPIO用,如果非要复用的话,也要确保它们不同时生嫌好效,但你上面的程序显然不是这样。像你上面这样连接的话,即便修正了你的程序串口能够收到数据,但PD3和PD2的方向和高低也是由UART1控制,而非你所控制;也就是说显示不正确!

其次,要恢复PD3和PD2的GPIO功能是禁用UART1,而不是关闭全局中断!

再次,超级循环体中反复开关全局中断,而你的串口接收又是中断驱动的,当然接收不正常!

要纠正,这样:

1. 使谈激用PORTD以外的端口连接LED,或者使用UART1之外的串口收发含者袜数据

2. 串口接收中断中收到有效数据置位标志

3. 超级循环体判断上述标志,如置位则:发送到PORTx,清零标志

4. 无需反复开关全局中断

又看了一下,貌似LED在PORTE上面,这样的话和PORTD的IO功能就没什么关系了吧。

删除超级循环体上的全局中断开关代码应该可以运行,但还是建议按前述流程 *** 作,这样利用中断规范些!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12470486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存