任务:定时器控制灯亮灭(注意点)
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()
{
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