切换到宽版
  • 3457阅读
  • 16回复

[C51]求改个程序stc12c2052ad的 [复制链接]

上一主题 下一主题
离线fyws0532

发帖
36
M币
36
专家
0
粉丝
23
只看该作者 10楼 发表于: 01-14
离线elecfunwb

发帖
836
M币
3064
专家
8
粉丝
9
只看该作者 11楼 发表于: 01-16
回 baihua915 的帖子
baihua915:void main (void)
{
bit y,z;
bit y1,z1;
....... (2018-01-13 23:27) 回 baihua915 的帖子

账号被盗用不了,重新注册了个。
这样改没问题
本帖最近打赏记录:共1条打赏M币+30
离线baihua915

发帖
1435
M币
2263
专家
16
粉丝
94
只看该作者 12楼 发表于: 01-17
回 elecfunwb 的帖子
elecfunwb:账号被盗用不了,重新注册了个。
这样改没问题 (2018-01-16 12:06) 回 elecfunwb 的帖子

不是吧,还有盗号的,刚给你加了几十的m,真晕!对了,硬件在实施过程中,低电平有效驱动12V继电器不起作用了,驱动5V的没问题,目前还没有好的办法,如果要改成高电平有效的话,要怎么改,是不是直接在前面改控制IO置低电平就可以了,怎么个加法?
离线elecfunwb

发帖
836
M币
3064
专家
8
粉丝
9
只看该作者 13楼 发表于: 01-17
LED = 0改成LED = 1
LED = 1改成LED = 0
另外一路也是这样改
本帖最近打赏记录:共1条打赏M币+30
离线baihua915

发帖
1435
M币
2263
专家
16
粉丝
94
只看该作者 14楼 发表于: 01-18
硬件上看IO口够4路控制,不知软件能不能实现4路这样的控制。

后来我想了下,高电平有效不用改都可以,就是将学习码反转一下就可以了,就是上电直接高电平控制,这个开机先将两个输出控制端置低电平可解决。想再试下4路控制的,能再帮下忙改下执行码码这一段吗?是不是还要增加一个LEDChanel

  /***************************执行码****************************/
if(flag == 1)
{
    if(Shezhi == 0)
    {
        if(LEDChanel)
        {
            Sector_Erase(0x0000);
            Byte_Program(0x0000, Mazhi[0]);
            Byte_Program(0x0001, Mazhi[1]);
            Byte_Program(0x0002, Mazhi[2]);
        } else {
            Sector_Erase(0x0400);
            Byte_Program(0x0400, Mazhi[0]);
            Byte_Program(0x0401, Mazhi[1]);
            Byte_Program(0x0402, Mazhi[2]);
        }
        
    }
    else if(Shezhi2 == 0)
    {
        if(LEDChanel)
        {
            Sector_Erase(0x0200);
            Byte_Program(0x0200, Mazhi[0]);
            Byte_Program(0x0201, Mazhi[1]);
            Byte_Program(0x0202, Mazhi[2]);
        } else {
            Sector_Erase(0x0600);
            Byte_Program(0x0600, Mazhi[0]);
            Byte_Program(0x0601, Mazhi[1]);
            Byte_Program(0x0602, Mazhi[2]);
        }
    }

    if((Mazhi[0] == Byte_Read(0x0000)) && (Mazhi[1] == Byte_Read(0x0001)) && (Mazhi[2] == Byte_Read(0x0002)))
        LED = 0;
    else if((Mazhi[0] == Byte_Read(0x0200)) && (Mazhi[1] == Byte_Read(0x0201)) && (Mazhi[2] == Byte_Read(0x0202)))
        LED = 1;
    else if((Mazhi[0] == Byte_Read(0x0400)) && (Mazhi[1] == Byte_Read(0x0401)) && (Mazhi[2] == Byte_Read(0x0402)))
        LED2 = 0;
    else if((Mazhi[0] == Byte_Read(0x0600)) && (Mazhi[1] == Byte_Read(0x0601)) && (Mazhi[2] == Byte_Read(0x0602)))
        LED2 = 1;
}
   /*****************************************************/
离线elecfunwb

发帖
836
M币
3064
专家
8
粉丝
9
只看该作者 15楼 发表于: 01-20
硬件上看IO口够4路控制,不知软件能不能实现4路这样的控制。
后来我想了下,高电平有效不用改都可以,就是将学习码反转一下就可以了,就是上电直接高电平控制,这个开机先将两个输出控制端置低电平可解决。想再试下4路控制的,能再帮下忙改下执行码码这一段吗?是不是还要增加一个LEDChanel

IO定义自己改吧,高低电平也自己改吧,就是增加个跟原来一起的两组。




#include <STC12C2052AD.h>
#include <intrins.h>
unsigned char Mazhi[4];   //存储接收的4个字节码值
bit flag = 0;             //接收成功标志位
sbit IR = P3^2;           //红外接收头接P3.2脚
sbit LED1 = P1^0;         //继电器控制端口1
sbit LED2 = P1^5;         //继电器控制端口2
sbit LED3 = P1^6;         //继电器控制端口3
sbit LED4 = P1^7;         //继电器控制端口4
sbit Kaiguan1 = P1^1;     //手动开关1
sbit Kaiguan2 = P3^3;     //手动开关2
sbit Kaiguan3 = P3^4;     //手动开关3
sbit Kaiguan4 = P3^5;     //手动开关4
sbit ShezhiKai12 = P1^2;  //设置1/2组的开键值
sbit ShezhiGuan12 = P3^7; //设置1/2组的关键值
sbit ShezhiKai34 = P3^0;  //设置3/4组的开键值
sbit ShezhiGuan34 = P1^3; //设置3/4组的关键值
sbit ShezhiZu12 = P1^4;   //指示当前设置1/2组的哪一组,0设置第1组,1设置第2组,建议用拨动开关或自锁开关
sbit ShezhiZu34 = P3^1;   //指示当前设置3/4组的哪一组,0设置第3组,1设置第4组,建议用拨动开关或自锁开关

/********************读字节函数*********************/
unsigned char Byte_Read(unsigned int add)
{
    ISP_DATA = 0x00;//清空数据
    ISP_CONTR = 0x84;//打开ISP,设置操作等待时间 12MHz以下0x83 30MHz以下0x80 6MHz以下0x84
    ISP_CMD = 0x01;//字节读命令
    ISP_ADDRH = add >> 8; //设置高8位地址
    ISP_ADDRL = add & 0x00ff; //设置低8位地址
    ISP_TRIG = 0x46;//发送46h到触发寄存器
    ISP_TRIG = 0xb9;//发送b9h到触发寄存器
    _nop_();//延时
    ISP_CONTR = 0;//关闭IAP 功能
    ISP_CMD = 0;//清空命令寄存器
    ISP_TRIG = 0;//清空命令触发寄存器
    ISP_ADDRH = 0;//清空地址高位
    ISP_ADDRL = 0;//清空地址低位
    return (ISP_DATA);//返回读到的数据
}
/*******************字节编程函数********************/
void Byte_Program(unsigned int add, unsigned char dat)
{
    ISP_CONTR = 0x84;//打开ISP,设置操作等待时间
    ISP_CMD = 0x02;//字节编程命令
    ISP_ADDRH = add >> 8; //设置高8位地址
    ISP_ADDRL = add & 0x00ff; //设置低8位地址
    ISP_DATA = dat;//要编程的数据先送进ISP_DATA 寄存器
    ISP_TRIG = 0x46;//发送46h到触发寄存器
    ISP_TRIG = 0xb9;//发送b9h到触发寄存器
    _nop_();//延时
    ISP_CONTR = 0;//关闭IAP 功能
    ISP_CMD = 0;//清空命令寄存器
    ISP_TRIG = 0;//清空命令触发寄存器
    ISP_ADDRH = 0;//清空地址高位
    ISP_ADDRL = 0;//清空地址低位
}
/********************扇区擦除函数**********************/
void Sector_Erase(unsigned int add)
{
    ISP_CONTR = 0x84;//打开ISP,设置操作等待时间
    ISP_CMD = 0x03;//扇区擦除命令
    ISP_ADDRH = add >> 8; //设置高8位地址
    ISP_ADDRL = add & 0x00ff; //设置低8位地址
    ISP_TRIG = 0x46;//发送46h到触发寄存器
    ISP_TRIG = 0xb9;//发送b9h到触发寄存器
    _nop_();//延时
    ISP_CONTR = 0;//关闭IAP 功能
    ISP_CMD = 0;//清空命令寄存器
    ISP_TRIG = 0;//清空命令触发寄存器
    ISP_ADDRH = 0;//清空地址高位
    ISP_ADDRL = 0;//清空地址低位
}
/*********************延时函数****************************/
void delay(unsigned int b)
{
    unsigned int k;
    while(b--)
    {
        for(k = 0; k < 260; k++);
    }
}

/********************遥控接收初始化函数*********************/
void Yaokong_init()
{
    TMOD = 0x10; //定时器1采用定时模式和16位模式
    IT0 = 1; //外部中断0下降沿触发
    EX0 = 1;  //开启外部中断0
    EA = 1; //开启总中断
}
/********************遥控接收中断函数***********************/
void Yaokong() interrupt 0
{
    unsigned int Hightime, Lowtime; //临时存储高低电平持续时间
    unsigned char i, j;
    flag = 0; //标志位清零
    /*****码值清零******/
    Mazhi[0] = 0;
    Mazhi[1] = 0;
    Mazhi[2] = 0;
    Mazhi[3] = 0;
    /*******************/
    TH1 = 0;
    TL1 = 0;
    TR1 = 1;
    while((IR == 0) && ((TH1 * 256 + TL1) < 5000));
    TR1 = 0;
    Lowtime = TH1 * 256 + TL1; //计算引导码低电平时间
    TH1 = 0;
    TL1 = 0;
    TR1 = 1;
    while((IR == 1) && ((TH1 * 256 + TL1) < 2608));
    TR1 = 1;
    Hightime = TH1 * 256 + TL1; //计算引导码高电平时间
    if((Lowtime > Hightime) && (Lowtime < Hightime * 3)) //判断是否为正确的引导码
    {
        for(j = 0; j < 4; j++)
        {
            for(i = 0; i < 8; i++)
            {
                Mazhi[j] = Mazhi[j] >> 1;
                TH1 = 0;
                TL1 = 0;
                TR1 = 1;
                while((IR == 0) && ((TH1 * 256 + TL1) < 326));
                TR1 = 0;
                Lowtime = TH1 * 256 + TL1;
                TH1 = 0;
                TL1 = 0;
                TR1 = 1;
                while((IR == 1) && ((TH1 * 256 + TL1) < 956));
                TR1 = 0;
                Hightime = TH1 * 256 + TL1;
                if((Hightime > Lowtime * 2) && (Hightime < Lowtime * 4))
                    Mazhi[j] = Mazhi[j] | 0x80;
            }
        }
        /*****延时1ms以跳过结束码*****/
        TH1 = 0;
        TL1 = 0;
        TR1 = 1;
        while((TH1 * 256 + TL1) < 434);
        /*****************************/
        if(Mazhi[2] + Mazhi[3] == 0xff) //判断数据码及其反码是否正确
            flag = 1;  //如果正确,标志位置1
    }
    /***************************以下为执行部分****************************/
    if(flag == 1)
    {
        if(ShezhiKai12 == 0)
        {
            if(ShezhiZu12)
            {
                Sector_Erase(0x0000);
                Byte_Program(0x0000, Mazhi[0]);
                Byte_Program(0x0001, Mazhi[1]);
                Byte_Program(0x0002, Mazhi[2]);
            }
            else
            {
                Sector_Erase(0x0400);
                Byte_Program(0x0400, Mazhi[0]);
                Byte_Program(0x0401, Mazhi[1]);
                Byte_Program(0x0402, Mazhi[2]);
            }

        }
        else if(ShezhiGuan12 == 0)
        {
            if(ShezhiZu12)
            {
                Sector_Erase(0x0200);
                Byte_Program(0x0200, Mazhi[0]);
                Byte_Program(0x0201, Mazhi[1]);
                Byte_Program(0x0202, Mazhi[2]);
            }
            else
            {
                Sector_Erase(0x0600);
                Byte_Program(0x0600, Mazhi[0]);
                Byte_Program(0x0601, Mazhi[1]);
                Byte_Program(0x0602, Mazhi[2]);
            }
        }
        else if(ShezhiKai34 == 0)
        {
            if(ShezhiZu34)
            {
                Sector_Erase(0x0800);
                Byte_Program(0x0800, Mazhi[0]);
                Byte_Program(0x0801, Mazhi[1]);
                Byte_Program(0x0802, Mazhi[2]);
            }
            else
            {
                Sector_Erase(0x0C00);
                Byte_Program(0x0C00, Mazhi[0]);
                Byte_Program(0x0C01, Mazhi[1]);
                Byte_Program(0x0C02, Mazhi[2]);
            }

        }
        else if(ShezhiGuan34 == 0)
        {
            if(ShezhiZu34)
            {
                Sector_Erase(0x0A00);
                Byte_Program(0x0A00, Mazhi[0]);
                Byte_Program(0x0A01, Mazhi[1]);
                Byte_Program(0x0A02, Mazhi[2]);
            }
            else
            {
                Sector_Erase(0x0E00);
                Byte_Program(0x0E00, Mazhi[0]);
                Byte_Program(0x0E01, Mazhi[1]);
                Byte_Program(0x0E02, Mazhi[2]);
            }
        }

        if((Mazhi[0] == Byte_Read(0x0000)) && (Mazhi[1] == Byte_Read(0x0001)) && (Mazhi[2] == Byte_Read(0x0002)))
            LED1 = 0;
        else if((Mazhi[0] == Byte_Read(0x0200)) && (Mazhi[1] == Byte_Read(0x0201)) && (Mazhi[2] == Byte_Read(0x0202)))
            LED1 = 1;
        else if((Mazhi[0] == Byte_Read(0x0400)) && (Mazhi[1] == Byte_Read(0x0401)) && (Mazhi[2] == Byte_Read(0x0402)))
            LED2 = 0;
        else if((Mazhi[0] == Byte_Read(0x0600)) && (Mazhi[1] == Byte_Read(0x0601)) && (Mazhi[2] == Byte_Read(0x0602)))
            LED2 = 1;
        else if((Mazhi[0] == Byte_Read(0x0800)) && (Mazhi[1] == Byte_Read(0x0801)) && (Mazhi[2] == Byte_Read(0x0802)))
            LED3 = 0;
        else if((Mazhi[0] == Byte_Read(0x0A00)) && (Mazhi[1] == Byte_Read(0x0A01)) && (Mazhi[2] == Byte_Read(0x0A02)))
            LED3 = 1;
        else if((Mazhi[0] == Byte_Read(0x0C00)) && (Mazhi[1] == Byte_Read(0x0C01)) && (Mazhi[2] == Byte_Read(0x0C02)))
            LED4 = 0;
        else if((Mazhi[0] == Byte_Read(0x0E00)) && (Mazhi[1] == Byte_Read(0x0E01)) && (Mazhi[2] == Byte_Read(0x0E02)))
            LED4 = 1;
    }
    /*****************************************************/
}
/***********************主函数****************************/
void main (void)
{
    bit y1, z1;
    bit y2, z2;
    bit y3, z3;
    bit y4, z4;
    Yaokong_init();
    while(1)
    {
        y1 = Kaiguan1;
        y2 = Kaiguan2;
        y3 = Kaiguan3;
        y4 = Kaiguan4;
        delay(50);
        z1 = Kaiguan1;
        z2 = Kaiguan2;
        z3 = Kaiguan3;
        z4 = Kaiguan4;


        if(y1 != z1)
            LED1 = ~LED1;
        if(y2 != z2)
            LED2 = ~LED2;
        if(y3 != z3)
            LED3 = ~LED3;
        if(y4 != z4)
            LED4 = ~LED4;
    }
}
本帖最近打赏记录:共1条打赏M币+30
离线baihua915

发帖
1435
M币
2263
专家
16
粉丝
94
只看该作者 16楼 发表于: 01-28
elecfunwb:IO定义自己改吧,高低电平也自己改吧,就是增加个跟原来一起的两组。
[table][tr][td]
....... (2018-01-20 01:00) 

实物已经做出来装上使用,使用中发现一个问题,就是红外信号发出端连续发出四个红外信号,接受控制板速度跟不上,也就是单片机还没处理完第一个红外信号,发出端第二个信号已经发送完毕了,不知软件上有没有办法优化下,跟上红外信号发送端的速度?

内容来自Android手机客户端

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限