优先级那里IP和IPH 如果不加程序就到不了上电握手那里,卡在某一个函数,如果加了,定时器0初值就不对,但定时器1和串口1是对的,都是1T,我试过在while里面把定时0的初值改变重新加载,又是对的。因为调用定时器1的时候要最高优先,不然中断跳变严重,需要定时器0的时候再改回来。上电默认定时0开启。初值不对。
void Timer0()
{
AUXR &= 0x0f; //1T
AUXR |= 0xc0;
TMOD &= 0xF0; //清零T0的控制位
TL0 = 0xA0;
TH0 = 0xF6;
TF0 = 0;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void TM0_Isr() interrupt 1 //定时器0中断
{
if(SK_lock)
{
//P0^=0x03;
SK_L =~SK_L;
_nop_();
SK_H =~SK_H;
//return;
}
if (clok_lock)
{
clok_satar=~clok_satar;
}
if(clok_HOT)
{
clok_HOT_tmie=~clok_HOT_tmie;
}
if(ul_1_lock|ul_2_lock)
{
ul_satar=~ul_satar;
//return;
}
if(ion_1_lock)
{
ion1_satar=~ion1_satar;
//return;
}
if(ion_2_lock)
{
ion2_satar=~ion2_satar;
//return;
}
}
void Timer1()
{
TMOD |= 0x10;
TL1 = (65535-RF_Duty)%256;
TH1 = (65535-RF_Duty)/256;
TF1 = 0;
ET1 = 0;
TR1 = 0;
}
void TM1_Isr() interrupt 3
{ if(RF_lock)
{
if(RF_PWM_H)
{
RF_PWM_H=0;
RF_PWM_OUT=1;
TL1 = RF_PWM_TIME_H_L; //???????
TH1 = RF_PWM_TIME_H_H; //???????
}
else
{
RF_PWM_H=1;
RF_PWM_OUT=0;
TL1 = RF_PWM_TIME_L_L; //???????
TH1 = RF_PWM_TIME_L_H; //???????
}
}
else if(SK_lock)
{
if(RF_PWM_H)
{
RF_PWM_H=0;
SS_int_ADJ=1;
TL1 = RF_PWM_TIME_H_L; //???????
TH1 = RF_PWM_TIME_H_H; //???????
}
else
{
RF_PWM_H=1;
SS_int_ADJ=0;
TL1 = RF_PWM_TIME_L_L; //???????
TH1 = RF_PWM_TIME_L_H; //???????
}
}
}
//*************************UART设置*****************************
uchar buf[18];
uchar rp = 0;
uchar TI_Busy = 0;
uchar TI_Busy1 = 0;
void UartInit()
{
SCON = 0x50; //可变波特率8位数据方式
S2CON = 0x50; //8位数据,可变波特?
AUXR |= 0x15; //不分频.启动定时器2
//T2L = BRT;
//T2H = BRT >> 8;
T2L = 0xCC; //24M1T
T2H = 0xFF;
ES = 1; //使能串口1中断
//IE2 |=0x01; //使能串口2中断
}
void IapIdle()
{
IAP_CONTR =0; //关闭IAP功能
IAP_CMD =0; //清除命令寄存器
IAP_TRIG =0; //清除触发寄存器
IAP_ADDRH =0x80; //将地址设置到非IAP区域
IAP_ADDRL =0; //
}
/*----------------------------
从ISP/IAP/EEPROM读一字节
----------------------------*/
unsigned char IapRead(unsigned int addr) //读
{
unsigned char dat; //数据缓冲区
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 1; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
// IapIdle(); //关闭IAP功能
return dat; //返回
}
unsigned int IapRead_two(unsigned int addr) //读int
{
unsigned int dat; //数据缓冲区
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 1; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
dat=dat<<8;
if(++IAP_ADDRL == 0)
IAP_ADDRH++;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
dat |= IAP_DATA;
// IapIdle(); //关闭IAP功能
return dat; //返回
}
/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
----------------------------*/
void IapProgram(unsigned int addr, unsigned char dat) //写
{
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 2; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
// IapIdle();
}
void IapProgram_two(unsigned int addr, unsigned int dat) //写int
{
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 2; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat>>8; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
if(++IAP_ADDRL == 0)
IAP_ADDRH++;
IAP_DATA = dat;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_(); //等待ISP/IAP/EEPROM操作完成
// IapIdle();
}
/*----------------------------
扇区擦除
----------------------------*/
void IapErase(unsigned int addr) //擦除
{
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 3; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
// IapIdle();
}
//--------------------------------------------------------------------
/*比较器*/
void CMPCR_data()
{
CMPCR2 =0x80;
CMPCR2 &=~0x80; //正向输出
//CMPCR2 |=0x80; //反向输出
CMPCR2 &=~0x40; //禁止0.1US滤波
//CMPCR2 |=0x40; //0.1US滤波
//CMPCR2 &-~0x3f; //比较器直接输出
CMPCR2 |=0x10; //16个去抖输出
CMPCR1 =0x00;
CMPCR1 |=0x30; //边沿中断
//CMPCR1 &=0x~20; //禁止上升中断
//CMPCR1 |=0x20; //上升中断
//CMPCR1 &=~0x10; //禁止下降中断
//CMPCR1 |=0x10; //下降中断
CMPCR1 &=~0x08; //P3.7+
//CMPCR1 |=0x08; //ADC输入
CMPCR1 &=~0x04; //内部CMP-
//CMPCR1 |=0x04; //P3.6CMP-
CMPCR1 &=~0x02; //禁止输出
//CMPCR1 |=0x02; //输出
CMPCR1 |=0x80; //开比输器
}
void IOsatar()
{
//IP = 0x12;
//IPH = 0x0a; // 定时器0最高级
P0M1 = 0x00;
P0M0 = 0xFF;
P1M1 = 0x00;
P1M0 = 0xff;
P2M1 = 0x00;
P2M0 = 0xFF;
P3M1 = 0x80;
P3M0 = 0x7e;
//P4M1 = 0xb3;
//P4M0 = 0xb4;
P5M1 = 0x00;
P5M0 = 0x30;
//00准双向口(传统8051端口模式,弱上拉)
//01推挽输出
//10高阻输入
//11开漏输出
P0 = 0x06; //上电输出
P1 = 0x40;
P2 = 0x2b;
P3 = 0x7b;
sk_OUT=0;
RF_Duty = 180; //高电平初值
SK_Duty = 180;
}
void main()
{
P_SW2 |= 0x80; //扩展 RAM 区特殊功能寄存器(XFR)访问控制寄存器
//CKSEL = 0x00; //8H默认内部IRC
CKSEL = 0x00; //8F 默认内部IRC 不输出 ,默认管脚
//CLKDIV =0x04; //SYSCLK时钟,默认4分频
CLKDIV =0x00; //不分频SYSCLK时钟
IOsatar(); //IO口模式
Timer0(); //定时器0 100US
Timer1(); //定时器1
//Timer3(); //定时器3
UartInit(); //串口中断
//ADC_Init(); //ADC 中断
EA=1;
CMPCR_data(); //比较器
Power_on_reset(); //上电握手
while(1)
{ .....................
}
}
|