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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5335|回復(fù): 33
打印 上一主題 下一主題
收起左側(cè)

九齊單片機(jī)代碼調(diào)試下面兩點(diǎn)哪里有問(wèn)題?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72649 發(fā)表于 2022-1-11 09:04 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
直接上代碼
主要兩個(gè)問(wèn)題咨詢(xún)一下網(wǎng)友:1、定時(shí)器延時(shí)函數(shù)能不能正常工作;2、開(kāi)關(guān)(此開(kāi)關(guān)不是按鍵開(kāi)關(guān),是普通的接通和斷開(kāi)開(kāi)關(guān))接通執(zhí)行一套代碼;否則斷開(kāi),執(zhí)行另一套代碼。
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)        __asm__("MOVR _" #x ",F")  

#define uchar unsigned char
#define uint unsigned int

#define JRJDQ PORTBbits.PB0        //7腳繼電器1, 高有效
#define JSJDQ PORTBbits.PB1        //6腳繼電器2, 高有效
#define FMQ PORTBbits.PB2        //5腳繼電器3, 高有效
#define JRJDQ2 PORTBbits.PB3        //4腳繼電器4, 高有效
#define KEY1 PORTBbits.PB4      //3腳電源開(kāi)關(guān),高電平表示接通,低電平表示斷開(kāi)
#define DCF PORTBbits.PB5        //2腳繼電器5, 高有效

uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  

//==T0時(shí)間計(jì)算================================================

void time0_init(void)
{
    PCON1 &= 0xfe;
        T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST預(yù)分頻給T0且為256分頻
        TMR0 = 0x00;
        INTE = C_INT_TMR0;                                //開(kāi)啟T0中斷
        PCON1 = C_TMR0_En;                               //開(kāi)啟T0
}

void io_init(void)
{
        
        IOSTB =  C_PB4_Input;     //PB4輸入
        IOSTB = C_PB0_Output;     //PB0輸出
        IOSTB = C_PB1_Output;     //PB1輸出
        IOSTB = C_PB2_Output;     //PB2輸出
        IOSTB = C_PB3_Output;     //PB3輸出
        IOSTB = C_PB5_Output;     //PB5輸出
        
        BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB );        //上拉
        PORTB = 0x00;
        INTE|=(1<<1);           //開(kāi)啟B口電平中斷
}

void delay_us(int count)  //@16M  2T   2.5us
{
        for(;count>0;count--);
}


void delay_ms(int count) //@8m  4T  1ms
{
        int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}

void Delay(unsigned long var)
{
    unsigned long i;

        i = t0zd1b;

        while(t0zd1b-i < var)
        {
       ;
        }   
}

void main()
        {
    io_init();
    time0_init();
        delay_ms(80);
                while(1)
                {
                 CLRWDT();
                 if(INTFbits.WDTIF)        //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
        {
                 CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標(biāo)志位
        }
        
                if(KEY1==1)                //K1開(kāi)關(guān)接通后,只要K1接通時(shí),延時(shí)后DCF繼電器低電平,然后又延時(shí)FMQ繼電器低電平,然后延時(shí)JRJDQ繼電器高電平,然后延時(shí)JRJDQ2繼電器高電平。
                        {        
                                Delay(10);
                                         {  DCF=0;}    Delay(200);
                                         {  FMQ=0;}    Delay(2000);
                                         {  JRJDQ=1;}  Delay(10);
                                         {  JRJDQ2=1;}
                        }
                        else  //K1開(kāi)關(guān)斷開(kāi)后,只要K1斷開(kāi)后時(shí),延時(shí)后DCF繼電器高電平,延時(shí)后FMQ繼電器高電平,在延時(shí)后FMQ繼電器高電平。
                        {                //接著延時(shí)后JRJDQ低電平,延時(shí)后JRJDQ2低電平。
                                Delay(10);
                                 { DCF=1;}    Delay(200);
                                 { FMQ=1;}    Delay(2000);
                                 { JRJDQ=0;}  Delay(200);
                                 { JRJDQ2=0;}
                        }
        }
        }

