切换到宽版
  • 1884阅读
  • 15回复

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

上一主题 下一主题
离线baihua915
 

发帖
1388
M币
4377
专家
16
粉丝
88



仿制坛友的红外开关,东西已经做出来了,运行正常,想改一个地方,无奈软件实在吃不下,望有学之士帮下忙,就是遥控开关分两个码,一个码控制开,一个码控制关,其他不变,要改动哪里?

原贴:http://bbs.mydigit.cn/read.php?tid=1544562

include <STC12C2052AD.h>
#include <intrins.h>
unsigned char Mazhi[4]; //存储接收的4个字节码值
bit flag=0; //接收成功标志位
sbit IR=P3^2; //红外接收头接P3.2脚
sbit LED=P1^0;
sbit Kaiguan=P1^1;
sbit Shezhi=P1^2;
/********************读字节函数*********************/
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(Shezhi==0)
    {
     Sector_Erase(0x0000);
     Byte_Program(0x0000,Mazhi[0]);
     Byte_Program(0x0001,Mazhi[1]);
     Byte_Program(0x0002,Mazhi[2]);
    }
    if((Mazhi[0]==Byte_Read(0x0000))&&(Mazhi[1]==Byte_Read(0x0001))&&(Mazhi[2]==Byte_Read(0x0002)))
        LED=~LED;
   }
   /*****************************************************/
}
/***********************主函数****************************/
void main (void)
{
bit y,z;
Yaokong_init();
while(1)
{
  y=Kaiguan;
  delay(50);
  z=Kaiguan;
  if(y!=z)
  LED=~LED;
}
}

最后问一下,为什么网上那么难找stc的库文件,我安装了坛友的keil UV5 ,但是没有stc的库。这个能不能改成双路的,一般都有两个灯,一个备用的。
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖提到的人: @金向维
离线ifm

发帖
97
M币
3325
专家
19
粉丝
37
只看该作者 1楼 发表于: 01-09
不知道你所说的库文件指的是像Arduino那种的库,或者是像STM32的HAL库之类的库,还是单片机的头文件?像STM32的HAL库那样的库,据我所知还真的没有,不过STC-ISP软件和STC官方的文档中有例程,对于学过编程的人来说还是比较简单的。如果你说的是头文件,可以这样添加:在STC官网下载最新的STC-ISP软件,选择Keil仿真设置,单击“添加型号和头文件到Keil中,添加STC仿真器驱动到Keil中”就行了。如图
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+30
baihua915 M币 +30 歡迎探討 01-12
离线elecfun

发帖
1331
M币
156
专家
12
粉丝
84
只看该作者 2楼 发表于: 01-10
不知道能不能用,你自己试一下。
先在原第8行sbit Shezhi=P1^2;下增加一个开关的定义

sbit Shezhi2=P1^3;   //增加一个开关
再按以下修改原代码。使用的时候像15PIN一样按下开关进行设置。

if(flag == 1)
{
    if(Shezhi == 0)
    {
        Sector_Erase(0x0000);
        Byte_Program(0x0000, Mazhi[0]);
        Byte_Program(0x0001, Mazhi[1]);
        Byte_Program(0x0002, Mazhi[2]);
    }
    else if(Shezhi2 == 0)
    {
        Sector_Erase(0x0200);
        Byte_Program(0x0200, Mazhi[0]);
        Byte_Program(0x0201, Mazhi[1]);
        Byte_Program(0x0202, 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;
}
本帖最近打赏记录:共1条打赏M币+30
baihua915 M币 +30 歡迎探討 01-12
离线baihua915

发帖
1388
M币
4377
专家
16
粉丝
88
只看该作者 3楼 发表于: 01-11
elecfun:不知道能不能用,你自己试一下。
先在原第8行sbit Shezhi=P1^2;下增加一个开关的定义
sbit Shezhi2=P1^3;   //增加一个开关
再按以下修改原代码。使用的时候像15PIN一样按下开关进行设置。
....... (2018-01-10 23:38) 

好的,今晚就回去修改,多谢指教

内容来自Android手机客户端

离线baihua915

发帖
1388
M币
4377
专家
16
粉丝
88
只看该作者 4楼 发表于: 01-11
elecfun:不知道能不能用,你自己试一下。
先在原第8行sbit Shezhi=P1^2;下增加一个开关的定义
sbit Shezhi2=P1^3;   //增加一个开关
再按以下修改原代码。使用的时候像15PIN一样按下开关进行设置。
....... (2018-01-10 23:38) 

了,正常运作,多谢帮助,顺便问下这个单片机能搞两路这样的控制吗,不同的开关码?

内容来自Android手机客户端

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

发帖
1388
M币
4377
专家
16
粉丝
88
只看该作者 5楼 发表于: 01-12
ifm:不知道你所说的库文件指的是像Arduino那种的库,或者是像STM32的HAL库之类的库,还是单片机的头文件?像STM32的HAL库那样的库,据我所知还真的没有,不过STC-ISP软件和STC官方的文档中有例程,对于学过编程的人来说还是比较简单的。如果你说的是头文件,可以这样添加:在STC官网下 .. (2018-01-09 00:18) 

嗯,搞定了,开始下了ARM的keil,后来下了C51的,按照你的方法添加成功了,多谢

内容来自Android手机客户端

离线elecfun

发帖
1331
M币
156
专家
12
粉丝
84
只看该作者 6楼 发表于: 01-12
sbit LEDChanel = P1^4;  //增加一个开关用于指示当前设置的哪一组,建议用拨动开关或自锁开关
sbit LED2 = P1^5; //增加一个输出控制端口



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;
}

楼主留言:

请再看下最后的程序可不可以

本帖最近打赏记录:共1条打赏M币+30
baihua915 M币 +30 以資鼓勵 01-12
离线baihua915

发帖
1388
M币
4377
专家
16
粉丝
88
只看该作者 7楼 发表于: 01-12
回 elecfun 的帖子
elecfun:sbit LEDChanel = P1^4;  //增加一个开关用于指示当前设置的哪一组,建议用拨动开关或自锁开关
sbit LED2 = P1^5; //增加一个输出控制端口
....... (2018-01-12 01:29) 回 elecfun 的帖子

已下载到单片机,运行正常就是少了位手动开关的,也就是第二组的手动开关没有设置,第一组正常,还要加多一个IO对第二组进行手动开关控制,麻烦了,就差一点了
离线baihua915

发帖
1388
M币
4377
专家
16
粉丝
88
只看该作者 8楼 发表于: 01-13
回 elecfun 的帖子
elecfun:sbit LEDChanel = P1^4;  //增加一个开关用于指示当前设置的哪一组,建议用拨动开关或自锁开关
sbit LED2 = P1^5; //增加一个输出控制端口
....... (2018-01-12 01:29) 回 elecfun 的帖子

这个是主程序,kaiguan位第一组的手动控制IO,需增加第二组的手动控制,请再帮一下,多谢

void main (void)
{
bit y,z;
Yaokong_init();
while(1)
{
  y=Kaiguan;
  delay(50);
  z=Kaiguan;
  if(y!=z)
  LED=~LED;
}
}
离线baihua915

发帖
1388
M币
4377
专家
16
粉丝
88
只看该作者 9楼 发表于: 01-13
回 elecfun 的帖子
elecfun:sbit LEDChanel = P1^4;  //增加一个开关用于指示当前设置的哪一组,建议用拨动开关或自锁开关
sbit LED2 = P1^5; //增加一个输出控制端口
....... (2018-01-12 01:29) 回 elecfun 的帖子

void main (void)
{
bit y,z;
bit y1,z1;
Yaokong_init();
while(1)
{
  y=Kaiguan;
    y1=Kaiguan1;
  delay(50);
  z=Kaiguan;
    z1=Kaiguan1;
  if(y!=z)
  LED=~LED;
    if(y1!=z1)
    LED2=~LED2;
}
}

这样改行不行,好像可以正常工作,就是不知道有没有什么bug?
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个