找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2947|回复: 4
打印 上一主题 下一主题
收起左侧

单片机学习随笔

[复制链接]
跳转到指定楼层
楼主
ID:51088 发表于 2014-8-27 01:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


最近一直在学习单片机。单片机的学习主要通过软件和硬件两个方面学习,软件和硬件之间又是紧密联系在一起的。软件的编写需要联系硬件的电路来进行,而硬件也需要软件来控制。

开始没有意识到硬件电路的重要性,我就想我明明驱动的是LED灯点亮,为什么亮的却是数码管,而数码管也只亮了8个里面的其中一个。当时也只是看着视频里的一步步的来,视频里用的开发板和我用的不太一样,但我又不会变通,完全忽视电路的重要性,没有去好好研究。后来无意中看到电路板上有个地方需要用跳线帽来选择电路,这就驱使我更加注重对电路的分析。

通过这段时间的接触,我发现要想学好这些东西C语言相当重要,虽然我有一定的C语言基础,但是和实际相结合起来完全不知道怎么用,而且还有很多C语言的巧妙运用。比如通过for循环来延时一定的时间,通过while循环来得到死循环,如何使用单片机的定时器,如何进行中断的使用,如何消除按键的抖动,如何进行程序的调用使程序更加的简介清晰,如何进行扫描和动态刷新等等。每一样东西都不是那么容易学到手的,因为有的东西不是那么容易理解,即使能够理解时间长了也通容易遗忘。所以需要我们不断的练习,不断地思考,甚至于把一些东西都牢记下来,这样时间长了才会变成自己的东西,才能够学以致用融会贯,甚至去创新。

接下来要学的东西还有很多,需要我不断地思考,不断地练习,甚至是不断地鹦鹉学舌。要思考就要不断的向自己问各种各样的问题。

明天的问题:

1、  如何用16个按键分别在数码管显示0-F这16个数字?

2、  怎么编一个简易加法器?

3、  如何控制电机转一定的转数?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:51088 发表于 2014-8-27 14:02 | 只看该作者
最近学习单片机就没有以前那么快了,难度越来越大,程序越来越复杂,需要的技巧越来越多。有些东西真的只有在理解的基础上背下来才行,只理解即使懂了也不会运用,只背那就更不行了,这两者都有同时进行。所以需要更大的决心来面对这一切,不能半途而废。

       这几天的学习主要总结了一下几点:
       一、就是步进电机的驱动,在接触之前我以为步进电机只要给电就能转动,接触之后才发现这是不可能的,里面需要做很多的工作。如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;就可以直接改变第三位的值,所以非常简便。
       四、就是程序的模块化,把各种功能的程序分别写成独立的模块,然后在需要的程序里面进行调用,这样可以让程序看起来更加的简单清晰,也便于后面的维护。
       总之,写程序真不是一件容易的事情,不仅需要足够严谨的逻辑思维,还需要足够的细心,在程序的编写中可能一个小错误就可能导致得不到想要的结果,这种问题是经常遇到的。不过也要尽力去解决这些问题,增加自己的经验,遇到什么样的问题就可以直接对症下药,而不是丈二的和尚,摸不着头脑,什么都不知道。

回复

使用道具 举报

板凳
ID:65516 发表于 2014-8-27 18:45 | 只看该作者
多谢楼主的分享,很好用自学笔记
回复

使用道具 举报

地板
ID:65519 发表于 2014-8-27 20:32 | 只看该作者
加油加加油加加油加加油加
回复

使用道具 举报

5#
ID:64075 发表于 2014-8-28 13:07 | 只看该作者
加油加加油加加油加加油加
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表