第七章 外部中断
1.中断概念:
形象化理解:
2.系统框架:
触发方式的了解:
一般中断标志位置1为有中断请求,置0无。
中断允许控制位置1允许中断,置0无。
中断优先级:当出现多个时,优先级越高先执行。
PX0H | PX0 | 中断优先级 |
0 | 0 | 最低(优先级0) |
0 | 1 | 较低(优先级1) |
1 | 0 | 较高(优先级2) |
1 | 1 | 最高(优先级3) |
同一个优先级的话则取决于相关中断号:
中断号 | 中断源 | 查询次序 |
0 | 外部中断0 | 从最高至最低 |
1 | 定时器/计数器0 | |
2 | 外部中断1 | |
3 | 定时器/计数器1 | |
4 | 串口中断 | |
5 | 定时器/计数器2 | |
6 | 外部中断2 | |
7 | 外部中断3 |
用中断执行LED灯亮灭,按KEY1,KEY2键实现。理由:中断设置对应的按键开关
从代码也可以看出,中断的使用,减少了CPU的占用。
#include <STC89C5xRC.H>
sbit LED1=P2^4;
sbit LED2=P2^5;
void InitInterrupt()
{
IT0=1;//触发方式
EX0=1;//打开中断允许
IT1=1;
EX1=1;
EA=1;//总中断
}
void main()
{
InitInterrupt();
while(1)
{
}
}
void External0_Handler() interrupt 0
{
LED1=~LED1;
}
void External1_Handler() interrupt 2
{
LED2=~LED2;
}
第八章 定时器/计数器
了解单片机上的时钟周期,就是晶振周期。该开发板为12MHZ默认12T
了解工作原理:
工作模式有4种:一般都采用可自动重装载的8位定时器/计数器
定时器也有对应的中断模式,这里不详细展示。
采用一种简便获取定时器初始化的方法:
插上单片机的前提下打开STC-ISP,然后找到定时器计算选项即可,选择你所需的参数机型设置调整。
利用定时器控制LED亮灭状态。采用中断系统,代替先前的Delay函数,节省CPU资源。
#include <STC89C5xRC.H>
sbit LED=P2^4;
void InitInterrupt()
{
ET0=1;//打开定时器中断
EA=1;//打开总中断允许
}
void Timer0Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void main()
{
InitInterrupt();
Timer0Init();
while(1)
{}
}
void Timer0_Handler() interrupt 1
{
static unsigned int iCounter=0;
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB;
iCounter++;
if(iCounter>=1000)
{
iCounter=0;
LED=~LED;
}
}
第九章 PWM与呼吸灯
了解PWM:
PWM(Pulse Width Modulation,脉冲宽度调制)是按照一定规律改变脉冲宽度,以获得所需波形的调制方法,被广泛应用在测量、功率控制等诸多领域中。
因为这里涉及延时,所以可采用延时函数或者定时器。
这里涉及一个知识点就是模块化编程
就是在一个工程中,我可以采取先前写过的程序进行引用。
可以到b站搜索模块化编程,进一步了解。有助于节省开发时间。
下面代码是呼吸灯。
#include <STC89C5xRC.H>
#include "timer.h"
sbit LED1=P2^4;
void main()
{
InitInterrupt();
Timer0Init();
while(1)
{
}
}
void Timer0_Handler() interrupt 1
{
static unsigned int icnt1=0;//控制周期
static unsigned int icnt2=0;//控制呼吸快慢
static unsigned int duty=100;//定义占空比
static unsigned char iflag=0;
icnt1++;
if(icnt1>=100)
{
icnt1=0;
}
icnt2++;
if(icnt2>=200)
{
icnt2=0;
if(duty>=100&&iflag==1)
{
iflag=0;
}
else if(duty==0&&iflag==0)
{
iflag=1;
}
if(iflag==0)
{
duty--;
}
else if(iflag==1)
{
duty++;
}
}
if(icnt1<=duty)
{
LED1=1;
}
else
{
LED1=0;
}
}
第十章 串口通信
了解通信协议:
传输方式:并行通信与串行通信
工作模式:
该单片机的串口相关知识:
CH340芯片可以实现USB通信协议和标准UART串行通信协议的转换。电阻R33的作用:防止电源开关断了后有电流从该引脚流入后级电路。还有R32一起起到阻抗匹配作用,减少信号干扰。
该串口也是用中断系统使用。中断相关知识不记。涉及中断系统的,都需要有中断初始化。
该串口工作模式:
涉及程序代码时候需要初始化;根据需求在STC-ISP配置串口初始化。根据需求设置。
实现功能:按下key1键,串口输出Hello world
#include <STC89C5xRC.H>
void UartInit(void) //4800bps@12.000MHz,串口初始化
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF3; //设置定时初始值
TH1 = 0xF3; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
}
sbit LED=P2^4;
sbit KEY=P3^2;
void InitInterrupt()//中断初始化
{
ES=1;
EA=1;
}
void main()
{
InitInterrupt();
UartInit();
while(1)
{}
}
void Delay60ms() //@11.0592MHz,按键延时,可以将时间设置大点。
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void UART_Handler() interrupt 4 //串口中断系统
{
static unsigned char arrBuffer[1];
static unsigned char arrString[]="Hello world!";
static unsigned char i;
static unsigned char s_iCounter=0;
if(KEY==0)
{
Delay60ms();
for(i=0;i<=12;i++)
{
SBUF=arrString[i];
while(!TI) //等待发送数据完成
{
}
TI = 0;
}
}
}
介绍完毕!后续待更!