请问所有的disbuff后面的程序是disbuff什么意思思,单片机

技术小站:
& 在线直播
时间:5月29日 10:00 - 11:30
& 在线直播
时间:6月13日 10:00 - 11:30
& 地点:深圳
时间:5月8日 13:00 - 18:00
& 地点:深圳
时间:5月24日 9:00 - 18:00
张飞电子工程师速成全集
10天掌握PCB AD画板
教你高速PCB项目整体设计
如何设计STM32单片机系统?
物联网操作系统从写到用
讲师:华清远见
讲师:林超文
讲师:郑振宇
讲师:李述铜
移入鼠标可放大二维码
STC89C52单片机定时器/计数器详解(含程序和定时器2) - 全文
来源:电子发烧友网整理 作者:日 12:32
[导读] 89C51和89C52还是有一些区别的,首先我们要明确,89C51有两个计数器T0和T1,89C52还有一个T2。 PS串行口中断优先级控制位 PT1TC1中断优先级控制位 PX1外部中断1优先级控制位 PT0TC0中断优先级控制位 PX0外部中断0优先级控制位 同优先级的中断请求,按默认顺序响应。 【说明】 1. 本文里类似的x均可取值为0或1。 2. TC指Timer/Counter,即定时器/计数器。 3. 机器周期是单片机的基本操作周期,一个机器周期内单片机完成一项基本操作,如取指等。一个机器周期包含12个
89C51和89C52还是有一些区别的,首先我们要明确,89C51有两个计数器T0和T1,89C52还有一个T2。
  PS&串行口中断优先级控制位
  PT1&TC1中断优先级控制位
  PX1&外部中断1优先级控制位
  PT0&TC0中断优先级控制位
  PX0&外部中断0优先级控制位
  同优先级的中断请求,按默认顺序响应。
  【说明】
  1. 本文里类似的x均可取值为0或1。
  2. TC指mer/Counter,即定时器/计数器。
  3. 机器周期是单片机的基本操作周期,一个机器周期内单片机完成一项基本操作,如取指等。一个机器周期包含12个时钟周期。时钟周期是时钟频率的倒数。
  4. T0对应引脚P3.4,T1对应P3.5。
  5. INT0对应P3.2引脚,INT1对应P3.3引脚。
  二、定时器的使用
  由于定时器都是由初值计数直至溢出,因此最重要的就是设置计数器的初值。 假设需要定时器产生一次中断的事件为t,计算初值的步骤如下:
 四、例程
  可将以下代码直接复制到.c文件中。
  STC89C52单片机定时器1实现计数器
  ///////////////////////////////////////////////////////////////////////////
  实现功能: 配置定时器1的相关寄存器,使其实现定时器中断功能,然后通过在数码管显示
  实验板型号:BS-XYD-C52
  实验名称: 定时器1实现计数器
  ///////////////////////////////////////////////////////////////////////////
  #include《reg52.h》
  #define uchar unsigned char //定义unsigned char 为 uchar
  #define uint unsigned int //定义unsigned int 为 uint
  uchar cme_10ms_ //中断次数计数单元
  uchar cme_1s_ //判断是否为1s的变量
  uchar uDis_buff[2]; //显示缓冲区,存放要显示的2个字符的段码值
   //秒计数单元
  #define Time_1s_Sign 100 //根据中断周期,判断是否到一秒的标志
  sbit Duan=P2^6; //定义数码管的段选使能端
  sbit Wei =P2^7; //定义数码管的位选使能端
  #define Digital_tube_Wei_Enable Wei=1; //开启控制数码管的位选使能端
  #define Digital_tube_Wei_Disable Wei=0; //关闭控制数码管的位选使能端
  #define Digital_tube_Duan_Enable Duan=1; //开启控制数码管的段选使能端
  #define Digital_tube_Duan_Disable Duan=0; //关闭控制数码管的段选使能端
  #define Digital_tube_Duan P0 //定义数码管数据端口
  uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
  uchar code Dis_Position[]= //定义数码管位选的数组
  {0x3e,0x3d,0x3b,0x37,0x1f,0x2f};
  ///////////////////////////////////////////////////////////////////////////
  函数名称:毫秒延时函数
  函数功能:实现毫秒级的延时
  参数介绍:Delay_MS: 定义需要延时的毫秒的数值
  iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
  iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
  返回值: 无
  注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
  式完成,所以如果改变了晶振的频率,请做相应的改变
  ///////////////////////////////////////////////////////////////////////////
  void DelayMs(uint Delay_MS)
  uint iNumber,iV
  for(iNumber=0;iNumber《Delay_MS;iNumber++) //用for语句实现单片机的延时
  iValue=107; //107这个数值是通过测定而得
  while(iValue--);
  ///////////////////////////////////////////////////////////////////////////
  函数名称:One_DigitalTube_display
  函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
  在第一个数码管上显示0
  参数介绍:uData:要显示的数字的BCD码数组
  uNumber:选择哪个数码管显示,即让某个特定数码管显示
  返回值: 无
  注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
  要弄反了
  ///////////////////////////////////////////////////////////////////////////
  void One_DigitalTube_display(uchar uData,uchar uNumber)
  Digital_tube_Duan_E //使能数码管的段选
  Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值
  Digital_tube_Duan_D //关闭数码管的段选
  Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管
  Digital_tube_Wei_E //使能数码管的位选
  Digital_tube_Wei_D //关闭数码管的位选
  DelayMs(5); //调整时序,以实现稳定显示
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Time_to_disbuffer
  函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
  便显示在分离的数码管
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Time_to_disbuffer()
  uDis_buff[1]=cT //对cTime的数值取余,即就是取cTime的个位
  uDis_buff[0]=cTime/10; //对cTime的数值取整,即就是取cTime的十位
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Init_time1
  函数功能:配置定时器1,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
  数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
  中断,并打开总中断
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Init_time1(void)
  TMOD |= 0x10;
  TH1=()/256;
  TL1=()%6; //定时器0的,写入数值寄存器的低8位
  EA=1; //总中断打开
  ET1=1; //定时器T0允许中断
  TR1=1; //定时器T0开始工作
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Timer_Display
  函数功能:把显示缓冲区的数值显示在数码管上
  参数介绍:cNumber:记录for语句的循环次数
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Timer_Display()
  uchar cN
  for(cNumber=0;cNumber《2;cNumber++)
  One_DigitalTube_display(uDis_buff[cNumber],cNumber);
  DelayMs(2);
  ///////////////////////////////////////////////////////////////////////////
  函数名称:main
  函数功能:利用定时器1中断,在数码管上实现以一分钟为周期的计数器
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void main()
  Init_time1(); //初始化定时器1
  cTime=0;
  while(1)
  if(cTime_1s_ok)
  cTime_1s_ok=0;
  if(++cTime》=60) //每次自加一,同时判断是否到1分钟
  cTime=0;
  Time_to_disbuffer(); //新调整好的时间送入显示缓冲区
  Timer_Display(); //更新显示内容
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Interrupt_handler_time1
  函数功能:重新给寄存器TH1和TL1赋值,判断是否到达一秒,如果到一秒了,把相应的
  变量赋予正值,以方便其他的程序编写
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Interrupt_handler_time1(void) interrupt 3
  TH1=()/256;//定时10毫秒
  TL1=()%6;
  cTime_10ms_counter++;
  if(cTime_10ms_counter==Time_1s_Sign) //判断是否到达一秒
  cTime_10ms_counter=0;
  cTime_1s_ok=1;
  STC89C52单片机定时器2详解
  自认为单片机所有的资源中最不好搞清楚的就是定时器2,尤其是对于那些以前从来没有玩过单片机的新手。定时器2是新增资源,也是51单片机定时器里面功能最强大的一个定时器。所以掌握好定时器2还是非常有必要的。以下是在我完全搞明白它的原理和用法的基础上整理的一篇小文章。读起来,好像Datasheet一样!请原谅,希望没有辜负你的点击!
  定时器2是一个16位定时器/计数器,通过设置特殊功能寄存器T2CON中的C/T2位可将其设置为定时器或是计数器;通过设置T2CON中的工作模式选择位可将定时器2设置为三种工作模式,分别为捕获、自动重新装载(递增或是递减计数)和波特率发生器。
  知识点一、定时器2的控制寄存器T2CON(可按位寻址)*
  D7位--TF2:定时器2溢出标志位。用于请求中断(必须由软件清0)
  D6位--EXF2:定时器外部标志位。当外部信号使能时,发生外部负跳变时置位请求中断(必须由软件清0)
  D5位--RCLK:接受时钟标志位。默认情况下串行口中模式1和模式3的时钟是由定时器1的溢出率提供,若该位置位,则由定时器2提供。
  D4位--TCLK:发送时钟标志位。原理同上
  D3位--EXEN2:定时器2的外部使能标志位。定时器2没有作为串行口时钟时,若将该位置位时,将允许T2EX的负跳变产生捕获或重装
  D2位--TR2:定时器2启动/停止控制位。
  D1位--C/T2:定时器2的定时器/计数器选择位(在reg52头文件中定义为了C_T2,请注意,下面相同)
  D0位--CP/RL2:捕获/重装标志位。
  知识点二 &、 &定时器2的模式控制寄存器T2MOD(不可按位寻址)
  该寄存器在单片机的头文件reg2.h中可能没有被定义,自己定义吧!
  D1位&T2OE:定时器2输出使能位
  D0位&DCEN:向下计数使能位
  知识点三:定时器2的三种模式*
  *1、捕获模式*
  在&CP/RL2=1&&&&TR2=1&时进入捕获模式。通过对控制寄存器T2CON的外部使能标志位EXEN2的置位和清0,又可以有分为如下两种工作模式:
  《1》EXEN2=0:
  此时定时器2作为一个16位的定时器/计数器(由定时器/计数器选择位C/T2位选择)使用,实验已通过。
  《2》EXEN2=1:
  此时定时器在前者的基础上,增加一个特性,即允许接受外部输入T2CON的负跳变,此负跳变使定时器2中的TH2和TL2中的值存入陷阱寄存器RCAP2H和RCAP2L中,并将外部标志位EXF2置位,引起中断。该中断与前者中的中断同时存在并共用同一中断程序(在中断中可检测TF2和T2EX位确定是哪一个引起的中断)。除此之外该模式下,当中断是T2EX位引发的时,虽然引发了中断,但是由于不是溢出,并且计数器没有停止计数,因此,此时TH2和TL2不用重新装载值。
  实验证明在此模式下可以实现:用溢出中断输出方波,用线接入T2EX(P1^1),在T2EX的中断中使蜂鸣器响起来,理论和实践一样,蜂鸣器响的频率是方波的两倍(因为它只捕捉负跳变)
  2、自动重装模式(递增/递减计数器)*
  16位自动重装模式中,定时器2可通过C/T2位配置为定时器/计数器,根据外部使能标志位EXEN2的置位和清0,可分为两种情况:
  《1》EXEN2=0时
  定时器2为16位自动重装的普通定时器,由陷阱寄存器提供重装的值,只需要预设一下即可,可用于定时精度要求高,定时时间长(16位)的情况。
  《2》EXEN2=1时,根据递减计数使能位DCEN的置位和清0可分为两种情况:
  A1、T2MOD=0x00(DCEN=0;默认情况);
  与上一种情况相比,此时16位自动重新装载可由外部T2EX的负跳变,和溢出任意一种触发,并都能产生中断。
  A2、T2MOD=0x01(DCEN=1);
  此时允许T2EX控制计数的方向;T2EX=0时,重装的值为0FF和0FF,递减计数与陷阱寄存器预存值相等时,置位TF2产生中断。T2EX=1时;自动重装值为陷阱寄存器中的值,溢出时置位TF2产生中断。
  3、波特率发生器模式
  T2CON的TCLK和RCLK位为0(默认)时,串行口发送和接受的波特率由定时器1提供;置位为1时,由定时器2提供。可以一个通过定时器1,一个通过定时器2,这样可以获得发送和接受时不同的波特率。
  注意的地方: 定时器2作为定时器时,递增频率为晶振频率的12分频,而定时器2作为波特率发生器时,它的递增频率为晶振频率的2分频。
  模式1和模式3的波特率=(振荡器频率/32) * (65535-N)
  定时器2为计数模式时,外部时钟信号由T2(P1^0)引脚进入。
  定时器2作为波特率发生器的时候,TH2溢出并不会置位TF2,所以此时可以不用禁止定时器2中断,若是EXEN2位被置位时,可以将T2EX作为附加的外部中断。
  定时器2作为波特率发生器的时候,不要对TH2和TL2读写,可以读陷阱寄存器,但是也不要写。当对定时器2的陷阱寄存器进行访问时,应关闭定时器(TR2清0)。
  4、可编程时钟输出
  52系列单片机,可设定定时器/计数器2通过T2(p1^0)引脚输出时钟。
  P1^0除了可以作为普通I/O口外,还可以作为定时器2的外部计数输入和时钟信号输出。
  C/T2=0并且T2MOD的T2OE位为1时,可将定时器2选为时钟信号发生器,自动装初值。设置公式:
  时钟信号输出频率=(振荡器频率/4)* (65535-N)
  在时钟输出模式下,计数器溢出不会产生中断请求。这种功能相当于定时器2可同时作为波特率发生器和时钟发生器。
  **因为此时外部中断并没有被暂用,若是在设置上不冲突的话可能同时还可以响应T2EX引入的外部信号,这个只是猜想,还没有用实验证明过,哈哈***
