使用STC单片机的编码器------有20元话费送
硬件电路图参见图片。要实现的功能为:按下对应的按键后OUT端输出对应的编码;未按下按键时OUT输出为低。图中单个脉冲的宽度为415微秒,误差不超过10微秒。
具体要求:
1、使用c语言编写以便修改;
2、有清晰明了的中文注释;
3、有完整的keil工程文件及可供烧录的hex;
4、按键不要消抖处理,发完对应的编码后循环傻等即可;
5、请在编写的C程序中注明晶振频率及需要充值的电话号码;
6、按键的编码请参见附件;
7、检查验证程序无误后2天内兑现;
这个悬赏任务权当51单片机的编程练习题了,只能兑现给一位解答无误的朋友。
{:titter:}20元!
亮点! 这个是模拟红外编码? MCU的时钟频率能达到的话,实现这个功能不难吧?
LZ做毕设? 在按键未抬起期间是一直发送编码还是只发送一次? 这是商业用的产品。
20元。
好多钱哦。
{:loveliness:} 做电工吧.你看好多钱啊.快来抢啊 hehe,编码发送的部分可以参照stc官网上的io模拟串口例程,复制下来稍加修改就可以了。熟悉stc单片机的,大概只需编写50多行代码就可以完成。延时函数可以用单片机精灵或stc烧写软件附带的小软件生成,不需要你去费脑子计算或编写。
当然,你用定时器的自动装载模式去做也可以。只要实现目标,不在乎你的手段。 快来抢话费啊,好多钱啊! 1、使用c语言编写以便修改;
2、有清晰明了的中文注释;
3、有完整的keil工程文件及可供烧录的hex;
4、按键不要消抖处理,发完对应的编码后循环傻等即可;
5、请在编写的C程序中注明晶振频率及需要充值的电话号码;
6、按键的编码请参见附件;
7、检查验证程序无误后2天内兑现;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
任何一条都不止20元。
兄弟,别把市场搞乱了。 15系列的专用工具,就有不产例子 {:titter:} 兄弟,求助可以,别人会告诉你方法,你自己实现。
想用20块话费买东西,那结果只有………… 这个是我家MD机遥控器上用的。由于太古老,配不到新的,按键磨损太厉害了。用个自学型的遥控器替代也行,只是按键太多,眼花缭乱的不方便操作。自己做个电路板装在原遥控器外壳上替代更好一些。 呵呵,如果你认为要2000元才能去做的话,我也不会为了这么个小东西付那么大的代价。{:smile:} 我认为LZ是做产品,你看描述的那么清楚还能弄不出来? 供参考:
#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;
}
} 嗯,看来送话费太少已经引起大神们的公愤了。{: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();
}
}
} 难度在10US的误差,建议用自动重载的定时器来做,另外,把编码放到IDATA里面取出时快点,也能节约时间。
页:
[1]