找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

15w104單片機的蘿麗程序移植到8g1k08a

[復(fù)制鏈接]
ID:1101801 發(fā)表于 2023-11-30 21:56 | 顯示全部樓層 |閱讀模式
蘿麗的4路遙控開關(guān),為了縮小pcb體積,想移植到DNF8的8g1k上。純小白,對著程序百度了3天,還是搞不明白。求教萬能的網(wǎng)友怎么改才能移植。
單片機源程序如下:
#include<STC8G.h>
#define u8 unsigned char
#define u16 unsigned int

/*****************************************************/
//15w寄存器,8g頭文件有,注釋掉
//sfr P3M0=0xb2;
//sfr AUXR=0x8e;         
//sfr T2H=0xd6;
//sfr T2L=0xd7;
//sfr IE2=0xaf;

/*****************************************************/
//數(shù)據(jù)標(biāo)志
sbit LED=P5^5;
sbit IN=P5^4;          //原來是3.5、3.4換8g1k沒有這兩個

sbit OUT1=P3^3;
sbit OUT2=P3^2;
sbit OUT3=P3^1;
sbit OUT4=P3^0;

u16 time,tt;
u8 reset,n,over=1,t_out;


/******************************************************/
//脈寬測量
void measure()
{
        time=0;
        TL0=0,TH0=0;
        while(!IN);
        TR0=1;
        while(IN);
        TR0=0;
        time=TH0;
        time<<=8;
        time+=TL0;               
}

void initial()
{
        P3=0xf0;         //P5口不知道怎么加進來,定時器怎么改
        P3M0=0x2f;
        TMOD=0x01;
        measure();
           measure();
          measure();
           measure();
                measure();
                while(over)                 //上電等正確信號
                {
                        measure();
                        if(time<1300&&time>800)over=0;
                }
}

main()
{
    initial();
        LED=0;
        IE=0x80;
        IE2=0x04;

        while(1)
        {
                 measure();

                if(time>800&&time<2200)
                {
                        if(time>1700)                                 
                        {
                                if(reset)
                                {
                                        n++;
                                        if(n>4)                //5次信號正確再啟動
                                        {
                                                n=0,tt=0;
                                                
                                                t_out++;
                                                if(t_out>4)t_out=1;
                                                reset=0;
                                                AUXR=0x10;        //打開定時器2
                                        }
                                }
                        }
                        else if(time<1300)                        //低于1.4ms復(fù)位
                        {
                                n++;
                                if(n>4)n=0,reset=1;
                        }
                }
                else n=0,reset=0;                 

        }
}