void isr(void) __interrupt(0)
{
        if(INTFbits.T0IF)
        {
                INTF= (unsigned char)~(C_INT_TMR0);        
                t0zd1b=1;
        CLRWDT();        //喂狗
        if(INTFbits.WDTIF)        //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
        {
        
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標(biāo)志位
               
        }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:887371 發(fā)表于 2022-1-11 10:21 | 只看該作者
  1. void io_init(void)
  2. {
  3.       
  4.         IOSTB =  C_PB4_Input;     //PB4輸入
  5.         IOSTB = C_PB0_Output;     //PB0輸出
  6.         IOSTB = C_PB1_Output;     //PB1輸出
  7.         IOSTB = C_PB2_Output;     //PB2輸出
  8.         IOSTB = C_PB3_Output;     //PB3輸出
  9.         IOSTB = C_PB5_Output;     //PB5輸出
  10.       
  11.         BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB );        //上拉
  12.         PORTB = 0x00;
  13.         INTE|=(1<<1);           //開(kāi)啟B口電平中斷
  14. }
復(fù)制代碼


這段代碼有問(wèn)題。
1.只有PB4是輸入,只需要一條語(yǔ)句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOSTB配置語(yǔ)句是多余的,并且是錯(cuò)誤的,會(huì)把PB所有IO配置為輸出。
2. 只有PB4是輸入,才需要上拉。雖然你的配置使正確的,但改為BPHCON = C_PB4_PHB;更簡(jiǎn)潔明了。
3.  INTE|=(1<<1);開(kāi)啟B口電平中斷前必須要配置PB喚醒寄存器。
回復(fù)

使用道具 舉報(bào)

板凳
ID:887371 發(fā)表于 2022-1-11 10:37 | 只看該作者
  1. void time0_init(void)
  2. {
  3.     PCON1 &= 0xfe;
  4.         T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST預(yù)分頻給T0且為256分頻
  5.         TMR0 = 0x00;
  6.         INTE = C_INT_TMR0;                                //開(kāi)啟T0中斷
  7.         PCON1 = C_TMR0_En;                               //開(kāi)啟T0
  8. }
復(fù)制代碼

這段代碼有些小問(wèn)題,可能會(huì)影響到其它配置。建議改為
  1. void time0_init(void)
  2. {
  3.     PCON1 &= (unsigned char)~C_TMR0_En;
  4.         T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST預(yù)分頻給T0且為256分頻
  5.         TMR0 = 0x00;
  6.         INTE |= C_INT_TMR0;                                //開(kāi)啟T0中斷
  7.         PCON1 |= C_TMR0_En;                               //開(kāi)啟T0
  8. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

地板
ID:72649 發(fā)表于 2022-1-11 12:51 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-11 10:21
這段代碼有問(wèn)題。
1.只有PB4是輸入,只需要一條語(yǔ)句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOS ...

PB喚醒寄存器怎么開(kāi)啟?能不能詳細(xì)說(shuō)明一下。
回復(fù)

使用道具 舉報(bào)

5#
ID:72649 發(fā)表于 2022-1-11 12:52 來(lái)自觸屏版 | 只看該作者
謝謝,我修改了試一下
回復(fù)

使用道具 舉報(bào)

6#
ID:887371 發(fā)表于 2022-1-11 15:05 | 只看該作者
  1. void Delay(unsigned long var)
  2. {
  3.     unsigned long i;

  4.         i = t0zd1b;

  5.         while(t0zd1b-i < var)
  6.         {
  7.        ;
  8.         }   
  9. }
復(fù)制代碼

這段代碼是錯(cuò)誤的。t0zd1b結(jié)合你的代碼看是T0中斷標(biāo)志轉(zhuǎn)存,是個(gè)位變量,位變量不能和數(shù)值變量運(yùn)算。我猜測(cè)你的代碼是延時(shí)var個(gè)定時(shí)中斷吧?
下面代碼是延時(shí)var個(gè)中斷的。
  1. void Delay(unsigned long var)
  2. {
  3.         while(var)
  4.         {
  5.                 if(t0zd1b){
  6.                         t0zd1b=0;//清除時(shí)間中斷標(biāo)志
  7.                         --var;
  8.                 }
  9.                 CLRWDT();//喂狗
  10.         }
  11. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

7#
ID:887371 發(fā)表于 2022-1-11 15:17 | 只看該作者
本帖最后由 datouyuan 于 2022-1-11 17:26 編輯
void isr(void) __interrupt(0)
{
        if(INTFbits.T0IF)
        {
                INTF= (unsigned char)~(C_INT_TMR0);      
                t0zd1b=1;
        CLRWDT();        //喂狗
        if(INTFbits.WDTIF)        //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
        {
      
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標(biāo)志位
               
        }
        }
}

這段代碼問(wèn)題更大。
1.開(kāi)啟了端口變化中斷,竟然在中斷處理代碼中沒(méi)有響應(yīng)處理代碼,這很危險(xiǎn)。建議關(guān)閉端口變化中斷。
2.WDT中斷有中斷處理代碼,沒(méi)有WDT配置代碼。
3.WDT中斷中斷處理代碼不應(yīng)在T0中斷處理代碼內(nèi),應(yīng)同級(jí)。
4.不應(yīng)該在中斷處理代碼中喂狗。
請(qǐng)參考我下面的代碼。
  1. void isr(void) __interrupt(0)
  2. {
  3.         if(INTFbits.T0IF)
  4.         {
  5.                 INTF= (unsigned char)~(C_INT_TMR0);      
  6.                 t0zd1b=1;
  7.                 }
  8.         if(INTFbits.WDTIF)        //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
  9.         {
  10.                 INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標(biāo)志位
  11.                
  12.         }

  13. }
復(fù)制代碼





回復(fù)

使用道具 舉報(bào)

8#
ID:887371 發(fā)表于 2022-1-11 15:29 | 只看該作者
hjx5548 發(fā)表于 2022-1-11 12:51
PB喚醒寄存器怎么開(kāi)啟?能不能詳細(xì)說(shuō)明一下。

你查下單片機(jī)的規(guī)格書(shū)。
在所有支持引腳變化中斷的單片機(jī)(包括51、arm、avr,當(dāng)然也包括九齊)都有這個(gè)寄存器或類(lèi)似的。
否則,任何一個(gè)輸入引腳變化都產(chǎn)生中斷,這程序就崩了。

指令格式大概是:
XX_PB=(1<<4);//PB4引腳變化會(huì)發(fā)生中斷
回復(fù)

使用道具 舉報(bào)

9#
ID:72649 發(fā)表于 2022-1-12 08:57 | 只看該作者
datouyuan 發(fā)表于 2022-1-11 15:29
你查下單片機(jī)的規(guī)格書(shū)。
在所有支持引腳變化中斷的單片機(jī)(包括51、arm、avr,當(dāng)然也包括九齊)都有這個(gè) ...

按照你的思路修改了,但是還是沒(méi)有反應(yīng)?
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)        __asm__("MOVR _" #x ",F")  

#define uchar unsigned char
#define uint unsigned int

#define JRJDQ PORTBbits.PB0        //7腳繼電器1, 高有效
#define JSJDQ PORTBbits.PB1        //6腳繼電器2, 高有效
#define FMQ PORTBbits.PB2        //5腳繼電器3, 高有效
#define JRJDQ2 PORTBbits.PB3        //4腳繼電器4, 高有效
#define KEY1 PORTBbits.PB4      //3腳電源開(kāi)關(guān),高電平表示接通,低電平表示斷開(kāi)
#define DCF PORTBbits.PB5        //2腳繼電器5, 高有效

uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  

//==T0時(shí)間計(jì)算================================================

void time0_init(void)
{
    PCON1 &= (unsigned char)~C_TMR0_En;
        T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST預(yù)分頻給T0且為256分頻
        TMR0 = 0x00;
        INTE |= C_INT_TMR0;                                //開(kāi)啟T0中斷
        PCON1 |= C_TMR0_En;                               //開(kāi)啟T0
}

void io_init(void)
{
        PCON &= ~(1<<3);  //關(guān)閉LVR  需要在IC_CONFIG里面設(shè)置寄存器配置
    IOSTB =  C_PB4_Input;     //PB4輸入
/*        IOSTB = C_PB0_Output;     //PB0輸出
        IOSTB = C_PB1_Output;     //PB1輸出
        IOSTB = C_PB2_Output;     //PB2輸出
        IOSTB = C_PB3_Output;     //PB3輸出
        IOSTB = C_PB5_Output;     //PB5輸出
        */
        BPHCON =C_PB4_PHB;
//        BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB );        //上拉
        PORTB = 0x00;
        INTE|=(1<<1);           //開(kāi)啟B口電平中斷
}

void delay_us(int count)  //@16M  2T   2.5us
{
        for(;count>0;count--);
}


void delay_ms(int count) //@8m  4T  1ms
{
        int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}

/*t0zd1b結(jié)合你的代碼看是T0中斷標(biāo)志轉(zhuǎn)存,是個(gè)位變量,位變量不能和數(shù)值變量運(yùn)算。我猜測(cè)你的代碼是延時(shí)var個(gè)定時(shí)中斷吧?*/

void Delay(unsigned long var)   
{
        while(var)
        {
                if(t0zd1b){
                        t0zd1b=0;//清除時(shí)間中斷標(biāo)志
                        --var;
                }
                CLRWDT();//喂狗
        }
}

void main()
        {
    io_init();
    time0_init();
        delay_ms(80);
                while(1)
                {
                 CLRWDT();
                 if(INTFbits.WDTIF)        //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
        {
                 CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標(biāo)志位
        }
       
                if(KEY1==1)                //K1開(kāi)關(guān)接通后,只要K1接通時(shí),延時(shí)后DCF繼電器低電平,然后又延時(shí)FMQ繼電器低電平,然后延時(shí)JRJDQ繼電器高電平,然后延時(shí)JRJDQ2繼電器高電平。
                        {       
                                Delay(10);
                                         {  DCF=0;}    Delay(200);
                                         {  FMQ=0;}    Delay(2000);
                                         {  JRJDQ=1;}  Delay(10);
                                         {  JRJDQ2=1;}
                        }
                        else  //K1開(kāi)關(guān)斷開(kāi)后,只要K1斷開(kāi)后時(shí),延時(shí)后DCF繼電器高電平,延時(shí)后FMQ繼電器高電平,在延時(shí)后FMQ繼電器高電平。
                        {                //接著延時(shí)后JRJDQ低電平,延時(shí)后JRJDQ2低電平。
                                Delay(10);
                                 { DCF=1;}    Delay(200);
                                 { FMQ=1;}    Delay(2000);
                                 { JRJDQ=0;}  Delay(200);
                                 { JRJDQ2=0;}
                        }
        }
        }

void isr(void) __interrupt(0)
{
        if(INTFbits.T0IF)
        {
                INTF= (unsigned char)~(C_INT_TMR0);       
                t0zd1b=1;
        CLRWDT();        //喂狗
        if(INTFbits.WDTIF)        //睡眠后60秒左右會(huì)進(jìn)來(lái)一次
        {
       
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標(biāo)志位
               
        }
        }
}
回復(fù)

使用道具 舉報(bào)

10#
ID:887371 發(fā)表于 2022-1-12 14:30 | 只看該作者
我提到的很多點(diǎn)你都沒(méi)改到。例如你還是開(kāi)啟了端口變化中斷,而中斷又處理。
現(xiàn)象只說(shuō)沒(méi)反應(yīng),這讓我們很難幫助你。沒(méi)反應(yīng)可能不是程序編寫(xiě)問(wèn)題,可能是你編譯環(huán)境沒(méi)搭建好。
我只能告訴你代碼中的明顯錯(cuò)誤,至于怎么修改、調(diào)試還是要靠你自己。建議你找芯片供應(yīng)商提供基本例程,待調(diào)試ok后,再在此基礎(chǔ)上修改代碼。

或者你把你的項(xiàng)目需求、芯片型號(hào)等信息告訴我,我抽空幫你寫(xiě)個(gè)完整代碼。
回復(fù)

使用道具 舉報(bào)

11#
ID:72649 發(fā)表于 2022-1-12 16:36 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-12 14:30
我提到的很多點(diǎn)你都沒(méi)改到。例如你還是開(kāi)啟了端口變化中斷,而中斷又處理。
現(xiàn)象只說(shuō)沒(méi)反應(yīng),這讓我們很難 ...

需求就是只要開(kāi)關(guān)接通,繼電器1-5分別高電平;開(kāi)關(guān)斷開(kāi)繼電器1-5分別低電平,當(dāng)然,繼電器1-5高電平時(shí)每個(gè)繼電器之間分別間隔延時(shí)1秒,2秒,5秒,8秒;低電平時(shí)分別間隔延時(shí)2秒,3秒,5秒,3秒。延時(shí)時(shí)間用定時(shí)器做。
回復(fù)

使用道具 舉報(bào)

12#
ID:72649 發(fā)表于 2022-1-12 16:37 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-12 14:30
我提到的很多點(diǎn)你都沒(méi)改到。例如你還是開(kāi)啟了端口變化中斷,而中斷又處理。
現(xiàn)象只說(shuō)沒(méi)反應(yīng),這讓我們很難 ...

單片機(jī)NY8系列51F

回復(fù)

使用道具 舉報(bào)

13#
ID:887371 發(fā)表于 2022-1-13 10:04 | 只看該作者
hjx5548 發(fā)表于 2022-1-12 16:36
需求就是只要開(kāi)關(guān)接通,繼電器1-5分別高電平;開(kāi)關(guān)斷開(kāi)繼電器1-5分別低電平,當(dāng)然,繼電器1-5高電平時(shí) ...

輸出定義:JDQ1 JDQ2 JDQ3 JDQ4 JDQ5
輸入定義:KEY1
初始狀態(tài):所有輸出為0(JDQ1=JDQ2=JDQ3=JDQ4=JDQ5=0;)
KEY1=1時(shí):
        步驟1:JDQ1=1,其它輸出?,延時(shí)1秒
        步驟2:JDQ2=1,其它輸出?,延時(shí)2秒
        步驟3:JDQ3=1,其它輸出?,延時(shí)5秒
        步驟4:JDQ4=1,其它輸出?,延時(shí)8秒
        步驟5:JDQ5=1,其它輸出?
KEY1=0時(shí):
        步驟1:JDQ1=0,其它輸出?,延時(shí)1秒
        步驟2:JDQ2=0,其它輸出?,延時(shí)2秒
        步驟3:JDQ3=0,其它輸出?,延時(shí)5秒
        步驟4:JDQ4=0,其它輸出?,延時(shí)8秒
        步驟5:JDQ5=0,其它輸出?
只在初始狀態(tài)、步驟5時(shí)才檢查KEY1值?
任何時(shí)候都檢測(cè)KEY1值?要考慮步驟1~4在KEY1變化時(shí)的動(dòng)作。

你需求理解太費(fèi)勁了,這是根據(jù)你需求做的猜測(cè)。
回復(fù)

使用道具 舉報(bào)

14#
ID:887371 發(fā)表于 2022-1-13 10:17 | 只看該作者
hjx5548 發(fā)表于 2022-1-12 16:37
單片機(jī)NY8系列51F

051F的規(guī)格書(shū)只找到了英文版。我用051E的規(guī)格書(shū)截圖。

BWUCON=~(1<<4);//開(kāi)啟PB4的引腳中斷
回復(fù)

使用道具 舉報(bào)

15#
ID:72649 發(fā)表于 2022-1-13 12:42 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 10:04
輸出定義:JDQ1 JDQ2 JDQ3 JDQ4 JDQ5
輸入定義:KEY1
初始狀態(tài):所有輸出為0(JDQ1=JDQ2=JDQ3=JDQ4=JDQ ...

只有一個(gè)key1變化引起動(dòng)作,只要框架寫(xiě)好,里面動(dòng)作我自己調(diào)整。
回復(fù)

使用道具 舉報(bào)

16#
ID:887371 發(fā)表于 2022-1-13 16:14 | 只看該作者
  1. #include <ny8.h>
  2. #include "ny8_constant.h"

  3. #define JDQ1 PORTBbits.PB0 //7腳繼電器1, 高有效
  4. #define JDQ2 PORTBbits.PB1 //6腳繼電器2, 高有效
  5. #define JDQ3 PORTBbits.PB2 //5腳繼電器3, 高有效
  6. #define JDQ4 PORTBbits.PB3 //4腳繼電器4, 高有效
  7. #define KEY1 PORTBbits.PB4 //3腳電源開(kāi)關(guān),高電平表示接通,低電平表示斷開(kāi)
  8. #define JDQ5 PORTBbits.PB5 //2腳繼電器5, 高有效
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. uchar sysmode = 0;
  12. __sbit fz1b = sysmode: 0;//PB4引腳中斷發(fā)生
  13. __sbit t0zd1b = sysmode: 1;//T0中斷發(fā)生

  14. /*
  15. 按規(guī)格書(shū)配置
  16. 內(nèi)部高速RC振蕩器(I_HRC)選擇為4MHz。
  17. 指令時(shí)鐘可以選擇為FOSC/4。
  18. 指令周期為1us。
  19. T0每隔256us中斷一次
  20. */
  21. void time0_init(void)
  22. {
  23.         PCON1 = 0;//關(guān)閉定時(shí)器0和總中斷
  24.         TMR0 = 0;//256us
  25.         T0MD = 0x08;//預(yù)分頻給WDT T0不分頻
  26.         INTE |= 0x01;//開(kāi)啟T0中斷
  27.         PCON1 = 1;//開(kāi)啟定時(shí)器 0
  28. }
  29. void io_init(void)
  30. {
  31.         IOSTB = (1 << 4);  //PB4輸入
  32.         BWUCON = (1 << 4); //PB4引腳中斷
  33.         BPHCON =  ~(1 << 4); //PB4上拉
  34.         INTE |= (1 << 1); //開(kāi)啟B口電平中斷
  35.         PORTB = 0x00;//所有輸出為0
  36. }

  37. /*
  38. 必須開(kāi)啟T0中斷,延時(shí)函數(shù)才起作用
  39. */
  40. void delay_1ms(void)
  41. {
  42.         uchar i = 4; //每次256us,1ms中斷4次
  43.         while (i) {
  44.                 if (t0zd1b) {
  45.                         t0zd1b = 0; //清除時(shí)間中斷標(biāo)志
  46.                         --i;
  47.                 }
  48.         }
  49. }
  50. void delay_ms(uint var)//延時(shí)單位為毫秒,最多延時(shí)65.535秒(65535mS)
  51. {
  52.         while (var--) {
  53.                 delay_1ms();
  54.                 CLRWDT(); //喂狗
  55.         }
  56. }
  57. #define d_s(s) delay_ms((s)*1000ul)//延時(shí)單位為秒

  58. void main()
  59. {
  60.         INTF = 0; //中斷標(biāo)志寄存器
  61.         INTE = 0; //中斷使能寄存器
  62.         PCON1 = 0; //關(guān)閉總中斷
  63.         io_init();
  64.         time0_init();
  65.         PCON1 |= 0x80; //開(kāi)啟總中斷
  66.         //PCON1&=0x7f;//關(guān)閉總中斷
  67.         delay_ms(80);
  68.         /*只在初始狀態(tài)和步驟5檢測(cè)按鍵變化*/
  69.         while (1) {
  70.                 if(fz1b) {
  71.                         //KEY1發(fā)生變化
  72.                         fz1b = 0;
  73.                         if(KEY1) {
  74.                                 JDQ1 = 1;
  75.                                 d_s(1);//延時(shí)1秒
  76.                                 JDQ2 = 1;
  77.                                 d_s(2);//延時(shí)2秒
  78.                                 JDQ3 = 1;
  79.                                 d_s(3);//延時(shí)3秒
  80.                                 JDQ4 = 1;
  81.                                 d_s(4);//延時(shí)4秒
  82.                                 JDQ5 = 1;
  83.                         } else {
  84.                                 JDQ1 = 0;
  85.                                 d_s(1);//延時(shí)1秒
  86.                                 JDQ2 = 0;
  87.                                 d_s(2);//延時(shí)2秒
  88.                                 JDQ3 = 0;
  89.                                 d_s(3);//延時(shí)3秒
  90.                                 JDQ4 = 0;
  91.                                 d_s(4);//延時(shí)4秒
  92.                                 JDQ5 = 0;
  93.                         }
  94.                         fz1b = 0; //只有之后發(fā)生的引腳變化才起作用
  95.                 }
  96.                 CLRWDT(); //喂狗
  97.         }
  98. }
  99. /*
  100. 見(jiàn)規(guī)格書(shū)第18頁(yè)
  101. */
  102. void isr(void) __interrupt(0)
  103. {
  104.         if (INTF & (1 << 0)) {
  105.                 //定時(shí)器 0 上溢中斷
  106.                 INTF &= (unsigned char)~(1 << 0); //必須由程序清零
  107.                 t0zd1b = 1;
  108.         }
  109.         if (INTF & (1 << 1)) {
  110.                 //PortB輸入狀態(tài)變化中斷
  111.                 INTF &= (unsigned char)~(1 << 1); //必須由程序清零
  112.                 fz1b = 1;
  113.         }
  114.         if (INTF & (1 << 6)) {
  115.                 //WDT超時(shí)上溢中斷
  116.                 INTF &= (unsigned char)~(1 << 6); //必須由程序清零
  117.         }
  118. }
復(fù)制代碼


需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。
回復(fù)

使用道具 舉報(bào)

17#
ID:387856 發(fā)表于 2022-1-13 17:20 | 只看該作者
你要什么功能,我是專(zhuān)業(yè)做九齊的,免費(fèi)開(kāi)發(fā)
回復(fù)

使用道具 舉報(bào)

18#
ID:72649 發(fā)表于 2022-1-13 20:04 | 只看該作者
liuhailan5757 發(fā)表于 2022-1-13 17:20
你要什么功能,我是專(zhuān)業(yè)做九齊的,免費(fèi)開(kāi)發(fā)

加我:hjx5548
回復(fù)

使用道具 舉報(bào)

19#
ID:72649 發(fā)表于 2022-1-14 14:31 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) - 編譯出現(xiàn)錯(cuò)誤提示
回復(fù)

使用道具 舉報(bào)

20#
ID:72649 發(fā)表于 2022-1-14 14:41 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

overflow in implicit constant conversion (158) -
Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) -
Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) -
Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) -
編譯出現(xiàn)三條錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

