定时/计数器应用——利用定时/计数器T0产生定时时钟,由P1口控制8个发光二极管。

本文介绍了如何使用51单片机的定时器T0和P1口控制8个LED灯进行10次/秒的交替闪烁。程序中设置晶振为12MHz,通过设置TMOD寄存器选择定时器工作方式1,计算初值以达到100ms的定时效果,利用中断服务函数实现定时器溢出处理。在主函数中,通过计数变量控制LED灯的状态变化,实现周期性的闪烁效果。
摘要由CSDN通过智能技术生成

利用定时/计数器T0产生定时时钟,由P1口控制8个发光二极管。
编一个程序,使8个指示灯依次一个一个闪动,闪动频率为10次/秒
(8个灯依次亮一遍为一个周期)。设晶振频率为12MHz。

2021-01-20,51单片机学习笔记

代码:
/*********************************************************
利用定时/计数器T0产生定时时钟,由P1口控制8个发光二极管。
编一个程序,使8个指示灯依次一个一个闪动,闪动频率为10次/秒
(8个灯依次亮一遍为一个周期)。
**********************************************************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int 
#define uchar unsigned char
uchar num,leds;
void main()
{
	leds=0xfe;//初始化 位变量leds
	num=0;//初始化 计数变量num
	
	EA=1;//打开特殊功能寄存器IE内的总开关EA
	ET0=1;//打开特殊功能寄存器IE内的开关ET0
	TMOD=0X01;//0000 0001,低四位,GATE=0,C/T=0,M1M0=01;选用中断源T0,方式1,16位定时器
	/*TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能。*/
	
	TH0=(65536-50000)/256;//初始化,装填初值
	TL0=(65536-50000)%256;
	/*这里是从15536(=65536-50000)位置开始计数,逐次加1,直到65535位置即将溢出,再加1,回到0
	共50000次"加1",机器周期为1us时,每次加1耗时1us,全程耗时50ms*/
	
	TR0=1;//启动定时器
	
	while(1)
	{
		//经历100ms(=2*50ms)
		if(num==2)
		{
			P1=leds;//点亮对应位的led
		}
		
		//再经历100ms(=(4-2)*50ms)
		if(num==4)
		{
			num=0;//初始化计数变量
			P1=0xff;//所有位led熄灭
			leds=_crol_(leds,1);//按位循环左移一位,1111 1110-->1111 1101-->1111 1011	
		}
	}
}

//中断函数 中断源:"定时/计数器0(T0)",代号1
void time0() interrupt 1 
{
	TH0=(65536-50000)/256;//初始化,装填初值
	TL0=(65536-50000)%256;
	num++;//计数变量自增,num每增加1,耗时50ms(=50000*1us)
}

写在最后:
本文仅为个人学习笔记,诸多纰漏,欢迎斧正!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值