& & &单片机对于外来脉冲信号具有计数功能,但是有要求:
  计数脉冲的最高频率=振荡器的频率/24
  并且为了确保给定电平在电平变化之前能被采样一次,则这个电平至少要维持一个机器周期。
  STC89C52单片机的定时器2的实现时钟的程序
  ////////////////////////////////////////////////////////////////////////
  实现功能: 配置定时器2的相关寄存器,使其实现定时器中断功能,然后根据中断
  的周期频率实现准确的时钟系统,在数码管上显示实现
  实验板型号:BS-XYD-C52
  实验名称: 定时器2实现时钟系统
  /////////////////////////////////////////////////////////////////////////
  #include《reg52.h》
  #define uchar unsigned char //定义unsigned char 为 uchar
  #define uint unsigned int //定义unsigned int 为 uint
  uchar cTime_10ms_ //中断次数计数单元
  uchar cTime_1s_ //判断是否为1s的变量
  uchar uDis_buff[6]; //显示缓冲区,存放要显示的6个字符的段码值
  uchar cTime[3]; //时、分、秒计数单元
  #define Time_1s_Sign 100 //根据中断周期,判断是否到一秒的标志
  sbit led=P1^0;
  sbit Duan=P2^6; //定义数码管的段选使能端
  sbit Wei =P2^7; //定义数码管的位选使能端
  #define Digital_tube_Wei_Enable Wei=1; //开启控制数码管的位选使能端
  #define Digital_tube_Wei_Disable Wei=0; //关闭控制数码管的位选使能端
  #define Digital_tube_Duan_Enable Duan=1; //开启控制数码管的段选使能端
  #define Digital_tube_Duan_Disable Duan=0; //关闭控制数码管的段选使能端
  #define Digital_tube_Duan P0 //定义数码管数据端口
  uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
  uchar code Dis_Position[]= //定义数码管位选的数组
  {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  /////////////////////////////////////////////////////////////////////////
  函数名称:毫秒延时函数
  函数功能:实现毫秒级的延时
  参数介绍:Delay_MS: 定义需要延时的毫秒的数值
  iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
  iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
  返回值: 无
  注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
  式完成,所以如果改变了晶振的频率,请做相应的改变
  /////////////////////////////////////////////////////////////////////////
  void DelayMs(uint Delay_MS)
  uint iNumber,iV
  for(iNumber=0;iNumber《Delay_MS;iNumber++) //用for语句实现单片机的延时
  iValue=107; //107这个数值是通过测定而得
  while(iValue--);
  /////////////////////////////////////////////////////////////////////////
  函数名称:One_DigitalTube_display
  函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
  在第一个数码管上显示0
  参数介绍:cData:要显示的数字的BCD码数组
  cNumber:选择哪个数码管显示,即让某个特定数码管显示
  返回值: 无
  注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
  要弄反了
  /////////////////////////////////////////////////////////////////////////
  void One_DigitalTube_display(uchar cData,uchar cNumber)
  Digital_tube_Duan_E //使能数码管的段选
  Digital_tube_Duan=Dis_table[cData];//输入所要显示的数值
  Digital_tube_Duan_D //关闭数码管的段选
  Digital_tube_Wei_E //使能数码管的位选
  Digital_tube_Duan=Dis_Position[cNumber]; //点亮特定的数码管的公共端
  Digital_tube_Wei_D //关闭数码管的位选
  DelayMs(1); //调整时序,以实现稳定显示
  /////////////////////////////////////////////////////////////////////////
  函数名称:Time_to_disbuffer
  函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
  便显示在分离的数码管
  参数介绍:cNumber1: 记录时、分、秒计数单元数组的变量
  cNumber2:记录显示缓冲区数组的变量
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Time_to_disbuffer()
  uchar cNumber1,cNumber2=0;
  for(cNumber1=0;cNumber1《=2;cNumber1++)
  uDis_buff[cNumber2++]=cTime[cNumber1]/10; //对cTime的数值取整,即
  //就是取cTime的十位
  uDis_buff[cNumber2++]=cTime[cNumber1]; //对cTime的数值取余,即
  //就是取cTime的个位
  /////////////////////////////////////////////////////////////////////////
  函数名称:Init_time2
  函数功能:配置定时器2,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
  数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
  中断,并打开总中断
  参数介绍:无
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Init_time1(void)
  TH2=()/256;
  TL2=()%6; //定时器0的,写入数值寄存器的低8位
  EA=1; //总中断打开
  ET2=1; //定时器T0允许中断
  TR2=1; //定时器T0开始工作
  /////////////////////////////////////////////////////////////////////////
  函数名称:Timer_Display
  函数功能:把显示缓冲区的数值显示在数码管上
  参数介绍:cNumber:记录for语句的循环次数
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Timer_Display()
  uchar cN
  for(cNumber=0;cNumber《6;cNumber++)
  One_DigitalTube_display(uDis_buff[cNumber],cNumber);
  if(cNumber==1|cNumber==3)
  Digital_tube_Duan_E //使能数码管的段选
  Digital_tube_Duan=0x80; //输入所要显示的数值
  Digital_tube_Duan_D //关闭数码管的段选
  Digital_tube_Wei_E //使能数码管的位选
  Digital_tube_Duan=Dis_Position[cNumber]; //点亮特定的数码管的公共端
  Digital_tube_Wei_D //关闭数码管的位选
  DelayMs(1);
  /////////////////////////////////////////////////////////////////////////
  函数名称:main
  函数功能:利用定时器2中断,实现准确的时钟系统,然后在数码管上显示实现
  参数介绍:无
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void main()
  Init_time1(); //初始化定时器1
  cTime[0]=23,cTime[1]=58,cTime[2]=58;
  Time_to_disbuffer(); //把预设时间送入显示缓冲区
  while(1)
  if(cTime_1s_ok) //判断是否到1秒了
  cTime_1s_ok=0;
  if(++cTime[2]》=60) //每次自加一,同时判断是否到1分钟
  cTime[2]=0;
  if(++cTime[1]》=60) //每次自加一,同时判断是否到1小时了
  cTime[1]=0;
  if(++cTime[0]》=24) //每次自加一,同时判断是否到24点了
  cTime[0]=0;
  Time_to_disbuffer(); //新调整好的时间送入显示缓冲区
  Timer_Display(); //更新显示内容
  /////////////////////////////////////////////////////////////////////////
  函数名称:Interrupt_handler_time2
  函数功能:重新给寄存器TH2和TL2赋值,判断是否到达一秒,如果到一秒了,把相应的
  变量赋予正值,以方便其他的程序编写
  参数介绍:无
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Interrupt_handler_time2(void) interrupt 5
  TF2=0;
  TH2=()/256;//定时10毫秒
  TL2=()%6;
  cTime_10ms_counter++;
  if(cTime_10ms_counter==Time_1s_Sign) //判断是否到达一秒
  cTime_10ms_counter=0;
  cTime_1s_ok=1;
 STC单片机STC89C52RC定时器延时时间的计算
  延时时间要根据晶振频率计算,不同板子可能有所不同。
  时钟周期:
  1/时钟源,在我现在这块板子上,晶振频率是11.0592M,也就是时钟周期是 1/秒
  机器周期:
  一般51单片机是12个时钟周期,我的板子也就是 12/秒
  单次定时最长时间:
  如果是16位的计数器,16位最大值是65535,共可计数65536次。基本的常数一定要记住,还要记住8位最大值是255,共可计数256次,还要记住8位上每位代表的数值。
  12 * 00 = 0.0711 s,也就是,71 ms内的定时可以单次定时就完成。如果定时时间超过71 ms,就要循环了。
  一次定时需要几次机器周期:
  计算公式:定时秒数/机器周期
  比 如我要定时1秒, 1/(12/)= 921600次,16位计数器最大可计数65536次,921600次早就益出了。我们可以每次定时10 ms,循环100次就可以定时1秒了,1 s缩小100百倍就是10 ms, 也就是每次需要计数9216次。
  确实计数器初始值:
  定时10 ms时,如果计数器从0开始计数,我们就不知道什么时候到了9216次。所以应该计数了9216次,16位计数器最多计数95536次,然后就溢出,一溢出TCON的TF位就会置1,我们只要经常检测TF位就可以知道什么时候完成10ms的定时了。
  计算公式:计数器初始值=最大计数次数 - 需要计数次数
  如果定时10 ms,计数器的初始值就是 65536 - 9216
  计算计数器的高位和低位:
  16位的计数器,也就是两个8位组成,8位的最大计数次数是256。所以:
  计数器高位 = 初始值/256
  计数器低位 = 初始值%256
  STC89C52RC单片机定时器示例代码:
  #include 《reg52.h》
  //如果你的单片机没用74hc138扩展IO口,下面代码可略
  sbit enableG1 = P1^3;
  sbit enableG2 = P1^4;
  sbit selectC = P1^2;
  sbit selectB = P1^1;
  sbit selectA = P1^0;
  void hc138()
  enableG1 = 1;
  enableG2 = 0;
  selectC = 1;
  selectB = 1;
  selectA = 0;
  typedef unsigned char uint8;
  typedef unsigned int uint16;
  1ms需要的机器周期 = 0.001/(12/) = 921.6
  要让led灯以7.83hz闪动, 周期是 1000 / 7.83 = 127.713 ms, 也就是每64 ms改变亮灭状态
  void main(void)
  uint16
  hc138();
  TMOD = 0X01;
  TH0 = (65536 - 922) / 256;
  TL0 = (65536 - 922) % 256;
  TR0 =1;
  while(1)
  if(TF0 == 1)
  TF0 = 0;
  TH0 = (65536 - 922) / 256;
  TL0 = (65536 - 922) % 256;
  counter++;
  if(counter == 64)
  counter = 0;
  P0 = ~P0;
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
声明:电子发烧友网转载作品均尽可能注明出处,该作品所有人的一切权利均不因本站而转移。
作者如不同意转载,既请通知本站予以删除或改正。转载的作品可能在标题或内容上或许有所改动。
52单片机相关文章
52单片机相关下载
定时器相关文章
定时器相关下载
计数器相关文章
计数器相关下载
论坛精华干货
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-

我要回帖

更多关于 dis logbuff 的文章

 

随机推荐