利用定时/计数器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)
}
写在最后:
本文仅为个人学习笔记,诸多纰漏,欢迎斧正!