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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5372|回復: 33
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:72649 發(fā)表于 2022-1-11 09:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
直接上代碼
主要兩個問題咨詢一下網(wǎng)友:1、定時器延時函數(shù)能不能正常工作;2、開關(此開關不是按鍵開關,是普通的接通和斷開開關)接通執(zhí)行一套代碼;否則斷開,執(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腳電源開關,高電平表示接通,低電平表示斷開
#define DCF PORTBbits.PB5        //2腳繼電器5, 高有效

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

//==T0時間計算================================================

void time0_init(void)
{
    PCON1 &= 0xfe;
        T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST預分頻給T0且為256分頻
        TMR0 = 0x00;
        INTE = C_INT_TMR0;                                //開啟T0中斷
        PCON1 = C_TMR0_En;                               //開啟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);           //開啟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秒左右會進來一次
        {
                 CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標志位
        }
        
                if(KEY1==1)                //K1開關接通后,只要K1接通時,延時后DCF繼電器低電平,然后又延時FMQ繼電器低電平,然后延時JRJDQ繼電器高電平,然后延時JRJDQ2繼電器高電平。
                        {        
                                Delay(10);
                                         {  DCF=0;}    Delay(200);
                                         {  FMQ=0;}    Delay(2000);
                                         {  JRJDQ=1;}  Delay(10);
                                         {  JRJDQ2=1;}
                        }
                        else  //K1開關斷開后,只要K1斷開后時,延時后DCF繼電器高電平,延時后FMQ繼電器高電平,在延時后FMQ繼電器高電平。
                        {                //接著延時后JRJDQ低電平,延時后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秒左右會進來一次
        {
        
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標志位
               
        }
        }
}

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

使用道具 舉報

沙發(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);           //開啟B口電平中斷
  14. }
復制代碼


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

使用道具 舉報

板凳
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預分頻給T0且為256分頻
  5.         TMR0 = 0x00;
  6.         INTE = C_INT_TMR0;                                //開啟T0中斷
  7.         PCON1 = C_TMR0_En;                               //開啟T0
  8. }
復制代碼

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

回復

使用道具 舉報

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

PB喚醒寄存器怎么開啟?能不能詳細說明一下。
回復

使用道具 舉報

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

使用道具 舉報

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. }
復制代碼

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

使用道具 舉報

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秒左右會進來一次
        {
      
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標志位
               
        }
        }
}

這段代碼問題更大。
1.開啟了端口變化中斷,竟然在中斷處理代碼中沒有響應處理代碼,這很危險。建議關閉端口變化中斷。
2.WDT中斷有中斷處理代碼,沒有WDT配置代碼。
3.WDT中斷中斷處理代碼不應在T0中斷處理代碼內(nèi),應同級。
4.不應該在中斷處理代碼中喂狗。
請參考我下面的代碼。
  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秒左右會進來一次
  9.         {
  10.                 INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標志位
  11.                
  12.         }

  13. }
復制代碼





回復

使用道具 舉報

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

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

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

使用道具 舉報

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

按照你的思路修改了,但是還是沒有反應?
#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腳電源開關,高電平表示接通,低電平表示斷開
#define DCF PORTBbits.PB5        //2腳繼電器5, 高有效

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

//==T0時間計算================================================

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

void io_init(void)
{
        PCON &= ~(1<<3);  //關閉LVR  需要在IC_CONFIG里面設置寄存器配置
    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);           //開啟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結合你的代碼看是T0中斷標志轉存,是個位變量,位變量不能和數(shù)值變量運算。我猜測你的代碼是延時var個定時中斷吧?*/

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