21#
ID:887371 發(fā)表于 2022-1-14 16:24 | 只看該作者
hjx5548 發(fā)表于 2022-1-14 14:41
overflow in implicit constant conversion (158) -
Use BCR instruction to clear interrupt flag may ...

看來(lái)你基礎(chǔ)很差。剛裝好九齊的編譯環(huán)境。參考九齊的例程,修改見(jiàn)下圖:




附上整個(gè)工程: a051f.rar (5.1 KB, 下載次數(shù): 34)



回復(fù)

使用道具 舉報(bào)

22#
ID:72649 發(fā)表于 2022-1-14 17:17 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

幾個(gè)中斷在一個(gè)函數(shù)里面有沖突,應(yīng)該怎么寫(xiě),才正確?
回復(fù)

使用道具 舉報(bào)

23#
ID:72649 發(fā)表于 2022-1-15 07:36 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

中斷是否需要寫(xiě)三個(gè)中斷函數(shù)?應(yīng)該怎樣修改?
回復(fù)

使用道具 舉報(bào)

24#
ID:887371 發(fā)表于 2022-1-15 09:54 | 只看該作者
hjx5548 發(fā)表于 2022-1-15 07:36
中斷是否需要寫(xiě)三個(gè)中斷函數(shù)?應(yīng)該怎樣修改?

