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

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

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

  三、一键多能程序

      下面再来介绍介绍一键多能的程序,即按下一个键,可以执行不同的命令!代码如下:

  将显示、键盘程序作串联狙合,即可实现抢答的功能,现在看起来是否觉得单片机的人门很简单呢?其实,很多电子产品的功能实现,也不外乎就是将多个单一模块功能进行组合。相信你进入单乐园后,一定会找到更合适自编程方式,以完成电子系统设计的需要。

 



www.55dianzi.com

  现在看上期介绍的按键程序,再看看下面的程序。

  第1个if语句后,进入Delay(10);而Delay函数完全让CPU执行空语句,非常耗费单片机内部资源。
  
  解决方法有以下2种:
  
  1.将延时函数放在中断中,在中断里查询延时标志位。,/*不仅仅用于键盘识别,亦可以用于其他的延时代码。见EXl*/。
  
  2.直接在中断中查询按键标志位.//见EX2。

  Delay函数的延时时间,要看你设定的TO定时器中断和Delaytime的乘积,如果定时器中断为50ms,

  当然,在实际过程当中,并不是如此简单,希望大家能够举一反三。   
  
  此外.单片机和外部其他芯片还有很多,比如数字温度传感器DS18820、实时时钟芯片DS1302,还有访问AT24Cxx的EEPROM存储器等,更多的电路,要靠大家在学习过程中慢慢掌握。



www.55dianzi.com

    什么是中断呢,如果单片机正在执行某个任务,突然有更重要的事件要求单片机响应,单片机就会应答响应,去执行该任务(中断处理),原来的任务就等待(现场的保护),待执行完任务后,回到中断前的人口处,继续执行原来的任务(现场中断的恢复)。51系列单片机共有5个中断源,分别为外中断O、定时器TO中断、外中断l、定时器Tl中断、串口中断。
  
  下面讲讲单片机的定时器是什么?如何工作的?
  
  定时器,简单的说:就是起定时作用,也就是让单片机计数。定时器有方式O、方式1、方式2和方式3等4种工作方式。有些朋友一定会问:定时器如何启动?风扇定时器,相信大家都用过,单片机定时器的启动,总不该也用手拧定时器吧。当然不是,只要给单片机一些指令,就可以启动定时器了。下面就以定时器0,来说说怎么启动定时器O。程序如下:
  
  TMOD=OX01;//设置定时器O工作方式0THO=(65536-5000),256;//载入高8位初值TLO=(65536-5000)%256;//载人低8位初值TRO=1:,,启动定时器从上面四行程序可以看出,启动定时器非常简单。其中,TMOD为T/C方式控制寄存器,其D7—DO位的定义如下:
  
  D7D6D5D4D3D2DlDOGATEC/TMlMOGATEC/TMlMOIT/ClllT/COIC/T是counter(计数器)和timer(定时器)选择位,若该值为l,作计数器用,为0,则为定时器用。CATE为门控位。M1和MO为工作方式选择:若Ml=0、MO=O,则为方式0,13位定时,计数器;若Ml=0、MO=I,则为方式l,16定时,计数器;若Ml=l、MO=O.则为方式2,自动装载8位定时,计数器;若Ml=l、MO=1.则为方式3.只适用于T/CO,2个8位定时,计数器。
  
  感觉有些难以理解了吧?还是来说说上面的程序。第一句:
  
  TMOD=OX01;//为什么是OX01?大家看:上面选择的是定时器O方式O,所以T/C1,即D7~D4全为0,而T/CO的Ml为0.MO为l,即D3~DO为0001,所以DO~D7为OX01:OX01表示的是十六进制数,这个大家应该都知道吧!还有DO~D7表示的是二进制数,还需要转换一下。
  
  第二、三句:TH0=(65536-5000)/256;//载人高8位初值。若在12MHz晶体下,定时5000μs,即为5ms。如果不是在12MHz下,又该怎么计算呢?如果是11.0592MHz呢?还记不记得前面讲过的机器周期和时钟周期的概念。其实,上述的5000=lxC,显然,C=5000,但是如果是11.0592MHz就不是1了,应该是1.085。5000=1.085xC.则C就为5000/1.085,具体多少,大家自己去算算。同理,TLO也是一样。细心的朋友会发现网上或者资料上的THO、TLO和上面不一样,是直接写THO=OXEC;‘rLO=OX78.是不是和上面一样的呢?别忘了,单片机也是计算机的一种哦。用C的话,直接写上计算公式就行了,计算就交给单片机完成吧。
  
  第四句:TRO=1;就是启动定时器0,开始计数。还有一点,有些朋友会问,前面的65536是哪里来的呢?
  
  可别忘了,设置定时器O、工作方式0是16位的(2的16次方是多少,自己算算就知道了)。简单吧?但是如何和中断一起使用呢?请看下面的程序讲解。
  
  TMOD=OX01://设置定时器O工作方式0THO=(65536-5000),256;//载入高8位初值TLO=(65536-5000)%256;//载人低8位初值TRO=1;//启动定时器EA=l:/开总中断ETO-1;//开定时器中断。若为0则表示关闭!
  
  上面六行程序,就进行了初始化定时器TO和中断,也就是定时器满5ms产生一次中断。产生中断后怎么处理呢?每次中断后,可以让一个变量自加1,200次中断后就是Is了。比起上面说的延时产生的时间是不是精确多了呢?但是,能不能ls内让单片机少中断九次呢?如果在12MHz晶体下,嗨次中断不是可以产生最多65336ms的时间吗?那么让它每50ms中断一次好了。我们就定时了20次1秒的时间。

      现在来参阅如下程序


  简单吧。如果还是有点看不懂,可慢慢体会。如果你自己能写个时钟程序来,那你的51单片机也就学会应用80%了。中断和定时,计数器,是很重要的内容,几乎用到单片机的地方都会涉及到,必须要好好掌握。
  
  编辑好程序后,赶紧编译HEX文件,搭好硬件,烧入单片机,上电看看效果。现在你应该有成就感了,想不到一个时钟居然那么简单。但是问题来了,时钟做出来了,它的精度怎么样呢?一两个小时,或许看不出什么误差,但是一天或者一年坭?要是按年来算,这个时钟根本没有实用价值!人家都说用c写不出精度高的时钟程序来,是不是有点后悔了,去学汇编吧!但是,既然选择了C,就不要后悔!想想C是高级语言,又怎么会输给汇编呢?看看下面这段程序代码:

  在中断处理服务程序中,加入上述代码。TRO=0;先关闭定时器TO,然后重新给THO和TLO赋值,再开启TRO=l;烧入单片机看看效果。怎么样。比第一次精确多了吧。
  
  但是还是有误差。为什么呢?这是硬件造成的误差,可以用软件来弥补。
  
  先把时钟点亮,让它走上几个小时或者几天,看看到底误差有多少,取个平均值(比如10小时快1秒),那么可以通过以下语句来弥补。

  这样一来,可能会出现这样的现象:秒直接跳变!我们可以再通过细分来实现,不要10小时那么大,小些的就行。  



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


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