原创 单片机应用如何入门

2006-10-27 23:08 5523 8 14 分类: MCU/ 嵌入式

单片机应用如何入门


作者:peter8888<? target="xml" content="namespace prefix = o ns = \"urn:schemas-microsoft-com:office:office\" /"/>?>


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


关键词 :单片机 数字电路 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] 脉冲数字电路(修订本) 郭桂芬 郭建华


PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户1133385 2006-11-3 14:02

谢谢回复,受益非浅!

用户1378541 2006-11-2 18:05

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

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

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

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

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

用户1133385 2006-11-2 17:21

首先谢谢答复!

在请问:

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

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

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

再次感谢!

 

用户1378541 2006-11-2 09:22

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

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手册。


 

用户1133385 2006-11-1 17:17

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

用户1133385 2006-11-1 17:15

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

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;
怎么理解?

相关推荐阅读
用户1378541 2012-05-24 15:01
wince驱动分类之思维导图
最近用思维导图对wince驱动分类及架构进行了整理。以方便记忆并备忘。   ...
用户1378541 2010-02-04 14:03
s3c2410用vivi通过USB下载yaffs文件系统成功,速度是相当的快
s3c2410用vivi通过USB下载yaffs文件系统成功,速度是相当的快。         经过几天来的摸索,通过强大的GOOGLE搜索功能,不断的实验和调试,终于成功解决了s3c2410利用在v...
用户1378541 2009-12-17 17:20
发帖庆贺,终于搞掂VIVI下通过串口烧写yaffs文件系统
发帖庆贺,终于搞掂VIVI下通过串口烧写yaffs文件系统,非常高兴。...
用户1378541 2009-12-17 17:16
发帖庆贺,通过仿真器在SDRAM运行程序烧写bootloader
      终于搞掂通过仿真器、ADS、axd debugger在SDRAM运行一段程序烧写bootloader,非常开心。...
用户1378541 2009-12-17 17:16
发帖庆贺,搞掂vivi下的tftp下载文件
发帖庆贺,搞掂vivi下的tftp下载文件。...
用户1378541 2009-12-17 17:10
很久没来写blog,转眼就一年多了
很久没来写blog,转眼就一年多了。...
我要评论
6
8
关闭 站长推荐上一条 /3 下一条