欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5322|回復: 33
收起左側

九齊單片機代碼調試下面兩點哪里有問題?

[復制鏈接]
ID:72649 發表于 2022-1-11 09:04 | 顯示全部樓層 |閱讀模式
直接上代碼
主要兩個問題咨詢一下網友:1、定時器延時函數能不能正常工作;2、開關(此開關不是按鍵開關,是普通的接通和斷開開關)接通執行一套代碼;否則斷開,執行另一套代碼。
#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標志位
               
        }
        }
}

回復

使用道具 舉報

ID:887371 發表于 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 發表于 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 發表于 2022-1-11 12:51 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-11 10:21
這段代碼有問題。
1.只有PB4是輸入,只需要一條語句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOS ...

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

使用道具 舉報

ID:72649 發表于 2022-1-11 12:52 來自觸屏版 | 顯示全部樓層
謝謝,我修改了試一下
回復

使用道具 舉報

ID:887371 發表于 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中斷標志轉存,是個位變量,位變量不能和數值變量運算。我猜測你的代碼是延時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. }
復制代碼
回復

使用道具 舉報

ID:887371 發表于 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中斷處理代碼內,應同級。
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. }
復制代碼





回復

使用道具 舉報

ID:887371 發表于 2022-1-11 15:29 | 顯示全部樓層
hjx5548 發表于 2022-1-11 12:51
PB喚醒寄存器怎么開啟?能不能詳細說明一下。

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

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

使用道具 舉報

ID:72649 發表于 2022-1-12 08:57 | 顯示全部樓層
datouyuan 發表于 2022-1-11 15:29
你查下單片機的規格書。
在所有支持引腳變化中斷的單片機(包括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中斷標志轉存,是個位變量,位變量不能和數值變量運算。我猜測你的代碼是延時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標志位
               
        }
        }
}
回復

使用道具 舉報

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

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

使用道具 舉報

ID:72649 發表于 2022-1-12 16:36 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-12 14:30
我提到的很多點你都沒改到。例如你還是開啟了端口變化中斷,而中斷又處理。
現象只說沒反應,這讓我們很難 ...

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

使用道具 舉報

ID:72649 發表于 2022-1-12 16:37 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-12 14:30
我提到的很多點你都沒改到。例如你還是開啟了端口變化中斷,而中斷又處理。
現象只說沒反應,這讓我們很難 ...

單片機NY8系列51F

回復

使用道具 舉報

ID:887371 發表于 2022-1-13 10:04 | 顯示全部樓層
hjx5548 發表于 2022-1-12 16:36
需求就是只要開關接通,繼電器1-5分別高電平;開關斷開繼電器1-5分別低電平,當然,繼電器1-5高電平時 ...

輸出定義:JDQ1 JDQ2 JDQ3 JDQ4 JDQ5
輸入定義:KEY1
初始狀態:所有輸出為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,其它輸出?
只在初始狀態、步驟5時才檢查KEY1值?
任何時候都檢測KEY1值?要考慮步驟1~4在KEY1變化時的動作。

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

使用道具 舉報

ID:887371 發表于 2022-1-13 10:17 | 顯示全部樓層
hjx5548 發表于 2022-1-12 16:37
單片機NY8系列51F

051F的規格書只找到了英文版。我用051E的規格書截圖。 屏幕截圖 2022-01-13 100518.jpg
屏幕截圖 2022-01-13 100635.jpg
BWUCON=~(1<<4);//開啟PB4的引腳中斷
回復

使用道具 舉報

