1. 延时函数控制
1.1 查看原理图
查看原理图发现,led灯(D1)需要给高电平才会亮,其引脚是P3.4
1.2 软件编程
1.2.1 方法1 --位操作取反
因为#include <stc15.h>头文件已将所有寄存器全部封装好,可通过右击头文件进行寄存器封装查看
/*
* @name Delay_ms
* @brief 毫秒延时函数
* @param ms -> ÑÓʱµÄʱ¼ä
* @retval None
*/
static void Delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 990; j++);
}
int main()
{
// .....
while(1)
{
Delay_ms(1000);
P34 = ~ P34; //取反指示灯
}
}
1.2.2 方法2 – 位操作 赋值
while(1)
{
Delay_ms(1000);
P35 = 1; //亮
Delay_ms(1000);
P35 = 0; //灭
}
1.2.3 方法3-- 位与或赋值
while(1)
{
Delay_ms(1000);
P3 |= 0x10; //0001 0000 第4位为置1
Delay_ms(1000);
P3 &= 0xef; //1110 1111 第4位清0
}
1.2.4 方法4-- 移位 位与或赋值
while(1)
{
Delay_ms(1000);
P3 |= (0x1 << 4 ); //和方法3类似
Delay_ms(1000);
P3 &= ( ~ ( 0x1 << 4 ));
}
2. 定时器延时控制
2.1 定时器工作原理
定时器/计数器原理详见各芯片手册,本章针对STC15的16位自动重装模式进行讲解
- SYSclk顾名思义表示系统时钟
- 序号2表示对系统时钟的分频选择,可以不分频,或者进行12分频,由T0x12进行控制
- 序号3是定时器和计数器的选择,C(count 计数器),T(timer 定时器),由C/T位进行控制
- 序号4,可进行定时值得设置。寄存器RL_TH0/1是隐藏寄存器,和TH0/1地址相同,对TH0/1写入的内容可以同事写进RL_TH0/1
- TF0看图可知表示中断触发。
- 自动重装,当TH0/1减至0后,触发中断,RL_TH0/1自动重新将定时值写入TH0/1寄存器。
** 工作流程**: 通过寄存器配置定时器的工作模式。设定定时值。定时器启动后,定时器在时钟源的驱动下累加计数,当计数值溢出时,中断标志位TF0置位,触发定时器中断,此时可以重新设定时值或自动重装定时值,重新计数,周而复始。 如果定时器中断开启了,CPU会停下手头的工作,转而去运行定时器中断函数,中断函数运行完之后,CPU继续干手头的工作。
2.2 什么是中断
主循环 -> 码农A撸代码
手机铃声 -> 中断标志位
接听电话 -> 中断处理
中断返回 - >码农A继续撸代码
2.3 定时器初始化代码
可通过STC-ISP烧录软件直接生成定时器初始化代码
void Timer0Init(void) //10毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
//由上定时器时序图可知,12分频需要AUXR 的bit7=0
TMOD &= 0xF0; //设置定时器模式
//由时序图+TMOD功能描述可知,[3:0] = 0x0
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
//初始值是0xDC00
//(f/12) / (65535 - 0xDC00 ) = 定时时长
TF0 = 0; //清除TF0标志
//中断标志初始为0 有中断置1
TR0 = 1; //定时器0开始计时
//由时序图可知,TR0 = 1才有可能是control闭合,定时才能打开
}
2.4 中断初始化
由中断结构图可知,定时中断0工作需要闭合ET0 和总中断EA
static void IE_Init()
{
ET0 = 1; //定时器0中断
EA = 1; //总中断
}