|
優(yōu)先級(jí)那里IP和IPH 如果不加程序就到不了上電握手那里,卡在某一個(gè)函數(shù),如果加了,定時(shí)器0初值就不對(duì),但定時(shí)器1和串口1是對(duì)的,都是1T,我試過(guò)在while里面把定時(shí)0的初值改變重新加載,又是對(duì)的。因?yàn)檎{(diào)用定時(shí)器1的時(shí)候要最高優(yōu)先,不然中斷跳變嚴(yán)重,需要定時(shí)器0的時(shí)候再改回來(lái)。上電默認(rèn)定時(shí)0開啟。初值不對(duì)。
void Timer0()
{
AUXR &= 0x0f; //1T
AUXR |= 0xc0;
TMOD &= 0xF0; //清零T0的控制位
TL0 = 0xA0;
TH0 = 0xF6;
TF0 = 0;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動(dòng)T0
}
void TM0_Isr() interrupt 1 //定時(shí)器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設(shè)置*****************************
uchar buf[18];
uchar rp = 0;
uchar TI_Busy = 0;
uchar TI_Busy1 = 0;
void UartInit()
{
SCON = 0x50; //可變波特率8位數(shù)據(jù)方式
S2CON = 0x50; //8位數(shù)據(jù),可變波特?
AUXR |= 0x15; //不分頻.啟動(dòng)定時(shí)器2
//T2L = BRT;
//T2H = BRT >> 8;
T2L = 0xCC; //24M1T
T2H = 0xFF;
ES = 1; //使能串口1中斷
//IE2 |=0x01; //使能串口2中斷
}
void IapIdle()
{
IAP_CONTR =0; //關(guān)閉IAP功能
IAP_CMD =0; //清除命令寄存器
IAP_TRIG =0; //清除觸發(fā)寄存器
IAP_ADDRH =0x80; //將地址設(shè)置到非IAP區(qū)域
IAP_ADDRL =0; //
}
/*----------------------------
從ISP/IAP/EEPROM讀一字節(jié)
----------------------------*/
unsigned char IapRead(unsigned int addr) //讀
{
unsigned char dat; //數(shù)據(jù)緩沖區(qū)
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 1; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //讀ISP/IAP/EEPROM數(shù)據(jù)
// IapIdle(); //關(guān)閉IAP功能
return dat; //返回
}
unsigned int IapRead_two(unsigned int addr) //讀int
{
unsigned int dat; //數(shù)據(jù)緩沖區(qū)
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 1; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //讀ISP/IAP/EEPROM數(shù)據(jù)
dat=dat<<8;
if(++IAP_ADDRL == 0)
IAP_ADDRH++;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
dat |= IAP_DATA;
// IapIdle(); //關(guān)閉IAP功能
return dat; //返回
}
/*----------------------------
寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
----------------------------*/
void IapProgram(unsigned int addr, unsigned char dat) //寫
{
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 2; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_DATA = dat; //寫ISP/IAP/EEPROM數(shù)據(jù)
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
// IapIdle();
}
void IapProgram_two(unsigned int addr, unsigned int dat) //寫int
{
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 2; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_DATA = dat>>8; //寫ISP/IAP/EEPROM數(shù)據(jù)
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(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();
}
/*----------------------------
扇區(qū)擦除
----------------------------*/
void IapErase(unsigned int addr) //擦除
{
IAP_CONTR = WT_24M; //使能IAP
IAP_CMD = 3; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(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個(gè)去抖輸出
CMPCR1 =0x00;
CMPCR1 |=0x30; //邊沿中斷
//CMPCR1 &=0x~20; //禁止上升中斷
//CMPCR1 |=0x20; //上升中斷
//CMPCR1 &=~0x10; //禁止下降中斷
//CMPCR1 |=0x10; //下降中斷
CMPCR1 &=~0x08; //P3.7+
//CMPCR1 |=0x08; //ADC輸入
CMPCR1 &=~0x04; //內(nèi)部CMP-
//CMPCR1 |=0x04; //P3.6CMP-
CMPCR1 &=~0x02; //禁止輸出
//CMPCR1 |=0x02; //輸出
CMPCR1 |=0x80; //開比輸器
}
void IOsatar()
{
//IP = 0x12;
//IPH = 0x0a; // 定時(shí)器0最高級(jí)
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準(zhǔn)雙向口(傳統(tǒng)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; //擴(kuò)展 RAM 區(qū)特殊功能寄存器(XFR)訪問(wèn)控制寄存器
//CKSEL = 0x00; //8H默認(rèn)內(nèi)部IRC
CKSEL = 0x00; //8F 默認(rèn)內(nèi)部IRC 不輸出 ,默認(rèn)管腳
//CLKDIV =0x04; //SYSCLK時(shí)鐘,默認(rèn)4分頻
CLKDIV =0x00; //不分頻SYSCLK時(shí)鐘
IOsatar(); //IO口模式
Timer0(); //定時(shí)器0 100US
Timer1(); //定時(shí)器1
//Timer3(); //定時(shí)器3
UartInit(); //串口中斷
//ADC_Init(); //ADC 中斷
EA=1;
CMPCR_data(); //比較器
Power_on_reset(); //上電握手
while(1)
{ .....................
}
}
|
|