/*-------------------------------------- V1.25 修改说明 ------------------------------------------------------*-
1. 定时函数中T0定时时长(ms)宏定义化:
#define T0_TICK_TIME_MS 5 //T0定时时长(单位:ms,取值范围:1-50)
INT8U _TH0_Init_Tick_Time = (65536-(INT16U)(OSC_FREQ*T0_TICK_TIME_MS/(OSC_FREQ_DIV*1000)))/256;
INT8U _TL0_Init_Tick_Time = (65536-(INT16U)(OSC_FREQ*T0_TICK_TIME_MS/(OSC_FREQ_DIV*1000)))%256;
2. 波特率设定时 9600bps 和 57600bps 可选:
#define Baudrate 9600UL //推荐使用9600UL和57600UL(优先推荐)
#if Baudrate == 9600UL
 
CON = 0x00; TH1 = 0xFd; TL1 = 0xFd;
#endif
#if Baudrate == 57600UL
PCON = 0x80; TH1 = 0xFF; TL1 = 0xFF;
#endif
3. 将开T0定时中断函数void SCH_Start_Ticks (void)宏定义化:
#define SCH_Start_Ticks() {ET0 = 1;}
4. 将void SCH_Manual_Timer0_Reload(void)修改为:
void SCH_Timer0_Reload(void)
5. 可重入函数的声明(待定):
将 INT8U *INT_2_String(INT32U) 定义并声明为可重入函数:INT8U *INT_2_String(INT32U) reentrant ;
将 INT8U SCH_Delete_Task(NT8U) 定义并声明为可重入函数:INT8U SCH_Delete_Task (const INT8U) reentrant;
6. PDF文件夹中相关文件更新。
-*--------------------------------------------------------------------------------------------------------------*/
V1.25 运行效果 (晶振:11.0592MHz , 波特率: 57600bps,传输速度很快!)
/*-------------------------------------- V1.30 修改说明 ------------------------------------------------------*-
1. 构造头文件总包含,方便裁剪:
#include "includes.h" //各个.c文件均包含includes.h文件,includes.h包含所有子头文件
2. 进入临界段和退出临界段的定义:
#define SCH_ENTER_CRITICAL() {EA = 0;}
#define SCH_EXIT_CRITICAL() {EA = 1;}
//代码中str_MS_Counter = INT_2_String(MS_Counter)一句不能被中断,必须以临界段的方式实现
3. PDF文件夹中相关文件更新。
-*--------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------- V1.40 修改说明 ------------------------------------------------------*-
1. 重写task.c文件:
很多朋友反应task.c中的代码不易理解。现在笔者为了大家能够很好地理解SCH51系统内核本身,重新写了任务函数,
任务功能尽可能简单。task.c文件中定义了5个任务:
void Task_Pulse_50ms (void); //产生周期为50ms的脉冲
void Task_Pulse_100ms (void); //产生周期为100ms的脉冲
void Task_Pulse_200ms (void); //产生周期为200ms的脉冲
void Task_Pulse_400ms (void); //产生周期为400ms的脉冲
void Task_Pulse_800ms (void); //产生周期为800ms的脉冲
这样希望大家能将重点放在SCH51内核上。请自行在Keil中仿真实现,效果见picture文件夹中图片。
2. 串口使能与否选择:
#define USE_UART 0 //不使用串口(可以降低系统功耗和增强稳定性)
3. 更新部分程序和注释。
4. 更新pdf文件夹中相关文件,更新picture中的仿真效果截图。
-*--------------------------------------------------------------------------------------------------------------*/
Keil中仿真效果如下图所示:
/*-------------------------------------- V1.45 修改说明 ------------------------------------------------------*-
1. 修改sch51.h文件中的部分内容为:
#define INTERRUPT_TIM_0_OF 1
#define INTERRUPT_EXTERNAL_1 2
#define INTERRUPT_TIM_1_OF 3
#define INTERRUPT_UART_RX_TX 4
#define INTERRUPT_TIM_2_OF 5
这样更符合ANSI C的书写规范:一般#define定义的常量应用大写字母表示。
2. 删除sch51.c中的语句:
extern INT32U MS_Counter; //在T0_init.c中定义
3. 移动语句 #define OSC_FREQ_DIV 12 :
将语句 #define OSC_FREQ_DIV 12 从 config.h 移至 T0_INIT.C 中。
8051单片机(包括STC12、STC15等1T类型的单片机) 的定时器部分的晶振已经定格为系统晶振12分频,故笔者认为此句不宜
放在config.h中用于配制,应移至T0_INIT.C中以示意。
4. 重写函数 SCH_Start_Tasks():此函数一旦运行,将会启动多任务调度,且永不返回主函数,详见SCH51.C文件。
5. 重写函数 void Delay_ms (INT32U):此函数较以前版本有重大改进,采用时钟摘取算法延时,不影响系统全局变量MS_Counter,
近乎完美。
6. 在config.h中增加语句:
#define USE_UART_RI 0 //不使用串口接收中断
#define USE_UART_TI 0 //不使用串口发送中断
7. 将文件T0_init.c和文件T0_init.h重命名为T0_UART_init.c和T0_UART_init.h
并且重新定义和声明 SCH_Init_T0_UART() 函数。
8. 在T0_UART_init.c文件中添加函数:
void SCH_UART_INTERRUPT(void) interrupt INTERRUPT_UART_RX_TX
9. 更新部分程序和注释。
10. 更新pdf文件夹中相关文件,更新picture中的仿真效果截图。
-*--------------------------------------------------------------------------------------------------------------*/
Pulse_Keil_V1.45 效果图: