xpxp 发表于 2012-10-26 13:53:40

使用STC单片机的编码器------有20元话费送

      硬件电路图参见图片。要实现的功能为:按下对应的按键后OUT端输出对应的编码;未按下按键时OUT输出为低。
   图中单个脉冲的宽度为415微秒,误差不超过10微秒。
   具体要求:
         1、使用c语言编写以便修改;
         2、有清晰明了的中文注释;
         3、有完整的keil工程文件及可供烧录的hex;
         4、按键不要消抖处理,发完对应的编码后循环傻等即可;
         5、请在编写的C程序中注明晶振频率及需要充值的电话号码;
         6、按键的编码请参见附件;
         7、检查验证程序无误后2天内兑现;
   这个悬赏任务权当51单片机的编程练习题了,只能兑现给一位解答无误的朋友。



         
         

wkman 发表于 2012-10-26 14:35:10

{:titter:}20元!

亮点!

renwocai 发表于 2012-10-26 14:54:33

这个是模拟红外编码?

techbaby 发表于 2012-10-26 15:00:04

MCU的时钟频率能达到的话,实现这个功能不难吧?

LZ做毕设?

renwocai 发表于 2012-10-26 15:16:53

在按键未抬起期间是一直发送编码还是只发送一次?

tbkmcjl 发表于 2012-10-26 15:19:56

这是商业用的产品。
20元。
好多钱哦。
{:loveliness:}

zhikai_wu 发表于 2012-10-26 15:25:53

做电工吧.你看好多钱啊.快来抢啊

xpxp 发表于 2012-10-26 16:03:56

    hehe,编码发送的部分可以参照stc官网上的io模拟串口例程,复制下来稍加修改就可以了。熟悉stc单片机的,大概只需编写50多行代码就可以完成。延时函数可以用单片机精灵或stc烧写软件附带的小软件生成,不需要你去费脑子计算或编写。
当然,你用定时器的自动装载模式去做也可以。只要实现目标,不在乎你的手段。

michael.yang 发表于 2012-10-26 16:25:01

快来抢话费啊,好多钱啊!

Excellence 发表于 2012-10-26 16:26:20

1、使用c语言编写以便修改;
         2、有清晰明了的中文注释;
         3、有完整的keil工程文件及可供烧录的hex;
         4、按键不要消抖处理,发完对应的编码后循环傻等即可;
         5、请在编写的C程序中注明晶振频率及需要充值的电话号码;
         6、按键的编码请参见附件;
         7、检查验证程序无误后2天内兑现;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
任何一条都不止20元。
兄弟,别把市场搞乱了。

devcang 发表于 2012-10-26 16:27:05

15系列的专用工具,就有不产例子       {:titter:}

tsb0574 发表于 2012-10-26 16:29:42

兄弟,求助可以,别人会告诉你方法,你自己实现。

想用20块话费买东西,那结果只有…………

xpxp 发表于 2012-10-26 16:31:05

    这个是我家MD机遥控器上用的。由于太古老,配不到新的,按键磨损太厉害了。用个自学型的遥控器替代也行,只是按键太多,眼花缭乱的不方便操作。自己做个电路板装在原遥控器外壳上替代更好一些。

xpxp 发表于 2012-10-26 16:33:51

呵呵,如果你认为要2000元才能去做的话,我也不会为了这么个小东西付那么大的代价。{:smile:}

HeP028 发表于 2012-10-26 16:42:11

我认为LZ是做产品,你看描述的那么清楚还能弄不出来?

renwocai 发表于 2012-10-26 13:53:41

供参考:


#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

#define FOSC 12000000L

#define T1US (65536-(415*FOSC)/1000000)      //1T模式
//#define T1US (65536-(415*FOSC)/12/1000000) //12T模式

sfr AUXR = 0x8e;                  //Auxiliary register
sbit P30 = P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P35=P3^5;

