您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制51系列单片机(C语言)入门方法 正文
51系列单片机(C语言)入门方法

51系列单片机(C语言)入门方法

点击数:7828 次   录入时间:03-04 12:03:42   整理:http://www.55dianzi.com   电脑-单片机-自动控制



www.55dianzi.com

  一般情况下,为了计算或取码的方便,把a~dp依次接到单片机某个口上,即Px.O—Px.7上。其中,x表示O、l、2、3中的一个。这样,只要给某个口赋—Al值,则相应的LED段就被点亮,但是,在硬件连接上要注意:有时早期的单片机可能不能直接驱动LED,所以需要通过控制三极管的导通或截止,来控制LED的亮与灭。
  
  如果把共阴数码管的a—dp,依次接到单片机的PO.O~P0.7上,注意:PO口需接上拉电阻。何为上拉电阻,简单的说,就是把电平拉高,以提高驱动能力。比如:
  
  PO=OX3F;则显示数字0。因为OX3F即为二进制的00111111,低位往高位数,依次为1111Il00.其I/O口电平分别为高、高、高、高、高、高、低、低,即对应的a~dp为亮、亮、亮、亮、亮、亮、灭、灭,由图3可以看出,g和dp段不亮,其余段均亮,即为所看到的数字O字样。同理可以得到其他数字或字符。有人会问.那么每次取一个字模不是很麻烦?还要自己考虑高低电平什么的。其实,网上有很多LED取模软件,有一定计算机编程基础的朋友,也可以试着自己写个取模程序,让计算机为我们计算,诸如上述OX3F的数值。点亮0—9的程序如下。

  学习至此,想必大家一定可以把0~F显示出来了吧。如果要你显示两位数、三位数等,程序又该如何编写呢?或许,有朋友会想:
  
  在PO口上接一只数码管,再在Pl口上接个数码管。可这样一来,如果要显示4位、5位的数字,岂不是一块AT89C51都接不过来。难道就不能接4位或5位以上的吗?
  
  肯定不是!接下来就来学习一下数码管的显示方式。
  
  数码管的显示方式可分为两种:动态扫描和静态显示。上面说的即为静态显示,如果采用动态扫描显示,就可以解决上面的问题,即可以显示多个数码管。上面的静态显示把数码管的COM脚接至VCC或GND端,其他的脚接至P.×口,这样,只要Px口上输出相应的高低电平,就可以显示对应的数字或字符。如果采用动态扫描方法,比如显示6个数码管,硬件连接可以这样解决:a~dp还是接至PO.O~PO.76个COM脚则接至P2.O~P2.5口。PO口作段选(控制数字字符).P2口作位选(选通哪个数码管)。这样,控制PO和P2口就可以控制6个数码管了。细心的朋友会问:P2位选,是让数码管一个一个亮的,还是不能控制6个一起亮或灭嘛。
  
  设想,黑夜里,拿着一支点燃的烟,在你面前快速晃动,你会发现什么现象?是不是原本不连续的点变成了一条看上去连续的曲线或者直线!回过头来仔细想想数码管,原理是一样的。你别忘了,单片机可是一个计算机哦,计算机的运算速度,是晃动燃烟的数万倍。
  
  下面说说51单片机的机器周期和时钟周期等概念。所谓机器周期,就是访问一次存储器的时间。
  
  而1个机器周期包括12个时钟周期。如果单片机工作在12MHz晶体下,那么一个时钟周期为:1,12μs。一个机器周期12*1/12=1μS。如果晶体为6MHz,时钟周期和机器周期各是多少呢?在汇编中,还要关心指令执行的机器周期,指令周期有1个周期、2个周期和4个周期等。
  
  介绍了机器周期和时钟周期,再回到原来的话题,如果把位选的P2也看作上面的“烟”一划而过,那么看到的是不是6个数码管一起亮或一起灭了?
  
  记住,在某~时刻,有且只有一个数码管能发光。如果你把这句话理解了,动态扫描的理论就算过关了。现在来看看这个小任务,让6个数码管分别显示l、2、3、4、5、6吧。看你是否可以完成,自己先试着写写看咯。
  
  参考程序如下:



www.55dianzi.com

  相信大家都见过数字钟或电子表,或许以前根本没去想过它的工作原理。但是今天你也可以把它做出来,是不是觉得很有成就感呢?
  
  接上期所讲的,先来做个简单的实验:在一只数码管上轮流显示O~9这10个数字。

  signed int定义为无符号整形,取值范围为0—32768

  运行上述程序显示是不是从0~9跳动,离我们的目标又迈进了一步!
  
  上面只显示了一个数码管的数字O_9.怎么样才能让它显示6个数字呢?
  
  这样就可以做个时钟出来玩玩了。
  
  记得前面讲过的P2口的位选作用,就是用它来实现的,具体程序如下:

  编译烧录芯片后,观察运行情况。怎么会一直显示12:00:00,是时钟没有启动,还是另有原因呢?
  
  仔细查看程序,原来是3个变量sec、min、hour初始化后,其值一直没有改变。怎么样才能让它改变数值呢?有的朋友会认为:让秒个位延时1秒后加1.而秒十位延时10秒后再加1.一直加到6.分个位加1.依此类推。这样的想法是不错,但是朋友你有没有想过C语言的一般延时(除非你把它放到中断里)极不精确。这样累计下来,一天24小时的误差肯定很大很大。笔者曾经用延时的方法写过时钟.1个小时误差8秒,那是个什么概念!
  
  一天24小时就要24x8=192s.约为3分钟,一个月就是10分钟。有没有其他的方法可以改进呢?有!这就要涉及到单片机中另一个比较重要的核心部分:单片机的中断和定日J器的运用。想写出比较精确(这里说的只是相对前面的做法而言比较精确而已,如果要做更加精确的时钟,用时钟芯片比较好点,常用的有DS12887和DS1302等)的时钟程序,就一定要调用中断和定时器。



www.55dianzi.com

  要制作一款抢答器,上一期介绍了显示程序编制和应用,这期将讲讲键盘。大家肯定见过银行柜员机吧,取钱输入密码就要用到键盘,超市购物取回寄存物品要输入密码,还有你现在在用的PC机的键盘。但是键盘是怎么工作的呢?一般有2种方式:(l)扫描法,不断扫描键盘的状态,送CPU判断并处理。
  
  如果键盘数目一大的话,显然不适合。(2)线反转法,通过行列状态的改变来判断有无键被按下!
  
  现在如在Pl口接个4x4的键盘.P1.O~P1.3接行,P1.4—P1.7接列,再接4个4.7kΩ的上拉电阻至VCC。代码如下:

  二、线反转法实现如下:
  
  1.和扫描法相同,把列线置低电平,行置高,读行状态。
  
  2.与l相反,把行置低、列置高、读列状态。
  
  3.若有键按下,则为2次所读状态的结果即为键所在的位置,这样2次输出和2次读入可完成键的识别!
  
  子函数如下:

上一页  [1] [2] [3]  下一页


本文关键字:单片机  C语言  电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制