日志档案

发表于 2006-10-27 23:08:20

39

标签: 单片机  数字电路  CPU  PCB  C  

单片机应用如何入门

单片机应用如何入门

作者:peter8888?>

摘要:本文从硬件和软件方面阐述了想从事单片机开发如何入门的问题。希望能给那些想入门而未入门的人员一些启发,少走弯路,尽快能够进行单片机应用设计和开发。

关键词 :单片机 数字电路 CPU PCB C++

引言

        现在这个时代可以说是网络的时代。各种电子产品、高科技技术充斥整个人类的生活。由电阻、电容、二极管、三极管、集成电路构成的各种产品与人们的生活息息相关,可以说人类离不开这些电子产品。

    电子产品的开发也是空前的兴旺。越来越多的人员加入到这个开发队伍。还有很多正在朝着这方面努力。单片机的应用在电子产品中占有很大的份额,单片机应用工程师所占比例也不小。那么怎样才能登堂入室,步入单片机应用的大门呢?下面将从硬件和软件方面加以阐述。

1 单片机应用之硬件设计和开发

1.1硬件设计和开发

如果要从事单片机应用的硬件设计和开发,那么你必须具备以下几个方面的基础或正在做这方面的准备。

1)          脉冲电路知识

在短暂时间内作用于电路的电压或电流,统称为脉冲信号。广义讲,凡按照非正弦规律变化的带有突变特点的电压或电流,都可称之为脉冲。数字化的电路是与脉冲电路紧密联系的。因此需要熟悉和具有脉冲电路的知识。

2)          数字电路基础

能够理解十进制、二进制、八进制、十六进制及其间的相互转化。研究数字电路(也称逻辑电路)的数学工具是逻辑代数。那么就应该熟悉在逻辑代数中的三种基本逻辑运算“与”、“或”、“非”。

逻辑门电路、组合逻辑电路(如半加器、全加器、编码器、译码器等、时序逻辑电路(如触发器[从结构上分为基本触发器、钟控触发器、维持阻塞触发器、主从触发器、边沿触发器]、寄存器、二进制计数器、十进制计数器等)也需要有所了解。

3)          单片机相关知识

单片机也称CPUMCUCPU就是Central Processing Unit的缩写,MCUMicro Control Unit的缩写。这可以从最简单的51系列单片机着手,当然也可以买些单片机方面的参考书。了解单片机的资源,包括寻址方式、时钟、结构、存储器、中断、堆栈、总线、IO口、ADCUART等及其应用。

4)          原理图及PCB设计

    原理图及PCB设计可以参考我的另一篇文章《PCB绘制如何入门》,在此不再赘诉。

    有了以上几方面的准备,相信你就可以开始单片机应用的硬件设计了。其实实践是非常重要的。如果有机会多做些设计和调试,并且多学习别人的设计,通过实践不断总结经验教训,相信你很快就能在单片机应用的硬件设计中游刃有余。

2单片机应用之软件设计和开发

2.1单片机相关知识

    除具有上面所描述的单片相关基础知识外,必须对单片机的各寄存器配置、中断使用、端口等控制了如指掌。

2.2 单片机开发的语言准备

早几年大家都直接用汇编语言开发单片机程序。随着单片机厂家推出支持c语言开发的环境,和整个单片机开发环境的发展,现在使用c语言来开发单片机程序比较普遍,当然最基础的部分还用汇编语言来写。

所以起码要能用c语言编写程序。当然能用汇编编写关键程序或对时间精度要求比较高的程序就更好。

现在的嵌入式编程还使用c++语言。

2.3 数据结构方面的知识

 在开发程序过程中经常会用到一些算法。如堆栈、队列、排序等算法。这就要求开发人员具有数据结构方面的知识。可以买些这方面的书籍进行学习或在网上寻找一些这方面的资料。

如果你具有本章所述几方面的知识,那么你编写单片机方面的程序应该不成问题。通过一段时间的实践和学习别人的程序,那么很快你就会得心应手了。

结语

    在看完这篇文章之后,你应该对单片机应用设计和开发入门有一个了解了。如果你具有第一章方面的基础,那么你可以进行单片机应用的硬件设计了。如果你具有第二章方面的基础,那么你可以进行单片机应用的软件设计了。如果你具有第一、二章两方面的基础,那么你可以进行单片机应用的软、硬件设计了;同时恭喜你,你将是单片机应用设计和开发的全才。

参考文献

[1] 脉冲数字电路(修订本) 郭桂芬 郭建华

