void Reset_Sources_Init()
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
//============================================================================
// 系统时钟初始化,使用外部22.1184MHz晶振作为时钟源
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for ini
tialization
while(!(OSCXCN & 0x80));
OSCICN = 0x08;
}
//============================================================================
// I/O端口初始化
void PORT_IO_Init()
{
PRT0CF = 0x1B; //0001 1011 p0.0,p0.1,p0.3,p0.4为推挽方式;P0.2为漏极方式,其余皆为漏极方式
PRT1CF = 0x03; // 0000 0011 P1.0,P1.1为推挽方式,其余为漏极方式
XBR0 = 0x28; // 00 101 000 CEX0,CEX1,CEX2,CEX3,CEX4连接到5个端口引脚
XBR2 = 0x40; //交叉开关使能
P0 = 0x02; //0000 0010 p0.2 设置为高电平
P1 = 0x01; //p1.0 设置为高电平
}
//==============================================================================
// 定时器初始化
void Timer_Init()
{
TCON = 0x10; //定时器0允许
TMOD = 0x02; //定时器0方式2,8为自动重载
TL0 = 0x10;
TH0 = 0x10; //输出频率30Hz
TMR3CN = 0x04;
TMR3RLH = 0x70;
TMR3H = 0x70; //(65532-x)*12/22118400=T T=0.02 x=28672即TH=0x70 TL=0x00
}
//==============================================================================
// 中断初始化
void Interrupts_Init()
{
IE = 0x80;
EIE2 = 0x01;
}
//==============================================================================
//ADC初始化
void ADC_Init()
{
ADC0CN = 0x80;
}
void Voltage_Reference_Init()
{
REF0CN = 0x03; //使用内部参考电压基准
}
//==================================================================
//
void PCA_Init()
{
PCA0CN = 0x40; //允许PCA0定时器/计数器
PCA0MD = 0x04; //定时器0溢出方式
/* PCA0CPM0 = 0x42; //8位PWM方式
PCA0CPM1 = 0x42;
PCA0CPM2 = 0x42;
PCA0CPH0 = 0x80; //占空比为50%
PCA0CPH1 = 0x00; //占空比为100%
PCA0CPH2 = 0x0C; //占空比为95% */
}
//=====================================================================
void Init_Device(void)
{
EA=0;
Oscillator_Init();
Reset_Sources_Init();
ADC_Init();
Voltage_Reference_Init();
PORT_IO_Init();
Timer_Init();
PCA_Init();
Interrupts_Init();
}
void main()
{
Init_Device();
delay();
PCA0CPM0 = 0x42;
PCA0CPM3 = 0x42;
PCA0CPM4 = 0x42;
LED = 0;
PCA0CPH0 = 0x00;
PCA0CPH3 = 0x00;
PCA0CPH4 = 0x00;
// LED_State(0);
delay1();
delay1();
LED = 1;
PCA0CPH0 = 0xFF;
PCA0CPH3 = 0xFF;
PCA0CPH4 = 0xFF;
// LED_State(1);
EA = 1;
……………………
想问一下为什么我的程序老是卡在时钟初始化的 while(!(OSCXCN & 0x80)); 这一句,后面根本进不去?
{
Init_Device();
delay();
PCA0CPM0 = 0x42;
PCA0CPM3 = 0x42;
PCA0CPM4 = 0x42;
程序怎么跑到这里我的p0.3,p0.4就有输出高电平了,P0.0反而没有作用,始终输出的是高电平?(我的原意是最开始p0.0,p0.3,p0.4先输出高电平,延时后再输出低电平但是这里输出高电平后就控制不了了,求高手指点,谢谢!)
一周热门 更多>