void et2()interrupt 12
{

        if(t_out==1)                                                          //接通3.3
        {
                OUT1=1,OUT2=0,OUT3=0,OUT4=0;
        }
        else if(t_out==2)                                                          //3.2
        {
                OUT1=0,OUT2=1,OUT3=0,OUT4=0;
        }
        else if(t_out==3)                                                          //3.1
        {
                OUT1=0,OUT2=0,OUT3=1,OUT4=0;
        }
        else if(t_out==4)                                                          //3.0
        {               
                OUT1=0,OUT2=0,OUT3=0,OUT4=1;
        }
        
        tt++;
        if(tt%2==0)LED=!LED;//閃爍LED
        if(tt>30)P3=0xf0,AUXR=0,tt=0,LED=0;         //延時2秒關(guān)閉輸出
}
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2023-12-1 11:05 | 顯示全部樓層
15w104有定時器0和定時器2,沒有定時器1。管腳P3.0~P3.5。8g1k08a 有定時器0和定時器1,沒有定時器2。管腳P3.0~P3.3,P5.4~P5.5。只要將兩者不同之處改一下即可。
  1. #include<STC8G.h>
  2. #define u8 unsigned char
  3. #define u16 unsigned int

  4. /*****************************************************/
  5. //15w寄存器,8g頭文件有,注釋掉
  6. //sfr P3M0=0xb2;
  7. //sfr AUXR=0x8e;         
  8. //sfr T2H=0xd6;
  9. //sfr T2L=0xd7;
  10. //sfr IE2=0xaf;

  11. /*****************************************************/
  12. //數(shù)據(jù)標(biāo)志
  13. sbit LED= P5^5;
  14. sbit IN = P5^4;          //原來是3.5、3.4換8g1k沒有這兩個

  15. sbit OUT1=P3^3;
  16. sbit OUT2=P3^2;
  17. sbit OUT3=P3^1;
  18. sbit OUT4=P3^0;

  19. u16 time,tt;
  20. u8 reset,n,over=1,t_out;


  21. /******************************************************/
  22. //脈寬測量
  23. void measure()
  24. {
  25.         time=0;
  26.         TL0=0,TH0=0;
  27.         while(!IN);
  28.         TR0=1;
  29.         while(IN);
  30.         TR0=0;
  31.         time=TH0;
  32.         time<<=8;
  33.         time+=TL0;
  34. }

  35. void initial()
  36. {
  37.         P3&=0xf0;         //P3.0~3.3低電平
  38.         P5|=0x30;         //P5.4~5.5高電平
  39.         P3M0=0x0f;        //P3.0~3.3推挽
  40.         P5M0=0x20;        //P5.4準(zhǔn)雙向、P5.5推挽
  41.         TMOD=0x11;        //T0、T1工作模式12T
  42.         TL0=0;
  43.         TH0=0;
  44.         TL1=0;
  45.         TH1=0;
  46.         measure();
  47.         measure();
  48.         measure();
  49.         measure();
  50.         measure();
  51.         while(over)                 //上電等正確信號
  52.         {
  53.                 measure();
  54.                 if(time<1300&&time>800)over=0;
  55.         }
  56. }

  57. void main()
  58. {
  59.         initial();
  60.         LED=0;
  61.         IE=0x80;//開總中斷
  62. //        IE2=0x04;//開T2中斷
  63.         ET1=1;//開T1中斷
  64.         while(1)
  65.         {
  66.                 measure();
  67.        
  68.                 if(time>800&&time<2200)
  69.                 {
  70.                         if(time>1700)                                 
  71.                         {
  72.                                 if(reset)
  73.                                 {
  74.                                         n++;
  75.                                         if(n>4)                //5次信號正確再啟動
  76.                                         {
  77.                                                 n=0,tt=0;       
  78.                                                 t_out++;
  79.                                                 if(t_out>4)t_out=1;
  80.                                                 reset=0;
  81. //                                                AUXR=0x10;        //打開定時器2
  82.                                                 TR1=1;//打開定時器1
  83.                                         }
  84.                                 }
  85.                         }
  86.                         else if(time<1300)                        //低于1.4ms復(fù)位
  87.                         {
  88.                                 n++;
  89.                                 if(n>4)n=0,reset=1;
  90.                         }
  91.                 }
  92.                 else n=0,reset=0;
  93.         }
  94. }

  95. void et1()interrupt 3
  96. {
  97.         if(t_out==1)                             //接通3.3
  98.         {
  99.                 OUT1=1,OUT2=0,OUT3=0,OUT4=0;
  100.         }
  101.         else if(t_out==2)                        //3.2
  102.         {
  103.                 OUT1=0,OUT2=1,OUT3=0,OUT4=0;
  104.         }
  105.         else if(t_out==3)                        //3.1
  106.         {
  107.                 OUT1=0,OUT2=0,OUT3=1,OUT4=0;
  108.         }
  109.         else if(t_out==4)                        //3.0
  110.         {               
  111.                 OUT1=0,OUT2=0,OUT3=0,OUT4=1;
  112.         }
  113.        
  114.         tt++;
  115.         if(tt%2==0)LED=!LED;//閃爍LED
  116.         if(tt>30)
  117.         {
  118.                 P3&=0xf0;//停止輸出
  119.                 P5|=0x30;//
  120. //                AUXR=0;//關(guān)閉定時器2
  121.                 TR1=0;//關(guān)閉定時器1
  122.                 tt=0;
  123.                 LED=0;//延時2秒關(guān)閉輸出
  124.         }
  125. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:1101801 發(fā)表于 2023-12-1 16:26 | 顯示全部樓層
wulin 發(fā)表于 2023-12-1 11:05
15w104有定時器0和定時器2,沒有定時器1。管腳P3.0~P3.5。8g1k08a 有定時器0和定時器1,沒有定時器2。管腳P ...

非常感謝大哥抽空解答,編譯固件刷進去還是沒反應(yīng)。刷其他固件能運行,電路和stc-isp設(shè)置,keil的設(shè)置應(yīng)該沒問題。

原來的設(shè)計,上電p5.5亮燈。p5.4輸入達到800-1300ms內(nèi)滅燈,進入工作狀態(tài)。反復(fù)撥動開關(guān)改變電平依次p3.3……p3.2……3.1……30……3.3不斷循環(huán)。

原理不難,看你的代碼好像能懂,核對端口設(shè)定,沒毛病。

刷進去就是沒反應(yīng),上電,所有io都沒電壓,包括5.5。5.4接入信號,也沒反應(yīng)。求解?
回復(fù)

使用道具 舉報

ID:685462 發(fā)表于 2023-12-1 18:12 | 顯示全部樓層
8腳的需要注意8g1k08a的3.0,3.1,3.2管腳電平狀態(tài)
回復(fù)

使用道具 舉報

ID:1101801 發(fā)表于 2023-12-1 20:03 | 顯示全部樓層
按照大佬的代碼編譯進去還是沒反應(yīng)。我改了一下,如下,可以受控工作,但問題也嚴重,上電4個P3直接輸出
修改部分如下:
void initial()
{
                                              //P3&=~0xf0;         //P3.0~3.3低電平
                                              //P5|=0x30;         //P5.4~5.5高電平
        P3M0 |= 0x0f; P3M1 &= ~0x0f;   
                                              //P3M0=0x0f;        //P3.0~3.3推挽
        P5M0 = 0x20; P5M1 = 0x00;
                                              //P5M0=0x20;       //P5.4準(zhǔn)雙向、P5.5推挽
        TMOD=0x11;        //T0、T1工作模式12T
        TL0=0;
        TH0=0;
        TL1=0;
        TH1=0;
回復(fù)

使用道具 舉報

ID:1101801 發(fā)表于 2023-12-1 20:54 | 顯示全部樓層
糊里糊涂的改,無緣無故的成功了。
加了一句
void initial()
{
                                              //P3&=~0xf0;         //P3.0~3.3低電平
                                              //P5|=0x30;         //P5.4~5.5高電平
        P3M0 |= 0x0f; P3M1 &= ~0x0f;   
                                              //P3M0=0x0f;        //P3.0~3.3推挽
        P5M0 = 0x20; P5M1 = 0x00;
        P3=0xf0;                                    //加了這句
        TMOD=0x11;        //T0、T1工作模式12T
        TL0=0;
回復(fù)

使用道具 舉報

ID:1101801 發(fā)表于 2023-12-1 21:53 | 顯示全部樓層
lose2836 發(fā)表于 2023-12-1 18:12
8腳的需要注意8g1k08a的3.0,3.1,3.2管腳電平狀態(tài)

的確是這個問題,補了一句低電平就可以了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表