单片机C51的计数器

发布者:pingbashou最新更新时间:2016-12-14 来源: eefocus关键字:单片机  C51  计数器 手机看文章 扫描二维码
随时随地手机看文章

该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选端的驱动,所 有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数 码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。图中看出,所有6位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,哪些笔段 亮就取决于P0口的8根线的状态。


 
编写程序时,首先根据硬件连线写出LED数码管的字形码、位驱动码,然后编写程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int 
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //位驱动码
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //字形码
uchar DispBuf[6]; //显示缓冲区
void Timer1() interrupt 3
{ uchar tmp;
uchar Count; //计数器,显示程序通过它得知现正显示哪个数码管
TH1=(65536-3000)/256;
TL1=(65536-3000)%256; //重置初值
tmp=BitTab[Count]; //取位值
P2=P2|0xfc; //P2与11111100B相或
P2=P2&tmp; //P2与取出的位值相与
tmp=DispBuf[Count];//取出待显示的数 
tmp=DispTab[tmp]; //取字形码
P0=tmp;
Count++;
if(Count==6)
Count=0; 
}
void main()
{ uint tmp;
P1=0xff;
P0=0xff;
TMOD=0x15; //定时器0工作于计数方式1,定时器1工作于定时方式1
TH1=(65536-3000)/256;
TL1=(65536-3000)%256; //定时时间为3000个周期
TR0=1; //计数器0开始运行
TR1=1;
EA=1;
ET1=1;
for(;;)
{ tmp=TL0|(TH0<<8); //取T0中的数值
DispBuf[5]=tmp%10;
tmp/=10;
DispBuf[4]=tmp%10; 
tmp/=10;
DispBuf[3]=tmp%10;
tmp/=10;
DispBuf[2]=tmp%10;
DispBuf[1]=tmp/10;
DispBuf[0]=0;
}} 
  这个程序中用到了一个新的知识点,即数组,首先作一个介绍。 
  数组是C51的一种构造数据类型,数组必须由具有相同数据类型的元素构成,这些数据的类型就是数组的基本类型,如:数组中的所有元素都是整型,则该数组称为整型数组,如所有元素都是字符型,则该数组称为字符型数组。 
  数组必须要先定义,后使用,这里仅介绍一维数组的定义,其方式为:
  类型说明符 数组名[整型表达式]
  定义好数组后,可以通过:数组名[整型表达式]来使用数组元素。 
  在定义数组时,可以对数组进行初始化,即给其赋予初值,这可用以下的一些方法实现: 
  1.在定义数组时对数组的全部元素赋予初值:
  例:int a[5]={1,2,3,4,5}; 
 2.只对数组的部分元素初始化;
  例:int a[5]={1,2};
  上面定义的a数组共有5个元素,但只对前两个赋初值,因此a[0]和a[1]的值是1、2,而后面3个元素的值全是0。 
 3.在定义数组时对数组元素的全部元素不赋初值,则数组元素值均被初始化为0 
 4.可以在定义时不指明数组元素的个数,而根据赋值部分由编译器自动确定
  例:uchar BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};则相当于定义了一个BitTab[6]这样一个数组。 
 5.可以为数组指定存储空间,这个例子中,未指定空间时,将数组定义在内部RAM中,可以用code关键字将数组元素定义在ROM空间中。
  uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; 
  用这两种定义分别编译,可以看出使用了code关键字后系统占用的RAM数减少了,这种方式用于编程中不需要改变内容的场合,如显示数码管的字形码等是很合适的。 
  6.C语言并不对越界使用数组进行检测,例如上例中数组的长度是6,其元素应该是从BitTab[0]~BitTab[5],但是如果你在程序中写上 BitTab[6],编译器并不会认为这有语法错误,也不会给出警告(其他语言如BASCI等则有严格的规定,这种情况将视为语法错误),因此,编程者必 须自己小心确认这是否是你需要的结果。 
  程序分析:程序中将定时器T1用作数码管显示,通过interrupt 3关键字定义函数Timer1()为定时器1中断服务程序,在这个中断服务程序中,使用 
TH1=(65536-3000)/256;
TL1=(65536-3000)%256; 
  来重置定时器初值,这其中3000即为定时周期,这样的写法可以直观地看到定时周期数,是常用的一种写法。其余程序段分别完成取位码以选择数码管、从 显示缓冲区获得待显示数值、根据该数值取段码以点亮相应笔段等任务。其中使用了一个计数器,该计数器的值从0~5对应第1到第6位的数码管。 
  主程序的第一部分是做一些初始化的操作,设置定时器工作模式、开启定时器T1、开启计数器T0、开启T1中断及总中断,随后进入主循环,主循环首先用 unsigned int型变量tmp取出T0中的数值,这里使用了“tmp=TL0|(TH0<<8);”这样的形式,这相当于 tmp=TH0*256+TL0,但比之于后一种形式,该方式可以得到更高的效,其后就是将tmp值不断地除10取整,这样将int型数据的各位分离并送 入相应的显示 .

关键字:单片机  C51  计数器 引用地址:单片机C51的计数器

上一篇:C51单片机的定时器计数器怎么用?
下一篇:MCS-51单片机定时器/计数器、串行口、多机通讯

推荐阅读最新更新时间:2024-03-16 15:25

