📄 init_systerm.c
字号:
//-----|-----|-----|-----|-----|-----|-----|------|
//TF2:定时器2溢出标志位,必须软件清零,RCLK=1或TCLK=1时,TF2不用置位
//EXF2:定时器2外部标志位,EXEN2=1 时,T2EX 上的负跳变而出现捕捉或重
// 载时,EXF2 会被硬件置位。定时器2打开,EXF2=1 时,将引导CPU
// 执行定时器2中断程序。EXF2必须软件清0,在向上/向下计数模式
// (DCEN=1)下EXF2不能引起中断
//RCLK:串行口接收数据时钟标志位。若RCLK=1,串行口将使用定时器2 溢出
// 脉冲作为串行口工作模式1 和3的串口接收时钟;RCLK=0,将使用定
// 时器1计数溢出作为串口接收时钟。
//TCLK:串行口发送数据时钟标志位。若TCLK=1,串行口将使用定时器2 溢出
// 脉冲作为串行口工作模式1 和3 的串口发送时钟;TCLK=0,将使用定
// 时器1计数溢出作为串口发送时钟。
//EXEN2:定时器2外部允许标志位。当EXEN2=1时,如果定时器2没有用作串行
// 时钟,T2EX(P1.1)的负跳变引起定时器2 捕捉和重载.若EXEN2=0,
// 定时器2将视T2EX端的信号无效
//TR2:开始/停止控制定时器2。TR2=1,定时器2开始工作
//C/T2:定时器2 定时/计数选择标志位。CT2=0,定时; CT2=1,外部事件计数
// (下降沿触发)
//CP/RL2:捕捉/重载选择标志位。当EXEN2=1时,CP/RL2=1,T2EX出现负脉冲,
// 会引起捕捉操作;当定时器2溢出或EXEN2=1时T2EX出现负跳变,都
// 会出现自动重载操作。
}
/******************************************************************************/
/* 初始化串口 */
/******************************************************************************/
void Init_Com(void)
{
SCON = 0x50;//缺省模式为8位波特率可变,不允许多机通信
//-----|-----|-----|-----|-----|-----|-----|------|
// SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
//-----|-----|-----|-----|-----|-----|-----|------|
//SM0、SM1串口工作方式选择位
//-----|-----|-----|--------------------------------------------|
// SM0 | SM1 | 方式| 功能 |
//-----|-----|-----|--------------------------------------------|
// 0 | 0 | 0 |移位寄存器方式(用于IO扩展,波特率F/12) |
//-----|-----|-----|--------------------------------------------|
// 0 | 1 | 1 |8位UART,波特率可变(由T1溢出率决定) |
//-----|-----|-----|--------------------------------------------|
// 1 | 0 | 2 |9位UART,波特率为F/64或F/32 |
//-----|-----|-----|--------------------------------------------|
// 1 | 1 | 3 |9位UART,波特率可变(由T1溢出率决定) |
//-----|-----|-----|--------------------------------------------|
//SM2:允许方式2、3多机通信控制位。在方式2或方式3种,如SM2=1,则接
//受到的第9位数据(RB8)为0时,不启动接受中断标志RI,当接受到的第
//9位数据为1时,则启动接受中断RI。如果SM2=0,则接受的第9位数据无论
//为1或者0均启动RI。在方式1时,如果SM2=1。则只有在接受到有效的停止
//位时才启动RI,若没有接受到有效停止位,则RI=0,如果不是多机通信,
//则无un串行口工作何种方式,SM2一般都置为0
//REN:允许接受位,由软件置1
//TB8:在方式2和方式3种要发送的第9位数据,由软件置位
//RB8:在方式2和方式3种要接收的第9位数据,在方式1时,如SM2=0,RB8是
//接收到的停止位。在方式0中,不使用RB8
PCON &= 0x7f; //缺省模式波特率不加倍
//SMOD = 0波特率不加倍,SMOD = 1波特率加倍
RCAP2H = 0xff;//在12M晶体时,波特率为9600
RCAP2L = 0xd9;// F(晶体频率)
// 波特率 = ---------------------------
// 32*(65536-(RCAP2H,RCAP2L)
ES = 1; // ES = 0禁止串口中断,ES = 1允许串口中断
}
/******************************************************************************/
/* 初始化外部中断0 */
/******************************************************************************/
void Init_Int0(void)
{
IE1 = 0;//外部INT0中断请求标志,该位在TCON的第2位
IT0 = 1;//IT0:外部中断INT0触发方式选择位,缺省为1
//可由指令设置为0或者1,当IT0=0时,INT0被指定为电平触发方式,即低电平
//有效,CPU在每一机器周期的S5P2采样INT0的输入电平,当采样值为低电平时,
//IE0置1。当IT0=1时,INT0被指定为边沿触发方式,即INT0下降沿有效,CPU在
//每一机器周期的S5P2采样INT0的输入电平,若一次采样值为高电平,而下一机
//器周期采样值为低电平,IE1置1。
EX0 = 0;//EX0 = 0禁止INT0中断,EX0 = 1开INT0中断,缺省不允许
}
/******************************************************************************/
/* 初始化外部中断1 */
/******************************************************************************/
void Init_Int1(void)
{
IE1 = 0;//外部INT1中断请求标志,该位在TCON的第4位
IT1 = 1;//IT1:外部中断INT1触发方式选择位,缺省为1
//可由指令设置为0或者1,当IT1=0时,INT1被指定为电平触发方式,即低电平
//有效,CPU在每一机器周期的S5P2采样INT1的输入电平,当采样值为低电平时,
//IE1置1。当IT1=1时,INT1被指定为边沿触发方式,即INT1下降沿有效,CPU在
//每一机器周期的S5P2采样INT0的输入电平,若一次采样值为高电平,而下一机
//器周期采样值为低电平,IE1置1。
EX1 = 0;//EX0 = 0禁止INT0中断,EX0 = 1开INT0中断,缺省不允许
}
/******************************************************************************/
/* 初始化CPU中断和优先级 */
/******************************************************************************/
void Init_Cpu_IEIP(void)
{
EA = 1;//EA = 1允许全局中断。EA = 0禁止全局中断
IP = 0;//缺省都为低优先级中断
//IP:51的中断分为两个优先级,实现两级中断嵌套
//-----|-----|-----|-----|-----|-----|-----|------|
// | | | PS | PT1 | PX1 | PT0 | PX0 |
//-----|-----|-----|-----|-----|-----|-----|------|
//PS:串行口优先级设定位
//PS=1,串行口设为高优先级,PS=0串行口设为低优先级
//PT1:定时器1优先级设定位
//PT1=1,定时器1设为高优先级,PT1=0定时器1设为低优先级
//PX1:外部中断INT1优先级设定位
//PX1=1,外部中断INT1设为高优先级,PX1=0外部中断INT1设为低优先级
//PT0:定时器0优先级设定位
//PT0=1,定时器0设为高优先级,PT0=0定时器0设为低优先级
//PX0:外部中断INT1优先级设定位
//PX0=1,外部中断INT0设为高优先级,PX0=0外部中断INT0设为低优先级
}
/******************************************************************************/
/* 初始化看门狗定时器 */
/******************************************************************************/
void Init_Wd(void)
{
// WD = 0x1e;//WDT是一种需要软件控制的复位方式。WDT 由13位计数器和特殊功能寄存器
//WD = 0xe1;//中的看门狗定时器复位存储器(WDTRST)构成。WDT 在默认情况下无法工作
//为了激活WDT,户用必须往WDTRST 寄存器(地址:0A6H)中依次写入01EH和
//0E1H。当WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT计时周
//期依赖于外部时钟频率。除了复位(硬件复位或WDT溢出复位),没有办法
//停止WDT工作。当WDT溢出,它将驱动RSR引脚一个高个电平输出。
//为了激活WDT,用户必须向WDTRST寄存器(地址为0A6H的SFR)依次写入0E1H
//和0E1H。当WDT激活后,用户必须向WDTRST写入01EH和0E1H喂狗来避免WDT
//溢出。当计数达到8191(1FFFH)时,13 位计数器将会溢出,这将会复位器件。
//晶振正常工作、WDT激活后,每一个机器周期WDT 都会增加。为了复位WDT,
//用户必须向WDTRST 写入01EH 和0E1H(WDTRST 是只读寄存器)。WDT 计数器
//不能读或写。当WDT 计数器溢出时,将给RST 引脚产生一个复位脉冲输出,
//这个复位脉冲持续96个晶振周期(TOSC),其中TOSC=1/FOSC。为了很好地使
//用WDT,应该在一定时间内周期性写入那部分代码,以避免WDT复位。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -