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功能就没什么关系了吧。
删除超级循环体上的全局中断开关代码应该可以运行,但还是建议按前述流程 *** 作,这样利用中断规范些!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)