51定时器控制灯亮灭

任务:定时器控制灯亮灭(注意点)

1)学习寄存器

2)用定时器控制灯的亮灭

3)5s亮10s灭 计数(不用python,单片机自身定时器)

第一种操作://单片机一次最大计数为65.536ms,想要设计单次计时5ms,每一次i++,直到(i%1000==1),理论上灯5s灭,5s亮。

#include<reg52.h>

#define unit8 unsigned char

#define unit16 unsigned int

sbit led = P3^6;

int i=0;

void main()

扫描二维码关注公众号,回复: 8967746 查看本文章

{

TMOD = 0X01;

TH0 = 0XEC;

TL0 = 0X78;

TF0 = 0;

TR0 = 1;

while(1)

{

if(i%1000==1)

{led=~led;}

TF0 = 0;

i++;

TH0=0XEC;

TL0=0X78;

}

}

发现问题小灯一直闪烁,目测速度没有一秒,且程序会跑死,执行到后面灯长灭或常亮,需按复位电路开关手动复位。

操作二:

图片

定义中断服务函数

函数类型 函数名 (形式参数) interrupt n [using n]

中断号    中断源         中断向量(待了解)

0     外部中断0           0003H

1     定时器/计数器0      000BH

2     外部中断1           0013H

3     定时器/计数器1      001BH

4     串行口              0023H

interrupt 关键字是不可缺少的,由它告诉编译器该函数是中断服务函数,并由后面的

n 指明所使用的中断号。

实现了五秒亮,五秒灭。

操作二源码:

#include “reg52.h”    //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

sbit led=P3^6;  //定义P3.6口是led

void Timer0Init()

{

TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

TH0=0XeC; //给定时器赋初值,定时5ms

TL0=0X78;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器

}

void main()

{

Timer0Init();  //定时器0初始化

while(1);

}

void Timer0() interrupt 1

{

static u16 i;

TH0=0Xec; //给定时器赋初值,定时5ms

TL0=0X78;

i++;

if(i==1000)

{

i=0;

led=~led;

}

}

操作一与操作二对比:

图片

学习笔记:(因为边看51的视频边记录的,所以很乱,其中如果有错误,欢迎指出)

参考51视频中有关定时的视频

图片图片图片图片图片图片图片

关于如何确定初值的二进制值:

直接利用电脑中的计算器功能(例如:1ms)

starter = (Max - N)

frequency = 12MHZ

Time = 1ms

N = 1ms * 12 /12MHZ = 1000

starter = 65536-1000 =64536

图片

THn = 0XFC

TLn=0X18

发布了31 篇原创文章 · 获赞 28 · 访问量 9500

猜你喜欢

转载自blog.csdn.net/visual_eagle/article/details/104139942