九齊這類(lèi)仿微芯單片機(jī)所有中斷共用一個(gè)中斷函數(shù)。
不存在中斷有沖突的說(shuō)法,你的意思是不是有多個(gè)中斷同時(shí)發(fā)生?
(定時(shí)器 0 上溢中斷>PortB輸入狀態(tài)變化中斷>WDT超時(shí)上溢中斷)是我給的代碼中斷優(yōu)先級(jí)順序,不支持嵌入式優(yōu)先級(jí),如想支持嵌入式優(yōu)先級(jí),代碼比較復(fù)雜,請(qǐng)自行查資料。
回復(fù)

使用道具 舉報(bào)

25#
ID:72649 發(fā)表于 2022-1-16 07:12 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

這個(gè)是否要寫(xiě)三個(gè)中斷
回復(fù)

使用道具 舉報(bào)

26#
ID:72649 發(fā)表于 2022-1-17 16:43 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

有時(shí)間指點(diǎn)一下,為何不能編譯?
回復(fù)

使用道具 舉報(bào)

27#
ID:72649 發(fā)表于 2022-1-17 20:26 | 只看該作者
datouyuan 發(fā)表于 2022-1-15 09:54
九齊這類(lèi)仿微芯單片機(jī)所有中斷共用一個(gè)中斷函數(shù)。
不存在中斷有沖突的說(shuō)法,你的意思是不是有多個(gè)中斷同 ...