系统分类: 单片机   |   用户分类: 单片机应用与编程   |   来源: 原创   |   【推荐给朋友】

    阅读(1829)    回复(6)  

投一票您将和博主都有获奖机会!

  • zhaohuill

    2006-11-1 17:15:21

    我对硬件略懂一些,在看一些别人写的软件时,搞不懂增加的一些常量、初始值是怎么得来的,位移方面的知识也似懂非懂,例如:

    void Int0_Service(void) interrupt 0
    {
     unsigned char i,j;
        unsigned char Temp1 = 0x80;
        unsigned char Temp0 = 0x7F;
     unsigned char Xray_Data = 0x00;

        EA = 0;
      Delay0R1ms(6984);//8.8ms
     if(IR_Rec == 0)
     {
      Run_Flag1 = 1;
     }
      Delay0R1ms(3889);//4.5ms
     if(IR_Rec == 0)
     {
      Run_Flag2 = 1;
     }

        if ((Run_Flag1 == 1)&&(Run_Flag2 == 1))    //引导码正确,开始进行数据的记录阶段                             
        {
             do
      {
            }while(IR_Rec==0);                      //等到第一个高电平,开始接受数据
      for(j="0";j<4;j++)
            {
       for(i="0";i<8;i++)
       {
        Delay0R1ms(730);//0.9ms
              if(!IR_Rec) //数据代码为"0"                     
        {
         Xray_Data = Xray_Data&Temp0;
        }
        else //数据代码为"1"
        {
         Xray_Data = Xray_Data|Temp1;
         Delay0R1ms(730);//0.9ms
        }
      
        Temp0 = ((Temp0>>1)|0x80);
        Temp1 = (Temp1>>1);
        P1 = ~P1;
        do
        {
              }while(IR_Rec==0);                           //等到下一个高电平,继续接收数据
       }
       IR_Decoder[j]=Xray_Data;
          Temp1 = 0x80;
          Temp0 = 0x7F;
       Xray_Data = 0x00;
            }
      for(j="0";j<4;j++)//
            {
          Send_Byte(IR_Decoder[j]);
      }

      X_Ray_Flag = 1;
      Run_Flag1 = 0;
      Run_Flag2 = 0;
       }

        EA = 1;
    }

    上面的unsigned char Temp1 = 0x80;
        unsigned char Temp0 = 0x7F和Xray_Data = Xray_Data&Temp0;
    怎么理解?

  • zhaohuill

    2006-11-1 17:17:25

    上段程序是HT6221红外线中断解码程序,请斑竹看看有没问题?提提建议,谢谢!

  • peter8888

    2006-11-2 9:22:32

    个人觉得你这个程序有重大问题,且问题较多。有以下几个方面:

    1、中断处理程序中直接延时是程序设计所忌讳的。

    2、程序中没有出错处理,下列语句中IR_Rec如果一直为低,程序将死在中断里。

    do
    {
    }while(IR_Rec==0);                      //等到第一个高电平,开始接受数据
    3、for(j="0";j<4;j++)中,j初始值为字符0,而比较时与数字4比较,根本就不能执行FOR循环。不知你的本意是什么?我想应该为:for(j="0";j<4;j++)。类似的for循环还有几句。

    4、初始值是根据程序和数据需要设置的。多看看HT6221手册。


     

  • zhaohuill

    2006-11-3 14:02:15

    谢谢回复,受益非浅!

  • zhaohuill

    2006-11-2 17:21:44

    首先谢谢答复!

    在请问:

    1:“中断处理程序中直接延时是程序设计所忌讳的”,请问:如果采用了,有什么严重后果?

    2:对“do
    {
    }while(IR_Rec==0);  这句怎样采用出错方式,这方面我还没有概念!

    3:“for(j="0";j<4;j++)”这句复制时不知什么原因在0处添加了双引号,原本没有,谢谢指正!

    再次感谢!

     

  • peter8888

    2006-11-2 18:05:56

    1、中断处理程序中直接延时那么中断处理时间就会过长。如果中断较多,别的对时间要求较高的中断就会受到影响。中断处理时间越短越好,尽量把事情放在中断外来处理。

    2、如果是定时器中断里面再延时,并且延时时间跟跟中断定时时间相近或更大,那么程序就会一直执行中断,别的事情就没法干了。

    3、对do{}while(IR_Rec==0);  语句采取出错处理就是让它在多长时间没检测到IR_Rec变高就退出。而不至于在这里死循环。

    4、for(j="0";j<4;j++)是拷贝有这个问题。

    应该是:for( j = 0 ; j<4; j++)