BYTE KEY=0;
BYTE code keyA={0X80,0X50,0X0B,0XE4,0X77,0XC8,0XF9,0XB3,0XED,0XE4,0XF2,0XBF,0X93,0XE4,0X50,0X71,0XCF,0XFD,0XFF,0XB7,0XE7,0X1C,0XEB,0XD7,0XF2,0X4F,0X79,0X4F,0XB9,0X27,0XBF,0XF7,0XFE,0XFF,0XDF,0XFB,0X27};
BYTE code keyB={0X80,0X50,0X0B,0XE4,0X77,0XCE,0XBD,0XB3,0XED,0XE4,0XF2,0XBF,0X93,0XE4,0X50,0X76,0XEF,0XFD,0XFF,0XB7,0XE7,0X6E,0XEB,0XD7,0XF2,0X4F,0X79,0X4F,0XFD,0X27,0XBF,0XF7,0XFE,0XFF,0XDF,0XFA,0XD6};
BYTE code keyC={0X80,0X50,0X0B,0XE4,0X77,0XCF,0X9D,0XB3,0XED,0XE4,0XF2,0XBF,0X93,0XE4,0X50,0X54,0XEF,0XFD,0XFF,0XB7,0XE5,0X4E,0XEB,0XD7,0XF2,0X4F,0X79,0X4F,0XFD,0X27,0XBF,0XF7,0XFE,0XFF,0XDF,0XFA,0X51};
BYTE code keyD={0X80,0X50,0X0B,0XE4,0X77,0XE4,0XED,0XB3,0XED,0XE4,0XF2,0XBF,0X93,0XE4,0X50,0X40,0XEF,0XFD,0XFF,0XB7,0XE4,0X0E,0XEB,0XD7,0XF2,0X4F,0X79,0X4F,0XFD,0X27,0XBF,0XF7,0XFE,0XFF,0XDF,0XFB,0X39};

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    static WORD temp=0,temp1=0,keytemp;
    switch (KEY)
        {
                case 1:
                        {   
                                if(temp1==0)
                          keytemp=keyA;
                          keytemp<<=1;
                          P33=CY;
                         
                          if(temp1++==8)
                                {
                                        temp1=0;
                                        if(temp++==38)
                                        temp=0;
                                        KEY=0;       
                                }
                         
                        };        break;
                case 2:
                        {   
                                if(temp1==0)
                          keytemp=keyB;
                          keytemp<<=1;
                          P33=CY;
                         
                          if(temp1++==8)
                                {
                                        temp1=0;
                                        if(temp++==38)
                                        temp=0;
                                        KEY=0;       
                                }
                         
                        };        break;
                        case 3:
                        {   
                                if(temp1==0)
                          keytemp=keyC;
                          keytemp<<=1;
                          P33=CY;
                         
                          if(temp1++==8)
                                {
                                        temp1=0;
                                        if(temp++==38)
                                        temp=0;
                                        KEY=0;       
                                }
                         
                        };        break;
                        case 4:
                        {   
                                if(temp1==0)
                          keytemp=keyD;
                          keytemp<<=1;
                          P33=CY;
                         
                          if(temp1++==8)
                                {
                                        temp1=0;
                                        if(temp++==38)
                                        temp=0;
                                        KEY=0;       
                                }
                         
                        };        break;

                default:        break;
        }

}

//-----------------------------------------------

/* main program */
void main()
{
    AUXR |= 0x80;                       //定时器0为1T模式
//AUXR &= 0x7f;                        //定时器0为12T模式

    TMOD = 0x00;                  //设置定时器为模式0(16位自动重装载)
    TL0 = T1US;                     //初始化计时值
    TH0 = T1US >> 8;
    TR0 = 1;                        //定时器0开始计时
    ET0 = 1;                        //使能定时器0中断
    EA = 1;

    while (1)
        {
                   P30=1;
                   P31=1;
                   P32=1;
                   P33=1;
                   P35=1;
                   if(P30==0)
                                   KEY=1;
                           else if(P31==0)
                                   KEY=2;
                           else if(P32==0)
                                   KEY=3;
                           else if(P35==0)
                                   KEY=4;
                                  
        }
}

xpxp 发表于 2012-10-26 18:46:48

   嗯,看来送话费太少已经引起大神们的公愤了。{:lol:}
   谢谢楼上renwocai朋友的解答,已经解决这个问题。回头请留下电话号码,2天内帮你充值,这也是我的小小心意,也是设置悬赏的目的,请务必笑纳,不然以后设置悬赏就没有意思了。{:smile:}
    我最近头晕脑胀,至少2年没有写过程序。当然以前写的一些简单代码也是边学边写,算是现炒现卖的那种,纯属业余好玩。
   没办法,如果没有其他朋友帮忙,我自己也是要解决这个问题的。刚才翻看了一些STC的一些例程,自己糊弄写了一段用于验证单个按键的代码。还没经过实际的测试,贴上来算是给自己打打气。不怕别人笑话~~{:lol:}
//建伍MD机遥控器编码
// 使用stc15f104e,晶振12mhz
//使用P33口输出
//电话号码:139077041***
#include <stc15f104e.h>
#include "intrins.h"
#define uchar unsigned char
void Delay415us(void);                //415微秒延时函数
void Send(void);         //发送编码函数
uchar code keyA={0X80,0X50,0X0B,0X2E,0X77,0XC8,0XF9,0XB3,
                  0X2F,0XE4,0XF2,0XBF,0X93,0XCB,0X7E,0X71,
                                                  0XCF,0XFD,0XFF,0XB7,0XE7,0X1C,0XEB,0XD7,
                                                  0XF2,0X4F,0X79,0X4F,0XB9,0X27,0XBF,0XF7,
                                                  0XFE,0XFF,0XDF,0XFB,0X27};
//---------程序开始-----------
void main(void)
{
   _nop_();
   _nop_();
        while(1)
        {
   if(P30==0)
          {
                Send();
      }
          P33=0;
    }
}
//------------程序结束-------
void Delay415us()                //@12.000MHz晶振频率下的延时函数,由STC软件生成
{
        unsigned char i, j;
        _nop_();
        _nop_();
        i = 5;
        j = 212;
        do
        {
                while (--j);
        } while (--i);
}
void Send()            //发送编码函数,由STC例程改写
{
        uchar a,b,c;
        for(a=0;a<37;a++)    //循环发送37字节数据
        {
          c=keyA;
          for(b=0;b<8;b++)//循环发送一字节8位数据
          {
          if(c&1)P33=1;
          else P33=0;
          c>>=1;
          Delay415us();
           }
       }
}

renwocai 发表于 2012-10-28 07:54:38

难度在10US的误差,建议用自动重载的定时器来做,另外,把编码放到IDATA里面取出时快点,也能节约时间。
页: [1]
查看完整版本: 使用STC单片机的编码器------有20元话费送