謝謝指點(diǎn)
回復(fù)

使用道具 舉報(bào)

28#
ID:72649 發(fā)表于 2022-1-17 20:31 | 只看該作者
datouyuan 發(fā)表于 2022-1-14 16:24
看來(lái)你基礎(chǔ)很差。剛裝好九齊的編譯環(huán)境。參考九齊的例程,修改見(jiàn)下圖:

代碼編譯沒(méi)有問(wèn)題了,可是功能還是沒(méi)有實(shí)現(xiàn)。
回復(fù)

使用道具 舉報(bào)

29#
ID:72649 發(fā)表于 2022-1-17 21:43 | 只看該作者
datouyuan 發(fā)表于 2022-1-14 16:24
看來(lái)你基礎(chǔ)很差。剛裝好九齊的編譯環(huán)境。參考九齊的例程,修改見(jiàn)下圖:

程序中斷好像沒(méi)有工作,延時(shí)不起作用。
回復(fù)

使用道具 舉報(bào)

30#
ID:1002539 發(fā)表于 2022-1-18 20:36 | 只看該作者
撥動(dòng)開(kāi)關(guān)切不切換暫時(shí)還不清楚,但這里用阻塞式的延時(shí)就肯定不行的!按照這寫(xiě)法,開(kāi)關(guān)常開(kāi)或常閉,狀態(tài)切換至少要大于10秒之后才有反應(yīng)的!

