一、训练任务
在CT107D单片机综合训练平台上,利用51单片机的定时/计数器T0的模式1实现间隔定时,每隔1秒L1指示灯闪烁一下, 也就是点亮0.5秒,熄灭0.5秒;每隔10秒L8指示灯闪烁一下, 即点亮5秒,熄灭5秒。
1.1 训练重点
二、基本概念
定时/计数器的最基本工作原理是进行计数,作为定时器时,计数信号的来源选择周期性的内部时钟脉冲,作为计数器时,计数信号的来源选择非周期性的外部输入信号
2.1 理解定时器的工作原理
2.2 51单片机的定时/计数器
51单片机有两个定时/计数器T0和T1,为16位加法计数器,由低八位TLx和高八位THx两个寄存器组成,最大计数值为65532个计数脉冲
计数信号可以由两个,一个是系统时钟脉冲(时间可以自己设定,作为定时作用),一个是外部事件信号(不固定,来一次才加一,用作计数)
这里需要用到TCON寄存器两个位置
TMOD模式寄存器,不能进行位操作,只能字节操作
三、定时/计数器的编程思路
四、代码展示
#include <reg52.h> typedef unsigned int uint; typedef unsigned char uchar; sbit L1 = P0^0; sbit L8 = P0^7; //配置HC138 void SelectHC138(uchar channel) { switch(channel) { case 4: P2 = (P2 & 0X1F) | 0X80; break; case 5: P2 = (P2 & 0X1F) | 0Xa0; break; case 6: P2 = (P2 & 0X1F) | 0Xc0; break; case 7: P2 = (P2 & 0X1F) | 0Xe0; break; } } //初始化系统 void Initsys() { SelectHC138(5); P0 = 0X00;//关闭蜂鸣器和继电器 SelectHC138(4); P0 = 0XFF;//关闭LED } //******************************** void InitTime0() { TMOD = 0X01; TH0 = (65535 - 50000) / 256; TL0 = (65535 - 50000) % 256; ET0 = 1; EA = 1; TR0 = 1; } uchar count = 0; void ServiceTime0() interrupt 1 { TH0 = (65535 - 50000) / 256; TL0 = (65535 - 50000) % 256; count++; if(count % 10 == 0) { L1 = ~L1; } if(count == 100) { L8 = ~L8; count = 0; } } //******************************** void main() { SelectHC138(4); InitTime0(); Initsys(); while(1) { } }