本帖最后由 心印菩提 于 2015-7-31 14:26 编辑
各位前辈大家好我是个51新手
现在用C8051F040做实验
碰到下面这个问题
#include <c8051f040.h> // SFR declarations
sbit LED1 = P3^3; // LED1 ='1' means ON
sbit SW1 = P7^7; // SW1 ='0' means switch pressed
void Oscillator_Init();
void Timer_Init();
void Oscillator_Init();
void Port_IO_Init();
void Interrupts_Init();
void Init_Device(void);
void delay_ms(unsigned int t);
unsigned char count = 0 ;
void main (void)
{
WDTCN = 0xde; // Disable watchdog timer
WDTCN = 0xad;
Init_Device();
LED1 = 0;
while (1)
{
// LED1 = 0;
// delay_ms(5000);
// LED1 = 1;
// delay_ms(5000);
if (SW1 == 0) //出问题的就是这一部分,这一部分不正确运行,一上电LED灯就亮了
{ //而且不受按键控制
LED1 = 1; //但是如果不初始化定时器,或者删除初始化函数中那句
} // SFRPAGE = TIMER01_PAGE,这一部分就可以正常运行
else
{
LED1 = 0; // Else, turn it off
}
} // end of while(1)
} // end of main()
void Timer_Init()
{
SFRPAGE = TIMER01_PAGE; //这一句和while里面的if冲突,不知道为什么 ,如果不要这
TMOD = 0x01; //一句,if函数可以运行,但是我的定时器中断函数输出的P2
TH0 = 0xF4; //波形就没有了
TL0 = 0x00;
EA=1; //总中断开
TR0=1; //定时方式
ET0=1;
}
void Port_IO_Init()
{
SFRPAGE = CONFIG_PAGE;
P3MDOUT = 0xFF;
P3 = 0x08;
P2MDOUT = 0xFF;
P2 = 0x00;
P6MDOUT = 0xFF;
P7MDOUT = 0x00;
P7 = 0xFF;
XBR2 = 0x40;
}
void Oscillator_Init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
CLKSEL = 0x01;
OSCICN = 0x00;
}
void Interrupts_Init()
{
IE = 0x02;
IP = 0xC2;
}
void Init_Device(void)
{
Oscillator_Init();
Port_IO_Init();
Interrupts_Init();
Timer_Init();
}
void delay_ms(unsigned int t)
{
unsigned int i,j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void Timer0_ISR(void) interrupt 1
{
TH0 = 0xF4;
TL0 = 0x00;
switch(count)
{
case 0:
P2 = 0x01;
break;
case 1:
P2 = 0x03;
break;
case 2:
P2 = 0x07;
break;
case 3:
P2 = 0x06;
break;
case 4:
P2 = 0x04;
break;
case 5:
P2 = 0x00;
break;
default:
break;
}
count++;
if(count == 6)
count = 0;
}
另外还有一个问题,我明明在IO初始化函数里面设置了P6为推挽,但我无法在程序中改变P6的值,事实上P4-P7我都无法改变它的值,请问这是为什么?
非常感谢
|