最近学习单片机就没有以前那么快了,难度越来越大,程序越来越复杂,需要的技巧越来越多。有些东西真的只有在理解的基础上背下来才行,只理解即使懂了也不会运用,只背那就更不行了,这两者都有同时进行。所以需要更大的决心来面对这一切,不能半途而废。
这几天的学习主要总结了一下几点: 一、就是步进电机的驱动,在接触之前我以为步进电机只要给电就能转动,接触之后才发现这是不可能的,里面需要做很多的工作。如28BYJ-48型步进电机是四相八拍的步进电机,它的控制顺序(反向就是反着读)为: 
二、在程序里面,定时器的部分。当我们需要确定的值的时候,我们就可以直接对TH,TL进行赋值,但有的时候不知道赋值多少,因为是变动的,就需要根据自己需要的时间来进行赋值,例程如下: void ConfigTimer0(unsigned int ms){ unsigned long tmp; tmp=11059200/12; //定时器计数频率 tmp=(tmp*ms)/1000;// 定时xms时间需要的计数值 tmp=65536-tmp;// 需要装载的计数初值 tmp=tmp+18; //补偿中断响应延时造成的误差 T0RH=(unsigned char)(tmp<<8); //定时器重载值拆分为高低字节 T0RL=(unsigned char)tmp; TMOD&=0xF0; //清零 T0 的控制位 TMOD|=0x01; 配置 T0 为模式 1 TH0=T0RH; //加载 T0 重载值 TL0=T0RL; ET0=1; TR0=1;}三、数码管扫描函数算法改进 以前的 函数形式为; switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break; default: break; } 改变后的函数形式: P1 = (P1 & 0xF8) | i; P0 = LedBuff; if (i < 5) i++; else i = 0; 其中,ADDR0,ADDR1,ADDR2是连在P1口的第三位,通过P1 = (P1 & 0xF8) | i;就可以直接改变第三位的值,所以非常简便。 四、就是程序的模块化,把各种功能的程序分别写成独立的模块,然后在需要的程序里面进行调用,这样可以让程序看起来更加的简单清晰,也便于后面的维护。 总之,写程序真不是一件容易的事情,不仅需要足够严谨的逻辑思维,还需要足够的细心,在程序的编写中可能一个小错误就可能导致得不到想要的结果,这种问题是经常遇到的。不过也要尽力去解决这些问题,增加自己的经验,遇到什么样的问题就可以直接对症下药,而不是丈二的和尚,摸不着头脑,什么都不知道。
|