ID:72649 發表于 2022-1-13 12:42 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-13 10:04
輸出定義:JDQ1 JDQ2 JDQ3 JDQ4 JDQ5
輸入定義:KEY1
初始狀態:所有輸出為0(JDQ1=JDQ2=JDQ3=JDQ4=JDQ ...

只有一個key1變化引起動作,只要框架寫好,里面動作我自己調整。
回復

使用道具 舉報

ID:887371 發表于 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引腳中斷發生
  13. __sbit t0zd1b = sysmode: 1;//T0中斷發生

  14. /*
  15. 按規格書配置
  16. 內部高速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中斷,延時函數才起作用
  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.         /*只在初始狀態和步驟5檢測按鍵變化*/
  69.         while (1) {
  70.                 if(fz1b) {
  71.                         //KEY1發生變化
  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; //只有之后發生的引腳變化才起作用
  95.                 }
  96.                 CLRWDT(); //喂狗
  97.         }
  98. }
  99. /*
  100. 見規格書第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輸入狀態變化中斷
  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變化有效的,需要用到狀態機。
回復

使用道具 舉報

ID:387856 發表于 2022-1-13 17:20 | 顯示全部樓層
你要什么功能,我是專業做九齊的,免費開發
回復

使用道具 舉報

ID:72649 發表于 2022-1-13 20:04 | 顯示全部樓層
liuhailan5757 發表于 2022-1-13 17:20
你要什么功能,我是專業做九齊的,免費開發

加我:hjx5548
回復

使用道具 舉報

ID:72649 發表于 2022-1-14 14:31 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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

使用道具 舉報

ID:72649 發表于 2022-1-14 14:41 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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) -
編譯出現三條錯誤
回復

使用道具 舉報

ID:887371 發表于 2022-1-14 16:24 | 顯示全部樓層
hjx5548 發表于 2022-1-14 14:41
overflow in implicit constant conversion (158) -
Use BCR instruction to clear interrupt flag may ...

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

出錯位置

出錯位置

重要配置

重要配置


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



回復

使用道具 舉報

ID:72649 發表于 2022-1-14 17:17 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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

使用道具 舉報

ID:72649 發表于 2022-1-15 07:36 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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

使用道具 舉報

ID:887371 發表于 2022-1-15 09:54 | 顯示全部樓層
hjx5548 發表于 2022-1-15 07:36
中斷是否需要寫三個中斷函數?應該怎樣修改?

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

使用道具 舉報

ID:72649 發表于 2022-1-16 07:12 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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

使用道具 舉報

ID:72649 發表于 2022-1-17 16:43 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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

使用道具 舉報

ID:72649 發表于 2022-1-17 20:26 | 顯示全部樓層
datouyuan 發表于 2022-1-15 09:54
九齊這類仿微芯單片機所有中斷共用一個中斷函數。
不存在中斷有沖突的說法,你的意思是不是有多個中斷同 ...

謝謝指點
回復

使用道具 舉報

ID:72649 發表于 2022-1-17 20:31 | 顯示全部樓層
datouyuan 發表于 2022-1-14 16:24
看來你基礎很差。剛裝好九齊的編譯環境。參考九齊的例程,修改見下圖:

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

使用道具 舉報

ID:72649 發表于 2022-1-17 21:43 | 顯示全部樓層
datouyuan 發表于 2022-1-14 16:24
看來你基礎很差。剛裝好九齊的編譯環境。參考九齊的例程,修改見下圖:

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

使用道具 舉報

ID:1002539 發表于 2022-1-18 20:36 | 顯示全部樓層
撥動開關切不切換暫時還不清楚,但這里用阻塞式的延時就肯定不行的!按照這寫法,開關常開或常閉,狀態切換至少要大于10秒之后才有反應的!
1.png
回復

使用道具 舉報

ID:72649 發表于 2022-1-19 19:05 來自觸屏版 | 顯示全部樓層
datouyuan 發表于 2022-1-13 16:14
需要任何時候KEY1變化有效的,需要用到狀態機。

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

使用道具 舉報

ID:403658 發表于 2022-3-6 10:46 | 顯示全部樓層
大佬  在嗎??  想問下九齊單片機
uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  這些都是配置 什么意思的啊?
回復

使用道具 舉報

ID:437896 發表于 2022-4-23 10:06 | 顯示全部樓層
datouyuan 發表于 2022-1-11 10:21
這段代碼有問題。
1.只有PB4是輸入,只需要一條語句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOS ...

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

使用道具 舉報

ID:1097287 發表于 2023-10-25 19:26 | 顯示全部樓層
liuhailan5757 發表于 2022-1-13 17:20
你要什么功能,我是專業做九齊的,免費開發

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表