1.png (58.77 KB, 下載次數(shù): 126)

1.png
回復(fù)

使用道具 舉報(bào)

31#
ID:72649 發(fā)表于 2022-1-19 19:05 來(lái)自觸屏版 | 只看該作者
datouyuan 發(fā)表于 2022-1-13 16:14
需要任何時(shí)候KEY1變化有效的,需要用到狀態(tài)機(jī)。

大師,在嗎?你的代碼你編譯,但是中斷沒(méi)有工作。
回復(fù)

使用道具 舉報(bào)

32#
ID:403658 發(fā)表于 2022-3-6 10:46 | 只看該作者
大佬  在嗎??  想問(wèn)下九齊單片機(jī)
uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  這些都是配置 什么意思的啊?
回復(fù)

使用道具 舉報(bào)

33#
ID:437896 發(fā)表于 2022-4-23 10:06 | 只看該作者
datouyuan 發(fā)表于 2022-1-11 10:21
這段代碼有問(wèn)題。
1.只有PB4是輸入,只需要一條語(yǔ)句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOS ...

人家是或上去,不會(huì)錯(cuò)啊 即使是0x00 如果不或上去 讓你不清晰哪個(gè)引腳的輸入輸出狀態(tài)呢
回復(fù)

使用道具 舉報(bào)

