slzm40 发表于 2012-7-25 23:44:30

关于单片机开发板学习题目收集

本帖最后由 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;//纯中断法
#defineIR_state_first 0
#defineIR_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方式1T0方式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;
        if(IR_OK)
        {
        IR_OK=0;
        IRCOM=IR_getcode1&0xff;
        IRCOM=(IR_getcode1>>8)&0xff;
        if (IRCOM!=~IRCOM) return;
       
        IRCOM=IR_getcode2&0xff;
        IRCOM=(IR_getcode2>>8)&0xff;
        if (IRCOM!=~IRCOM) return;
            switch(IRCOM)
                  {}
                }
页: [1]
查看完整版本: 关于单片机开发板学习题目收集