void main()
        {
    io_init();
    time0_init();
        delay_ms(80);
                while(1)
                {
                 CLRWDT();
                 if(INTFbits.WDTIF)        //睡眠后60秒左右會進來一次
        {
                 CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標志位
        }
       
                if(KEY1==1)                //K1開關接通后,只要K1接通時,延時后DCF繼電器低電平,然后又延時FMQ繼電器低電平,然后延時JRJDQ繼電器高電平,然后延時JRJDQ2繼電器高電平。
                        {       
                                Delay(10);
                                         {  DCF=0;}    Delay(200);
                                         {  FMQ=0;}    Delay(2000);
                                         {  JRJDQ=1;}  Delay(10);
                                         {  JRJDQ2=1;}
                        }
                        else  //K1開關斷開后,只要K1斷開后時,延時后DCF繼電器高電平,延時后FMQ繼電器高電平,在延時后FMQ繼電器高電平。
                        {                //接著延時后JRJDQ低電平,延時后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秒左右會進來一次
        {
       
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF標志位
               
        }
        }
}
回復

使用道具 舉報

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

或者你把你的項目需求、芯片型號等信息告訴我,我抽空幫你寫個完整代碼。
回復

使用道具 舉報

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

需求就是只要開關接通,繼電器1-5分別高電平;開關斷開繼電器1-5分別低電平,當然,繼電器1-5高電平時每個繼電器之間分別間隔延時1秒,2秒,5秒,8秒;低電平時分別間隔延時2秒,3秒,5秒,3秒。延時時間用定時器做。
回復

使用道具 舉報

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

單片機NY8系列51F

回復

使用道具 舉報

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

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

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

使用道具 舉報

14#
ID:887371 發(fā)表于 2022-1-13 10:17 | 只看該作者

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

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

使用道具 舉報

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

只有一個key1變化引起動作,只要框架寫好,里面動作我自己調(dià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腳電源開關,高電平表示接通,低電平表示斷開
  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ī)格書配置
  16. 內(nèi)部高速RC振蕩器(I_HRC)選擇為4MHz。
  17. 指令時鐘可以選擇為FOSC/4。
  18. 指令周期為1us。
  19. T0每隔256us中斷一次
  20. */
  21. void time0_init(void)
  22. {
  23.         PCON1 = 0;//關閉定時器0和總中斷
  24.         TMR0 = 0;//256us
  25.         T0MD = 0x08;//預分頻給WDT T0不分頻
  26.         INTE |= 0x01;//開啟T0中斷
  27.         PCON1 = 1;//開啟定時器 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); //開啟B口電平中斷
  35.         PORTB = 0x00;//所有輸出為0
  36. }

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

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


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

使用道具 舉報

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

使用道具 舉報

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

加我:hjx5548
回復

使用道具 舉報

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

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

使用道具 舉報

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

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)三條錯誤
回復

使用道具 舉報

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 ...

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




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



回復

使用道具 舉報

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

幾個中斷在一個函數(shù)里面有沖突,應該怎么寫,才正確?
回復

使用道具 舉報

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

中斷是否需要寫三個中斷函數(shù)?應該怎樣修改?
回復

使用道具 舉報

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

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

使用道具 舉報

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

這個是否要寫三個中斷
回復

使用道具 舉報

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

有時間指點一下,為何不能編譯?
回復

使用道具 舉報

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

謝謝指點
回復

使用道具 舉報

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

代碼編譯沒有問題了,可是功能還是沒有實現(xiàn)。
回復

使用道具 舉報

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

程序中斷好像沒有工作,延時不起作用。
回復

使用道具 舉報

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

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

1.png
回復

使用道具 舉報

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

大師,在嗎?你的代碼你編譯,但是中斷沒有工作。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

您好,想請教一下關于九齊的休眠以及喚醒的問題,我這邊使用的是NY8BE62D,因為我使用例程沒有反應,所以想請教下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人干综合 | 欧美激情视频一区 | 黄色片视频在线观看 | 国产一区二区三区在线视频 | 一二三区视频 | 夜夜操天天操 | 人人爽人人干 | 国产三级一区 | 草草在线观看 | 日韩精品三级 | 亚洲免费观看视频 | 精品久久久久久久久久久久久 | 日日干天天干 | 一边摸一边操 | 久久亚洲综合 | 一级黄色片免费观看 | www.午夜 | 成人做爰9片免费视频 | 亚洲蜜桃av | 亚洲福利视频一区 | 久久一区二区三区四区 | 黄色精品网站 | 午夜aaa| 三级黄色片网站 | 免费在线观看黄 | 日韩成人在线免费观看 | 中文字幕在线看 | 日韩久久久久久 | 天天射天天舔 | 日本一级淫片色费放 | 成年人免费在线观看 | 亚洲免费观看视频 | 亚洲91av| 一级片观看 | 日韩欧美在线看 | 美日韩一区 | 综合伊人 | 日韩在线网址 | 91精品久久久久 | 日韩欧美黄色片 | 特级毛片爽www免费版 |