📄 main.c
字号:
#include "Global.H"
#include "KeyTestTask.H"
#include "HelloTask.H"
#include "ClockTask.H"
void Delay(int time);//延时程序
void SystemInitialize(void);//系统初始始化
main()
{
//系统启动延时
//===========
Delay(100);
//系统初始化
//==========
SystemInitialize();
//主循环
//======
while(1)
{
//将系统按键值转换成自定义的按键值
//================================
KeyConvert();
//时钟参数加1秒。
//==============
ClockIncreaseProcess();
//任务执行体
//==========
switch(TaskMode)
{
case 1: KeyTestTask();break;
case 2: HelloTask();break;
case 3: ClockTask();break;
}
}
}
//延时程序
void Delay(int time)
{
while(time) time--;
}
//系统初始化
void SystemInitialize(void)
{
//资源设置(初始化)
//================
//定时器0工作在方式1 作16位定时器用(允许中断)
//定时器1工作在方式2 作波特率发生器用(禁止中断)
//定时器2工作在自动重装方式 作时间定时用(2.5ms产生一次溢出中断)
//外部中断设置 INT0及INT1均为边沿触发(允许中断)
//串行口设置为方式1 8位UART(允许中断)
TMOD = 0x21;//7(GATE),6(C/~T),5(M1),4(M0),3(GATE),2(C/~T),1(M1),0(M0)
TH0 = 0x00;//设置定时器0计数初值
TL0 = 0x00;
TH1 = 0xF4;//Serial Port Baud Rate 2400 bps, when the main frequence is 11.0592MHz
TL1 = 0xF4;
TCON = 0x55;//TCON: 7(TF1),6(TR1),5(TF0),4(TR0),3(IE1),2(IT1),1(IE0),0(IT0)
T2CON = 0x04;//T2CON:7(TF2),6(EXF2),5(RCLK),4(TCLK),3(EXEN2),2(TR2),1(C/~T2),0(CP/~RL2)
TH2 = 0xF7;//2.5ms产生一次溢出中断(晶振为11.0592MHz)
TL2 = 0x00;
RCAP2H = 0xF7;
RCAP2L = 0x00;
SCON = 0x78;//SCON: 7(SM0),6(SM1),5(SM2),4(REN),3(TB8),2(RB8),1(TI),0(RI)
PCON = 0x00;//PCON: 7(SMOD),6(null),5(null),4(null),3(GF1),2(GF0),1(PD),0(IDL)
IE = 0x37;//中断允许:7(EA),6(null),5(ET2),4(ES),3(ET1),2(EX1),1(ET0),0(EX0)
IP = 0x30;//中断优先级:7(null),6(null),5(PT2),4(PS),3(PT1),2(PX1),1(PT0),0(PX0)
//==============================================================================
//开启中断,允许中断响应
//======================
EA = 1;
}
/*
==============================================================================
|/ 定时器0和定时器1控制
方式0: 1.计数方式: 13位计数器,高8位在THx,低5位在TLx的低5位.
2.计数脉冲输入: C/~Tx = 0 内部时钟12分频信号
C/~Tx = 1 Tx引脚信号
3.计数允许控制: (~GATEx | ~INTx) & TRx = 1 允许计数
(~GATEx | ~INTx) & TRx = 0 停止计数
4.中断允许: ETx = 1 允许中断响应
ETx = 0 禁止中断响应
5.计数溢出: 计数溢出时置TFx为1,进入中断服务程序时由硬件自动清0.
计数溢出时需由软件重装计数初值到THx和TLx中.
方式1: 1.计数方式: 16位计数器,高8位在THx,低8位在TLx.
2.计数脉冲输入: C/~Tx = 0 内部时钟12分频信号
C/~Tx = 1 Tx引脚信号
3.计数允许控制: (~GATEx | ~INTx) & TRx = 1 允许计数
(~GATEx | ~INTx) & TRx = 0 停止计数
4.中断允许: ETx = 1 允许中断响应
ETx = 0 禁止中断响应
5.计数溢出: 计数溢出时置TFx为1,进入中断服务程序时由硬件自动清0.
计数溢出时需由软件重装计数初值到THx和TLx中.
方式2: 1.计数方式: 8位重装计数器,8位计数值在TLx中,THx存放重装初值.
2.计数脉冲输入: C/~Tx = 0 内部时钟12分频信号
C/~Tx = 1 Tx引脚信号
3.计数允许控制: (~GATEx | ~INTx) & TRx = 1 允许计数
(~GATEx | ~INTx) & TRx = 0 停止计数
4.中断允许: ETx = 1 允许中断响应
ETx = 0 禁止中断响应
5.计数溢出: 计数溢出时置TFx为1,进入中断服务程序时由硬件自动清0.
计数溢出时由硬件重装THx计数初值到TLx中.
方式3: *定时器0专有的定时方式
定时器0的子定时器一
1.计数方式: 8位计数器,8位计数值在TL0中.
2.计数脉冲输入: C/~T0 = 0 内部时钟12分频信号
C/~T0 = 1 T0引脚信号
3.计数允许控制: (~GATE0 | ~INT0) & TR0 = 1 允许计数
(~GATE0 | ~INT0) & TR0 = 0 停止计数
4.中断允许: ET0 = 1 允许中断响应
ET0 = 0 禁止中断响应
5.计数溢出: 计数溢出时置TF0为1,进入中断服务程序时由硬件自动清0.
计数溢出时需由软件重装计数初值到TL0中.
定时器0的子定时器二
1.计数方式: 8位计数器,8位计数值在TH0中.
2.计数脉冲输入: 内部时钟12分频信号
3.计数允许控制: TR1 = 1 允许计数
TR1 = 0 停止计数
4.中断允许: ET1 = 1 允许中断响应
ET1 = 0 禁止中断响应
5.计数溢出: 计数溢出时置TF1为1,进入中断服务程序时由硬件自动清0.
计数溢出时需由软件重装计数初值到TH0中.
*方式选择: M1 M0
0 0 方式0
0 1 方式1
1 0 方式2
1 1 方式3(仅定时器0可用,定时器1如设置为方式3时则停止工作)
*~GATE,C/~T,M1,M0在TMOD中,低4位控制定时器0,高4位控制定时器1.
*TFx,TRx在TCON中
*ETx在IE中
*当定时器0工作在方式3时,定时器1只能工作在方式2下作波特率发生器使用.
定时器1在方式2下作波特率发生器时的波特率表(晶振为11.0592MHz):
TH1 Baud Rate(bps) SMOD
FDH 19.2k 1
FDH 9.6k 0
FAH 4.8k 0
F4H 2.4k 0
E8H 1.2k 0
|\
==============================================================================
==============================================================================
|/ 定时器2控制
自动重装方式: 1.计数方式: 16位计数器,高8位在TH2,低8位在TL2.
2.计数脉冲输入: C/~T2 = 0 内部时钟12分频信号
C/~T2 = 1 T2引脚信号
3.计数允许控制: TR2 = 1 允许计数
TR2 = 0 停止计数
4.中断允许: ET2 = 1 允许中断响应
ET2 = 0 禁止中断响应
5.计数溢出: 计数溢出时置TF2为1,进入中断服务程序时需由软件清0.
6.外部下降沿触发条件: EXEN2 = 1 允许外部下降沿触发信号(自T2EX引脚)进入
EXEN2 = 0 禁止外部下降沿触发信号(自T2EX引脚)进入
*当外部下降沿触发信号进入时,置EXF2标志为1,进入中断服务程序时需由软件清0.
7.重装计数初值条件: 计数溢出或有外部下降沿触发信号进入时重装计数初值.
RCAP2H->TH2,RCAP2L->TL2.
捕获方式: 1.计数方式: 16位计数器,高8位在TH2,低8位在TL2.
2.计数脉冲输入: C/~T2 = 0 内部时钟12分频信号
C/~T2 = 1 T2引脚信号
3.计数允许控制: TR2 = 1 允许计数
TR2 = 0 停止计数
4.中断允许: ET2 = 1 允许中断响应
ET2 = 0 禁止中断响应
5.计数溢出: 计数溢出时置TF2为1,进入中断服务程序时需由软件清0.
计数初始值需由软件在中断服务程序中重装.
6.外部下降沿触发条件: EXEN2 = 1 允许外部下降沿触发信号(自T2EX引脚)进入
EXEN2 = 0 禁止外部下降沿触发信号(自T2EX引脚)进入
*当外部下降沿触发信号进入时,置EXF2标志为1,进入中断服务程序时需由软件清0.
7.捕获条件: 当有外部下降沿触发信号进入时捕获TH2和TL2中的计数值到RCAP2H和RCAP2L中.
波特率发生器: *当定时器2作波特率发生器用时即处于此种工作方式.
0.波特率发生器选择: TCLK = 1 选择定时器2作串行口(串行口工作在方式1或方式3)发送时的波特率发生器
TCLK = 0 选择定时器1作串行口(串行口工作在方式1或方式3)发送时的波特率发生器
RCLK = 1 选择定时器2作串行口(串行口工作在方式1或方式3)接收时的波特率发生器
RCLK = 0 选择定时器1作串行口(串行口工作在方式1或方式3)接收时的波特率发生器
1.计数方式: 16位计数器,高8位在TH2,低8位在TL2.
2.计数脉冲输入: C/~T2 = 0 内部时钟12分频信号
C/~T2 = 1 T2引脚信号
3.计数允许控制: TR2 = 1 允许计数
TR2 = 0 停止计数
4.中断允许: ET2 = 1 允许中断响应(仅外部输入的下降沿触发信号可产生中断)
ET2 = 0 禁止中断响应
5.计数溢出: 计数溢出信号作为时钟信号送给串行口电路,计数溢出不产生中断.
6.外部下降沿触发条件: EXEN2 = 1 允许外部下降沿触发信号(自T2EX引脚)进入
EXEN2 = 0 禁止外部下降沿触发信号(自T2EX引脚)进入
*当外部下降沿触发信号进入时,置EXF2标志为1,进入中断服务程序时需由软件清0.
7.重装计数初值条件: 计数溢出时重装计数初值.
RCAP2H->TH2,RCAP2L->TL2.
|\
==============================================================================
==============================================================================
|/ 串行口控制
方式0: 1.功能 同步移位寄存器.RXD引脚传送数据,TXD引脚传送同步脉冲(低电平有效).
2.波特率 内部时钟12分频
3.发送数据 写数据到SBUF的同时启动发送,发送完8位数据置TI=1.
4.接收数据 在REN=1允许接收的条件下,置RI=0即启动接收,8位数据接收好后,置RI=1.
5.SM2控制 本方式下不受SM2的影响
方式1: 1.功能 8位UART
2.波特率 由定时器1或定时器2提供
3.数据帧格式 1位起始位(0),8位数据(先发低位,后发高位),1位停止位(1).
4.发送数据 写数据到SBUF的同时启动发送,发送完1帧数据后置TI=1.
5.接收数据 在REN=1允许接收的条件下,接收到起始位时启动接收过程.
RB8存放接收到的停止位.
6.SM2控制 SM2=1时,只有RB8接收到合法的停止位1时才产生中断,置TI=1.
SM2=0时,不检测停止位合法性,接收到1帧数据后置TI=1.
方式2: 1.功能 9位UART
2.波特率 内部时钟的64分频(SMOD=0)或32分频(SMOD=1)
3.发送数据 写数据到SBUF的同时启动发送,发送完1帧数据后置TI=1.
TB8为要发送的第九位数据,此位接在SBUF中的8位数据之后发送.
4.接收数据 在REN=1允许接收的条件下,接收到起始位时启动接收过程.
RB8存放接收到的第九位数据.
5.数据帧格式 1位起始位(0),8位数据(先发低位,后发高位),TB8(接收时为RB8),1位停止位(1).
6.SM2控制 SM2=1时,只有RB8接收到1时才产生中断,置RI=1.
SM2=0时,不检测RB8的值,接收到一帧数据后即产生中断,置RI=1.
方式3: 1.功能 9位UART
2.波特率 由定时器1或定时器2提供
3.发送数据 写数据到SBUF的同时启动发送,发送完1帧数据后置TI=1.
TB8为要发送的第九位数据,此位接在SBUF中的8位数据之后发送.
4.接收数据 在REN=1允许接收的条件下,接收到起始位时启动接收过程.
RB8存放接收到的第九位数据.
5.数据帧格式 1位起始位(0),8位数据(先发低位,后发高位),TB8(接收时为RB8),1位停止位(1).
6.SM2控制 SM2=1时,只有RB8接收到1时才产生中断,置RI=1.
SM2=0时,不检测RB8的值,接收到一帧数据后即产生中断,置RI=1.
*中断允许控制 ES = 1 允许串行口中断
ES = 0 禁止串行口中断
*方式选择: SM0 SM1
0 0 方式0
0 1 方式1
1 0 方式2
1 1 方式3
*方式3除波特率由定时器1或定时器2提供外,其余细节同方式2.
*SM0,SM1,SM2,REN,TB8,RB8,TI,RI在SCON中
*SMOD在PCON中
*ES在IE中
|\
==============================================================================
==============================================================================
|/ 外部中断源控制
触发方式: ITx = 0 低电平触发方式,当~INTx引脚输入低电平时,即置IEx=1产生中断,此时IEx直接受~INTx引脚的电平控制.
中断服务处理程序需要在退出服务前控制外部硬件电路使得~INTx引脚信号恢复为高电平.否则退出服务后立即又会再次进入中断服务程序.
ITx = 1 下降边沿触发方式,当~INTx引脚产生一由1到0的下降边沿时,即置IEx=1产生中断.
进入中断服务处理程序时由硬件自动清除IEx标志.
中断允许: EXx = 1 允许外部中断
EXx = 0 禁止外部中断
*ITx和IEx在TCON中
*EXx在IE中
|\
==============================================================================
==============================================================================
|/ 中断优先级控制
IP中断优先级控制寄存器中置1的位对应的中断源属于高级优先级,置0的位对应的中断源属于低级优先级.
|\
==============================================================================
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -