⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 全国大学生电子竞赛专用的51单片机最小系统原理图与源程序
💻 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 + -