MSP430单片机写Info Memory
MSP430F5438A单片机在写Info Memory时,需要先把整页数据擦除,才能写进去。否则写失败。 而且还得设置下载程序时不要擦除 Info memory, 否则存储数据失败。因为没此下载时都给你擦除了。
[单片机]
MSP430<font color='red'>单片机</font>写Info Memory
基于单片机的步进电机开环控制系统
0 引言 步进电机是一种将电脉冲信号变换成相应的角位移或直线位移的机电执行元件。控制步进电机的输入脉冲数量、频率及电机各相绕组的接通顺序,可以得到各种需要的运行特性。尤其与数字设备配套时,体现了更大的优越性,因此广泛应用于数字控制系统中。 本文介绍已实现的单片机对步进电机的数字控制系统。该控制系统中,控制器担负着产生脉冲以及发送、接收控制命令的任务。本文对控制器的设计,尤其是脉冲产生电路的设计作了详细的介绍。 1 系统设计 步进电机开环控制系统框图如图1所示。系统由步进电机控制器、步进电机驱动电源、步进电机和LED状态显示等4部分组成,本文着重介绍步进电机控制器、步进电机驱动电源、LED 显示状态3部分。
[工业控制]
循环冗余校验码的单片机及CPLD实现
    摘要: 循环冗余码校验(CRC)是一种可靠性很高的串行数据校验方法。介质循环冗余码校验的基本原理,并分别用单片机和CPLD作了循环冗余码验的软件实现和硬件实现。包括汇编语言和VHDL语言源程序。     关键词: 差错校验 查表法 CPLD 1 基本原理 串行数据的差错检验是保证数据正确的必要手段,通常采用奇遇校验法和循环冗余校验法。这两种方法都是通过冗余数据来提供必要信息。奇偶校验法适用于以字节为单位数据传输。例如用偶校验传送1个ASCII字符时,要附加1个校验位,从而使全部9位中“1”的个数为偶数。奇偶校验简单易行,但当数据崩溃或出现多位错误时,往往不能检验出来,因而可靠性不高。 循环冗余码
[工业控制]
单片机时钟电路作用
单片机运行需要时钟支持 就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。 单片机可以看成是在时钟驱动下的时序逻辑电路。 以MCS一5l单片机为例随明:MCS一51单片机为l2个时钟周期执行一条指令。也就是说单片机运行一条指令,必须要用r2个时钟周期。没有这个时钟,单片机就跑不起来了,也没有办法定时和进行和时间有关的操作。 时钟电路是微型计算机的心脏,它控制着计算机的二个节奏。CPU就是通过复杂的时序电路完成不同的指令功能的。MCS一51的时钟信号可以由两种方式产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号:另一种为外部方式,时钟信号由外部引入。 如果没有
[单片机]
单片机LED数码电路和C程序
让一个单片机的LED数码显示器,从第一位显示1、第二位显示数字2、第三位显示3、...一直到第六位显示6,每个数字间隔0.5秒。 然后一直循环下去。求一个C 语言程序! ------------------------- 假定电路如下图。 针对这个简单题目,不用编很长的程序,如下所示即可: //================================================ #include reg52.h sbit dua = P2^6; sbit wei = P2^7; char code Digit = {0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82}; char code Wi
[单片机]
<font color='red'>单片机</font>LED数码电路和C程序
C51单片机串口通讯注意点
今天在利用C51单片机发数据给PC时,出现了一个小小的问题:如果我要用一个按键来触单片发送5个数据到PC,当单片机复位后,第一次发送的数据总是只有一个数据,而不是5个,当第二次后又正常了。原因是在程序中开了串口中断(ES = 1);大概程序如下: ES = 1; TOMD = 0x20; TR1 = 1; main() {P1.0 = 1; while(P1.0); send(0x00); send(0x01); send(0x02); send(0x03); send(0x04); } 。。。。。。 如果是以上程序,当单片每复位后,按第一次P1.0将只发送00,第二次后会是00,01,02,03,04;
[单片机]
STC系列单片机不断电下载程序的程序设计思路及方法
本文针对单片机下载程序时需要重复机械式复位产生的一系列调试繁琐的问题,提出了一种用软件引导代替单片机硬件复位写入ROM的方法。该方法通过检测串口数据流是否合法,来判断是否执行ISP引导程序,从而利用软件方式复位,可以让STC单片机复位后从ISP引导程序处执行,利用该特性可以模拟单片机上电复位状态,实现单片机的不断电下载。 随着单片机技术的发展,单片机片内存储器的容量越来越大,可以容纳越来越大的程序。由于程序越来越复杂,在程序调试过程中需要不断进行硬件复位来下载程序,虽然在线下载程序的方法已经普遍应用,但在现实调试实现中还是比较繁琐,因此人们在寻求一种用软件代替硬件的复位方法来调试下载程序,近而在工程实际中更加快捷方便地进行
[单片机]
STC系列<font color='red'>单片机</font>不断电下载程序的程序设计思路及方法
基于利用单片机构成高精度PWM式12位D/A方法
在用单片机制作的变送器类和控制器类的仪表中,需要输出1—5V或4—20mA的直流信号的时候,通常采用专用的D/A芯片,一般是每路一片。当输出信号的精度较高时,D/A芯片的位数也将随之增加。 在工业仪表中,通常增加到12位。12位D/A的价格目前比单片机的价格要高得多,占用的接口线数量也多。尤其是在需隔离的场合时,所需的光电耦合器数量与接口线相当,造成元器件数量大批增加,使体积和造价随之升高。如果在单片机控制的仪表里用PWM方式完成D/A输出,将会使成本降低到12位D/A芯片的十分之一左右。我们在S系列流量仪表中采用了这种方式,使用效果非常理想。下面介绍一下PWM方式D/A的构成原理。 二 电路原理 一般12位D/A转换器
[单片机]
基于利用<font color='red'>单片机</font>构成高精度PWM式12位D/A方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved