|
本帖最后由 slzm40 于 2012-7-25 23:51 编辑
三个月前一些偶然原因,喜的欢上单片机软件编程,个人兴趣,自己买了一套51开发板,一套STM32开发板,STM32一直比较闲置,在51没有基本熟练运用情况下,不敢贸然学习STM32,一般学习都要所谓的环境,人不逼自己一把,总是感觉不到自己的优秀。
在学习开发板提供的例程,会感觉到例程的一些不足,或不符合在产品化当中,或有一些可能实时性不够好,或有一些只是简单例程,但每一个学习完这些例程的朋友,总想找个提高的方法和方向,比如说我,总是想找提高的方法,高手一般的回答就是多做项目,但做为新手,作为只把这个当兴趣的新手,题目太难找了,更难找符合自己开发板的更是难上加难。
现在手头上有一套开发板,此开发板有一些模块功能, 按键模块,LED模块,数码管模块,LCD1602显示模块(12864或TFT屏),鸣蜂器,继电器,DS1302模块,遥控接书头,DS18B20,MAX232(与PC通信),485,24C02,555模块,AD/DA模块,USB接口,还有SD卡接口,还有电机驱动模块(直流电机和步进电机),其它是一些辅助芯片,74HC138译码器,锁存芯片,最主要是最小系统板是必须的。
于是想收集一些可以做题目或者做简单项目,器件容易买到的,能焊在面包板上搞的,都可以。 望有高手不吝啬自己的想法,帮忙想几个题目,以备和想提高的朋友去实现,去练习。
我现在在学做的一个是直流电机PWM控速。 给定定值速度,还可用5个按键控制电机的停止,加速,减速,正转,反转,并显示速度等参数(LCD1602,数码管或12864,TFT都行),把一些重要数据存入24C02,开机自动将电机速度至于上次关机时的速度,通过AD采集直流电机的电压,这里模拟测速电动机(测速传感器)的功能,具体实现可能用替代方法。 将相关速度通过UART传至上位机,(上位机编程MFC不会,有待学习) 上位机可以设定给定速度值传至下位机,用的调速方法是PID的方法, 可能会加入遥控器, 鸣蜂器,和时间显示等。
剩下的就是补充自己的不足,学习再学习了。
想想开始学遥控,各种不懂,于是自己照人家,学了适合自己的解码,当然其中,没有写识别长按连击的解码,可能还有许多BUG需要以后学习中改进。
就随手发一下,用的是定时器0,开GATE门,中断零的方法。
sbit IR_OUT=P3^2;//纯中断法
#define IR_state_first 0
#define IR_state_init 1
#define IR_state_exp 2
//#define IR_state_lf 3
uchar IR_state=IR_state_first;
uint IR_getcode1;
uint IR_getcode2;
uchar IR_TICK;
void TIMER0Init()
{
TMOD|=0X19;//T1方式1 T0方式1 开启GATE
TH0=0;
TL0=0;
TH1=(65536-systemclock/time_task_sec/12)/256;
TL1=(65536-systemclock/time_task_sec/12)%256;
IE|=0X8A;//EA=1;ET0=1;
TR1=1;//OPEN TIME1
}
void IRInit()
{
IE|=0X81;//EA=1;EX0=1;
IP|=0X01;//INTO is high Priority
IT0=1;//外部中断0边沿触发方式
}
void IReremot_INT0() interrupt I NTERRUPT_INT0
{
uint IR_recode;
TR0=0;
IR_recode=(TH0<<8)|TL0;
TH0=0;
TL0=0;
TR0=1;
switch(IR_state)
{
case IR_state_first:
{ IRdelay(14);//去抖动
if(IR_OUT) TR0=0;
else IR_state=IR_state_init; //第一次进中断,进入引导码
break;
}
case IR_state_init:
{
if(IR_recode>0X1194-0X64&&IR_recode<0X1194+0X64) //引导码4.5ms
{
IR_TICK=0;
IR_getcode1=0;
IR_getcode2=0;
IR_state=IR_state_exp;
}
else {TR0=0;IR_state=IR_state_first;}//误码退出
break;
}
case IR_state_exp:
{
IR_TICK++;
if(IR_recode>0x0235-0x64&&IR_recode<0x0235+0x64)
{
if(IR_TICK<17) IR_getcode1=(IR_getcode1>>1)|0x0000;
else IR_getcode2=(IR_getcode2>>1)|0x0000;
}
else if(IR_recode>0x069a-0x64&&IR_recode<0x069a+0x64)
{
if(IR_TICK<17) IR_getcode1=(IR_getcode1>>1)|0x8000;
else IR_getcode2=(IR_getcode2>>1)|0x8000;
}
else
{
TR0=0;
IR_getcode1=0;
IR_getcode2=0;
IR_state=IR_state_first;
}
if(IR_TICK==32)
{
IR_OK=1;
IR_state=IR_state_first;
}
break;
}
//case IR_state_lf: //长按连码预留。
// break;
}
}
主程序解码段:
uchar IRCOM[4];
if(IR_OK)
{
IR_OK=0;
IRCOM[0]=IR_getcode1&0xff;
IRCOM[1]=(IR_getcode1>>8)&0xff;
if (IRCOM[0]!=~IRCOM[1]) return;
IRCOM[2]=IR_getcode2&0xff;
IRCOM[3]=(IR_getcode2>>8)&0xff;
if (IRCOM[2]!=~IRCOM[3]) return;
switch(IRCOM[2])
{}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|