登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 借助定时器按键控制LED流水灯左右顺序

[复制链接]
发表于 2023-2-5 16:56:48 | 显示全部楼层 |阅读模式
学习笔记
学习科目: C51单片机
学习安排: 定时器
开始时间: 2023-02-04
结束时间:
借助定时器按键控制LED流水灯左右顺序


这节我也采用模块化编程
    首先写定时器的代码,根据开发板手册
屏幕截图_20230204_201936.png

    图片左上为时钟系统,左下和中部为计数系统,右边为中断系统。
GATE向右进程为非门,左给1右边就输出0,左给0则输出1。再向右进程(月牙形)为或门,有1就输出1,全是0才输出0。再向右为与门,有0就输出0,全是1才输出1。




    51单片机中的定时器由两个控制位TR0和TR1,用于启动和停止定时器的计数,赋1是启动定时器T0和T1,赋0时停止。(注意启动定时器的指令一般在初始化程序中)。定时器T0和T1是由两个八位专用寄存器组成,例如T0由TH0和TL0组成。其内部还有特殊功能寄存器TMOD和TCON。TMOD负责控制确定T0和T1的功能和工作模式。TCON用来控制T0和T1启动或停止计数。
IMG_2637.JPG        屏幕截图_20230205_151921.png

    这里我为定时器模块写代码,根据流程图为GATE赋0,就可以实现让TR0单独控制。C/T赋0来选择定时器,M1、M0赋0、1来决定定时器工作模式。所以TMOD=0x01执行以上内容,选择模式一(定时器T1不工作、T0工作)。TR0=1启动定时器。
中断系统根据手册从左到右为TF=0,ET0=1,EA=1,PT0=0接通。
  1. <font face="楷体, 楷体_GB2312" size="6">#include <STC12C5A60S2.H>

  2. void Timer0_Init(void)       
  3. {
  4.        
  5.         TMOD=0x01;//选择模式

  6. </font>
复制代码





    在按下按键时LEDMode++;if(LEDMode>=2)LEDMode=0;代码可以让LEDMode在01之间反复横跳。
    crol和cror函数可以让LED灯左右移动,注意要提前预编译函数库INTRINS.H
代码如下。
  1. <font face="楷体, 楷体_GB2312" size="6">#include <STC12C5A60S2.H>
  2. #include <Timer0.h>
  3. #include <Key.h>
  4. #include <INTRINS.H>
  5. unsigned char        KeyNum,LEDMode;   
  6. void main()
  7. {
  8.         P0=0xFE;
  9.         P20=0;
  10.         P21=1;
  11.         P22=1;
  12.         P11=0;
  13.         Timer0_Init();
  14.         while(1)
  15.         {
  16.                 KeyNum=Key();
  17.                 if(KeyNum)
  18.                 {
  19.                                 if(KeyNum==1)
  20.                                 {
  21.                                         LEDMode++;
  22.                                         if(LEDMode>=2)LEDMode=0;
  23.                                
  24.                                 }
  25.                 }
  26.         }       

  27. }


  28. void Timer0_Routine() interrupt 1
  29. {
  30.         static  unsigned int T0Count;
  31.         TH0=64535/255;
  32.         TL0=64535%255;</font>
复制代码
    64535离计数器溢出差值1000,为1ms,所以使用64535/255,下面T0Count每隔1ms计数加一,到1000就达到了间隔1s的作用。(注意在if语句给T0Count归0。)    按键代码和延迟函数代码也是模块化。


屏幕截图_20230205_152634.png
屏幕截图_20230204_210604.png
屏幕截图_20230204_185634.png
屏幕截图_20230204_183734.png
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表