34#
ID:1097287 發(fā)表于 2023-10-25 19:26 | 只看該作者
liuhailan5757 發(fā)表于 2022-1-13 17:20
你要什么功能,我是專(zhuān)業(yè)做九齊的,免費(fèi)開(kāi)發(fā)

您好,想請(qǐng)教一下關(guān)于九齊的休眠以及喚醒的問(wèn)題,我這邊使用的是NY8BE62D,因?yàn)槲沂褂美虥](méi)有反應(yīng),所以想請(qǐng)教下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲成在人线 | 欧美亚洲国产一区二区三区 | 粉嫩国产精品一区二区在线观看 | 日本三级线观看 视频 | av色站| 99re热精品视频 | 一区二区三区四区不卡视频 | 精品一区二区三区在线观看 | 精品在线一区 | 夜夜摸夜夜操 | 黄色网址在线播放 | 夜夜夜久久久 | 蜜臀久久99精品久久久久野外 | 亚洲视频欧美视频 | 中文字幕一区在线 | 久久精品 | 成年视频在线观看福利资源 | 久久久久久国产免费视网址 | 成人中文字幕在线 | 免费看黄色小视频 | 日韩中文字幕在线免费 | 9999国产精品欧美久久久久久 | 国产精品夜间视频香蕉 | 黄网站涩免费蜜桃网站 | 久久久精品网站 | 羞羞涩涩在线观看 | 伊人久久综合 | 成人av一区二区三区 | 国产精品国产a | 国产精品免费一区二区三区四区 | 亚洲欧美成人 | 7777在线 | 精品毛片 | 狠狠干美女 | 中文字幕一区二区三区不卡在线 | 女人牲交视频一级毛片 | 国产91黄色| 日韩在线观看中文字幕 | 亚洲一区二区在线电影 | 91在线观看视频 | 成人在线电影网站 |