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

利用定时/计数器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)
}

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

猜你喜欢

转载自blog.csdn.net/qq_46541463/article/details/112908236