找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 454|回复: 6
打印 上一主题 下一主题
收起左侧

15w104单片机的萝丽程序移植到8g1k08a

[复制链接]
跳转到指定楼层
楼主
ID:1101801 发表于 2023-11-30 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
萝丽的4路遥控开关,为了缩小pcb体积,想移植到DNF8的8g1k上。纯小白,对着程序百度了3天,还是搞不明白。求教万能的网友怎么改才能移植。
单片机源程序如下:
#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;

/*****************************************************/
//数据标志
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复位
                        {
                                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秒关闭输出
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 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. //数据标志
  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准双向、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复位
  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;//关闭定时器2
  121.                 TR1=0;//关闭定时器1
  122.                 tt=0;
  123.                 LED=0;//延时2秒关闭输出
  124.         }
  125. }
复制代码
回复

使用道具 举报

板凳
ID:1101801 发表于 2023-12-1 16:26 | 只看该作者
wulin 发表于 2023-12-1 11:05
15w104有定时器0和定时器2,没有定时器1。管脚P3.0~P3.5。8g1k08a 有定时器0和定时器1,没有定时器2。管脚P ...

非常感谢大哥抽空解答,编译固件刷进去还是没反应。刷其他固件能运行,电路和stc-isp设置,keil的设置应该没问题。

原来的设计,上电p5.5亮灯。p5.4输入达到800-1300ms内灭灯,进入工作状态。反复拨动开关改变电平依次p3.3……p3.2……3.1……30……3.3不断循环。

原理不难,看你的代码好像能懂,核对端口设定,没毛病。

刷进去就是没反应,上电,所有io都没电压,包括5.5。5.4接入信号,也没反应。求解?
回复

使用道具 举报

地板
ID:685462 发表于 2023-12-1 18:12 | 只看该作者
8脚的需要注意8g1k08a的3.0,3.1,3.2管脚电平状态
回复

使用道具 举报

5#
ID:1101801 发表于 2023-12-1 20:03 | 只看该作者
按照大佬的代码编译进去还是没反应。我改了一下,如下,可以受控工作,但问题也严重,上电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准双向、P5.5推挽
        TMOD=0x11;        //T0、T1工作模式12T
        TL0=0;
        TH0=0;
        TL1=0;
        TH1=0;
回复

使用道具 举报

6#
ID:1101801 发表于 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;
回复

使用道具 举报

7#
ID:1101801 发表于 2023-12-1 21:53 | 只看该作者
lose2836 发表于 2023-12-1 18:12
8脚的需要注意8g1k08a的3.0,3.1,3.2管脚电平状态

的确是这个问题,补了一句低电平就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表