本帖最后由 qinfangxiaoran 于 2012-12-19 12:00 编辑
使用ATmega8控制一小电机运转,IO口为PORTB.0,在电机运转过程中会触发一行程开关,用PORTB.1脚接收此开关的信号,信号宽度约为250ms(高电平)。用示波器观察此引脚,可以观察到正确信号。而且很理想,高电平5V,低电平0V。用PORTD.3引脚控制一LED来指示开关状态,源代码如下所示。现在的情况是,在一块电路板上LED可以正确指示出开关状态,但同样的程序在另一同样的电路板上指示灯却处于常亮状态,诚心求解!急!
开发环境:AVR Studio4.1 + GCC
外部晶振:7.3728M
熔丝位设置:D9FF。
附源代码:
#include <avr/io.h> //包含必要头文件
#include <util/delay.h>
#include "Mega8Usart.c" //包含串口程序文件
#define Fosc 7372800 //定义晶振频率
#define Boud 9600 //定义通信波特率
typedef struct _bit_struct //定义寄存器或端口的8个位
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}BitField;
#define GetBitField(addr) (*((volatile BitField *) & (addr))) //定义一个宏,用于取得位值
//端口定义
#define MotoRun GetBitField(PORTB).bit0 //PORTB.0,Moto Control Pin
#define TravelSwitch GetBitField(PINB).bit1 //PORTB.1,Travel Switch Pin
#define UsartDirect GetBitField(PORTB).bit2 //PORTB.2,Usart Direct Select Pin
#define LedGreen GetBitField(PORTD).bit3 //LED指示灯引脚定义
unsigned char MotoRunCircle(void); //函数声明,电机转动一周
void MotoRunTest(void); //电机测试函数
void UsartTest(void); //通信测试函数
int main(void)
{
unsigned char i = 0;
unsigned char HostAddress,MotoState,temp;
unsigned char ReceData[5];
DDRB |= 0x05;
PORTB = 0xff;
DDRC = 0xc0;
DDRD = 0x3c;
UsartInit();
UsartDirect = 1;
while(1)
{
temp = PINB;
if(TravelSwitch)
LedGreen = 0;
else
LedGreen = 1;
}
}
|