久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2397|回復(fù): 8
收起左側(cè)

STC單片機(jī)更改定時(shí)器優(yōu)先級(jí),定時(shí)器不正常

[復(fù)制鏈接]
ID:734017 發(fā)表于 2021-11-22 16:36 | 顯示全部樓層 |閱讀模式
優(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)
        {          .....................
}
}
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2021-11-22 18:41 | 顯示全部樓層
請(qǐng)?jiān)?while (1) 里面加一句 WDT_CONTR |=0x10;
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-22 18:59 | 顯示全部樓層
//                        EA=1;
                        CMPCR_data();                        //比較器
                        Power_on_reset();                //上電握手
                        TF0 = 0;
                        EA=1;
回復(fù)

使用道具 舉報(bào)

ID:734017 發(fā)表于 2021-11-23 00:23 | 顯示全部樓層
npn 發(fā)表于 2021-11-22 18:41
請(qǐng)?jiān)?while (1) 里面加一句 WDT_CONTR |=0x10;

請(qǐng)問(wèn)有什么作用,我沒用看門狗呢
回復(fù)

使用道具 舉報(bào)

ID:734017 發(fā)表于 2021-11-23 00:27 | 顯示全部樓層
188610329 發(fā)表于 2021-11-22 18:59
//                        EA=1;
                        CMPCR_data();                        //比較 ...

不行,發(fā)現(xiàn)串口中斷接收不了,一直發(fā)送就是接收不了。加上IP    = 0x12;IPH   = 0x0a;又可以了,奇怪,剛開始我沒啟用優(yōu)先級(jí)寄存器一切正常,啟用過(guò)后,發(fā)現(xiàn)定時(shí)器不對(duì)。取消就影響串口接收
回復(fù)

使用道具 舉報(bào)

ID:734017 發(fā)表于 2021-11-23 01:34 | 顯示全部樓層
188610329 發(fā)表于 2021-11-22 18:59
//                        EA=1;
                        CMPCR_data();                        //比較 ...

CMPCR1                |=0x30;                        //邊沿中斷
可能是這個(gè),沒有對(duì)應(yīng)的中斷號(hào)
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-23 12:57 | 顯示全部樓層
happy2058 發(fā)表于 2021-11-23 01:34
CMPCR1                |=0x30;                        //邊沿中斷
可能是這個(gè),沒有對(duì)應(yīng)的中斷號(hào)

interrupt  21
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2021-11-23 13:12 | 顯示全部樓層
happy2058 發(fā)表于 2021-11-23 00:23
請(qǐng)問(wèn)有什么作用,我沒用看門狗呢

看門狗是每個(gè)程序都必須開的,否則受到干擾都找不到北。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-23 13:22 | 顯示全部樓層
在實(shí)際使用時(shí), 看門狗能在一定程度上有效防止意外跑飛后的各種問(wèn)題。
同時(shí),在調(diào)試階段,看門狗也會(huì)極大限度的掩蓋程序設(shè)計(jì)中的大量邏輯錯(cuò)誤。如果要趕工期應(yīng)付老板,看門狗是一大利器,要是自己憑借愛好做東西,至少在所有功能調(diào)試完畢滿意之前,不要用看門狗。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国精产品一品二品国精在线观看 | 美女黄视频网站 | 日日干日日操 | 中文字幕在线国产 | 亚洲 91 | 亚洲精品久久久久久国产精华液 | 欧美成视频 | 久久成人国产精品 | 色性av| 亚洲欧美一区二区在线观看 | 日日干天天操 | 麻豆一区二区三区精品视频 | 在线播放精品视频 | 国产精品免费观看 | 999久久久 | 日韩精品一区二区久久 | 欧美综合一区 | 在线精品亚洲欧美日韩国产 | 欧美综合网 | 久久爱综合 | 日韩高清国产一区在线 | 天堂在线1 | 久久久久亚洲精品国产 | 欧美一级欧美三级在线观看 | 久久国产精品一区二区 | 中文字幕免费 | 成人免费看片 | 日韩高清在线观看 | 亚洲成人久久久 | 五月激情婷婷六月 | 二区中文 | 精品国产免费人成在线观看 | 91色视频在线观看 | 国产一区二区美女 | 男女深夜网站 | 亚洲免费在线观看 | 一级毛片大全免费播放 | 四虎影院新网址 | 亚洲一区二区三区视频 | 欧美自拍第一页 | 黄色片大全在线观看 |