commit 5c785573beb6d3f7093a77127061afd1e5d6a04a Author: cyp0633 Date: Thu Jun 30 10:40:46 2022 +0800 Initial commit diff --git a/1919810_2/191980_2.uvopt b/1919810_2/191980_2.uvopt new file mode 100644 index 0000000..453299e --- /dev/null +++ b/1919810_2/191980_2.uvopt @@ -0,0 +1,214 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x0 + MCS-51 + + 35000000 + + 1 + 1 + 1 + 0 + 0 + + + 0 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + 0 + 2 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + E:\Code\keil\1919810_2\main.c + + +
+
+ + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + +
+
+ + + Source Group 1 + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 1 + 0 + 0 + .\source\main.c + main.c + 0 + 0 + + + 1 + 2 + 4 + 0 + 0 + 0 + E:\Code\keil\1919810_2\source\STCBSP_V3.6.LIB + STCBSP_V3.6.LIB + 0 + 0 + + + +
diff --git a/1919810_2/191980_2.uvproj b/1919810_2/191980_2.uvproj new file mode 100644 index 0000000..fa4de15 --- /dev/null +++ b/1919810_2/191980_2.uvproj @@ -0,0 +1,395 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x0 + MCS-51 + 0 + + + STC15F2K60S2 Series + STC + IRAM(0-0xFF) XRAM(0-0x6FF) IROM(0-0xEFF8) CLOCK(35000000) MODP2 + + "LIB\STARTUP.A51" ("Standard 8051 Startup Code") + + 62472 + STC15F2K60S2.H + + + + + + + + + + + 0 + 0 + + + + STC\ + STC\ + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + 191980_2 + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 0 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + 65535 + + + S8051.DLL + + DP51.DLL + -pDP8051 + S8051.DLL + + TP51.DLL + -p51 + + + + 0 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + + + + + + 0 + + + + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0xffff + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0xeff9 + + + 0 + 0x0 + 0x100 + + + 0 + 0x0 + 0x700 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 1 + 0 + 1 + 3 + 8 + 2 + 1 + 1 + 0 + 0 + + + + + .\inc + + + + 0 + 1 + 0 + 0 + + + + + + + + + 0 + 0 + 1 + 0 + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Source Group 1 + + + main.c + 1 + .\source\main.c + + + STCBSP_V3.6.LIB + 4 + E:\Code\keil\1919810_2\source\STCBSP_V3.6.LIB + + + + + + + +
diff --git a/1919810_2/inc/Beep.h b/1919810_2/inc/Beep.h new file mode 100644 index 0000000..a95550e --- /dev/null +++ b/1919810_2/inc/Beep.h @@ -0,0 +1,28 @@ +/**********************************Beep V2.0 说明 ************************************************************************ +Beep用于控制“STC-B学习板”上无源蜂鸣器的发声。Beep模块共提供1个驱动函数、2个应用函数: + (1) BeepInit():蜂鸣器模块驱动函数 + (2) Set_Beep(unsigned int Beep_freq, unsigned char Beep_time):控制蜂鸣器发声,非阻塞型 + 函数参数: + Beep_freq:指定发声频率,单位Hz。小于10将无输出 + Beep_time:指定发声时长。发声时长=10*Beep_time (mS) ,最长 655350mS + 函数返回值:enumSetBeepOK:调用成功,enumSetBeepFail:调用失败(或因蜂鸣器正在发音) + (3) GetBeepStatus(void): 获取Beep当前状态,enmuBeepFree:空闲, enumBeepBusy ,正在发音 + (4) Beep模块使用了STC内部CCP模块1通道 + +编写:徐成(电话18008400450) 2021年3月3日设计,2021年3月26日更新 +*/ + +#ifndef _beep_H_ +#define _beep_H_ + +extern void BeepInit(); // 蜂鸣器初始化 + +extern char SetBeep(unsigned int Beep_freq, unsigned int Beep_time); // 发指定频率声音, 发声时长=10×Beep_time (mS) ,最长 655350mS + // Beep_freq < 10 Hz, 不发音 + // 函数返回 enumSetBeepOK:调用成功, enumSetBeepFail:调用失败(调用时正在发音) + +extern unsigned char GetBeepStatus(void); // 获取状态,enumBeepFree:自由, enumBeepBusy,正在发声 + +enum BeepActName {enumBeepFree=0,enumBeepBusy,enumSetBeepOK,enumSetBeepFail}; + +#endif \ No newline at end of file diff --git a/1919810_2/inc/DS1302.h b/1919810_2/inc/DS1302.h new file mode 100644 index 0000000..377b96e --- /dev/null +++ b/1919810_2/inc/DS1302.h @@ -0,0 +1,75 @@ +/**********************************DS1302 V1.1 说明 ************************************************************************ +DS1302模块用于控制“STC-B学习板”上DS1302芯片操作。 +DS1302提供RTC(实时时钟)和NVM(非易失存储器)功能(断电后,RTC和NVM是依靠纽扣电池BAT维持工作的)。其中: + RTC提供:年、月、日、星期、时、分、秒功能 + NVM提供:31 Bytes非易失存储器功能(地址为:0~30)。其中,地址为30的单元被DS1302Init()函数用于检测DS1302是否掉电,用户不能使用) +DS1302模块共提供1个驱动函数、4个应用函数: + + (1) void DS1302Init(struct_DS1302_RTC time):DS1302驱动函数。使用DS1302,需用该函数初始化和驱动一次 + 函数参数:结构struct_DS1302_RTC time + 如果DS1302掉电(初始化时检测RTC数据失效),则以参数time定义的时间初始化RTC + 函数返回值:无 + + (2) struct_DS1302_RTC RTC_Read(void):读取DS1302内部实时时钟RTC内容 + 函数参数:无 + 函数返回值:结构struct_DS1302(见结构struct_DS1302定义) + + (3) void RTC_Write(struct_DS1302_RTC time) :写DS1302内部实时时钟RTC内容 + 函数参数:结构struct_DS1302 time(见结构struct_DS1302定义) + 函数返回值:无 + + (4) unsigned char NVM_Read(unsigned char NVM_addr): 读取NVM一个指定地址内容 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值0~30(共31个单元) + 函数返回值:当函数参数正常时,返回NVM中对应单元的存储数值(1Byte) + 当函数参数错误时,返回enumDS1302_error + + (5) unsigned char NVM_Write(unsigned char NVM_addr, unsigned char NVM_data):向NVM一个指定地址写入新值 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值:0~30(共31个单元。其中,第30单元被DS1302Init()函数用于检测DS1302是否掉电,用户不能使用)) + NVM_data:待写入NVM单元的新值(1Byte) + 函数返回值:当函数参数正常时,返回enumDS1302_OK + 当函数参数错误时,返回enumDS1302_error + +结构struct_DS1302_RTC定义:(参见DS1302Z数据手册) +typedef struct + { unsigned char second; //秒(BCD码,以下均为BCD码) + unsigned char minute; //分 + unsigned char hour; //时 + unsigned char day; //日 + unsigned char month; //月 + unsigned char week; //星期 + unsigned char year; //年 + } struct_DS1302_RTC; + +关于DS1302内部非易失性存储器补充说明: + DS1302提供的非易失性存储器为低功耗RAM结构,靠纽扣电池保持掉电后其存储内容不变。 + 与M24C01区别:容量小(仅31字节),但无”写“寿命问题,且写周期很短(可忽略:即两次写操作之间无需等待); + 读、写DS1302内部NVM每一个字节均需要花费一定操作时间(数十uS); + 仅在需要时使用以上读或写函数读写需要的特定字节内容,应避免对其进行无效、大量、重复操作! + +编写:徐成(电话18008400450) 2021年8月5日设计,2021年8月15日改进 +*/ + +#ifndef _DS1302_H_ +#define _DS1302_H_ + +typedef struct + { unsigned char second; //秒(BCD码,以下均为BCD码) + unsigned char minute; //分 + unsigned char hour; //时 + unsigned char day; //日 + unsigned char month; //月 + unsigned char week; //星期 + unsigned char year; //年 + } struct_DS1302_RTC; + +extern void DS1302Init(struct_DS1302_RTC time); //DS1302初始化 +extern struct_DS1302_RTC RTC_Read(void); //读RTC(读RTC时钟内容) +extern void RTC_Write(struct_DS1302_RTC time); //写RTC(校对RTC时钟) +extern unsigned char NVM_Read(unsigned char NVM_addr); //读NVM(读DS1302中的非易失存储单元内容) +extern unsigned char NVM_Write(unsigned char NVM_addr, unsigned char NVM_data); //写NVM(写DS1302中的非易失存储单元) + +enum DS1302name {enumDS1302_OK,enumDS1302_error}; + +#endif \ No newline at end of file diff --git a/1919810_2/inc/EXT.h b/1919810_2/inc/EXT.h new file mode 100644 index 0000000..65b8b87 --- /dev/null +++ b/1919810_2/inc/EXT.h @@ -0,0 +1,64 @@ +/********************************** EXT V1.0 说明 *********************************************** + +EXT模块用于控制“STC-B学习板”上扩展接口EXT上相关操作。 +EXT模块根据应用需要,在外接相应模块或部件后,可实现多种相应功能。这里提供部分应用驱动和API函数。 +EXT模块这里提供1个驱动函数和若干个应用层API函数。 +EXT模块的API函数不是同时有效的,而是根据初始化函数参数不同而分别有效。 + + (1) void EXTInit(char EXTfunction):EXT初始化函数。 + 函数参数:EXTfunction。定义EXT接口功能 + EXTfunction 取值:enumEXTWeight(秤重:由HX710、HX711组成的电子秤) + enumEXTPWM (脉宽调制:可用于控制直流电机正反转、速度,灯亮度等) + enumEXTDecode(增量式计数) + enumEXTUltraSonic (超声波测距) + 函数返回值:无 + 注意:当EXT扩展接口用于串口2时(TTL Uart,可用于串行通信、蓝牙模块连接等),在使用Uart2Init()函数初始化EXT后,不要再使用EXTInit()函数,以免引起功能冲突 + + (2)API函数 + (a) 电子秤。当EXTInit(char EXTfunction)使用enumEXTWeight参数时,GetWeight函数有效。 + int GetWeight(void) //获取电子秤ADC秤重数据(16bit,带符号整数。未清零、未标定。参见HX710、HX711数据手册(高16bit)) + + (b) PWM脉宽调制输出。当EXTInit(char EXTfunction)使用enumEXTPWM参数时,SetPWM函数有效。 + void SetPWM(unsigned char PWM1, unsigned char freq1, unsigned char PWM2, unsigned char freq2); + //设置EXT上输出PWM(参数PWM为占空比(输出高电平时间的比例):0~100,单位%)。freqx为频率:1~255Hz) + //实际频率 = 1000/int(1000/freqx)。即:1000/i=4,5,6...1000,或250,200,167,143,125,111,100,91,83...1 + //可用于控制直流电机正反转、转速(配合H型桥式电路),灯亮度,等 + + (c) 旋转编码器、或增量式编码器。当EXTInit(char EXTfunction)使用enumEXTDecode参数时,GetDecode函数有效。 + int GetDecode(void); //获取增量编码器增量值(相对上次读取后的新增量) + + (d) 超声波测距。当EXTInit(char EXTfunction)使用enumEXTUltraSonic参数时,GetUltraSonic函数有效。 + int GetUltraSonic(void); //获取超声波测距值(每秒5次测量,返回值单位:cm) + + (e) RFID读卡(暂缓) + (g) (蓝牙、串口)见串口2 + (h) (气敏、数据采集、电子尺、额温)见ADC +编程注意事项: + + +编写:徐成(电话18008400450) 2021年8月24日设计 +*/ + +#ifndef _EXT_H_ +#define _EXT_H_ + +extern void EXTInit(char EXTfunction); //扩展接口初始化 +enum EXTname {enumEXTWeight //电子秤 + ,enumEXTPWM, //PWM,控制直流电机转动方向、快慢 + ,enumEXTDecode //增量式计数(旋转编码器) + ,enumEXTUltraSonic //超声波测距 + //串口2,蓝牙:见uart2模块 + //气敏、数据采集、电子尺、额温枪等:见ADC + }; +extern int GetWeight(void); //获取电子秤ADC秤重数据(HX710、HX711输出高16bit,带符号数整数。未清零、未标定) +extern int GetDecode(void); //获取增量编码器增量值(相对上次读取后的新增量) +extern int GetUltraSonic(void); //获取超声波测距值(每秒5次测量,返回值单位:cm) +extern void SetPWM(unsigned char PWM1, unsigned char freq1, unsigned char PWM2, unsigned char freq2); + //设置EXT上输出PWM(参数PWM为占空比(输出高电平时间的比例):0~100,单位%)。freqx为频率:1~255Hz) + //实际频率 = 1000/int(1000/freqx)。即:1000/i=4,5,6...1000,或250,200,167,143,125,111,100,91,83...1 + //可用于控制直流电机正反转、转速(配合H型桥式电路),灯亮度,等 + + + + +#endif \ No newline at end of file diff --git a/1919810_2/inc/FM_Radio.h b/1919810_2/inc/FM_Radio.h new file mode 100644 index 0000000..3b15155 --- /dev/null +++ b/1919810_2/inc/FM_Radio.h @@ -0,0 +1,49 @@ +/********************************** FMRadio V1.1 说明 ************************************************************************ +FMRadio模块用于控制“STC-B学习板”上FM收音机操作。 +FMRadio模块模块共提供1个初始化函数、2个应用函数 + + (1) void FMRadioInit(struct_FMRadio FMRadio); //收音机模块初始化函数。该函数只执行一次。初始化后,以下各应用函数方可正确使用。 + 函数参数:FMRadio (见结构struct_FMRadio定义) + 函数返回值:无 + + (2) void SetFMRadio(struct_FMRadio FMRadio); //设置FM收音机控制参数。 + 函数参数:FMRadio (见结构struct_FMRadio定义) + 函数返回值:无 + + (3) struct_FMRadio GetFMRadio(void); //获取当前FM收音机参数。 + 函数参数:无 + 函数返回值:返回FM控制模型数据(见结构struct_FMRadio定义) + +结构struct_FMRadio定义: + typedef struct //FM收音机控制模型 + { unsigned int frequency; // FM收音机收音频率 (frequency参数范围:887~1080。单位:0.1MHz,如887代表88.7MHz)。错误参数或参数与当前值无变化,将忽略 + unsigned char volume; // FM收音机音量 (volume参数范围:0~15。0为最小音量)。错误参数或参数与当前值无变化,将忽略 + unsigned char GP1; // FM指示灯1。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP2; // FM指示灯2。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP3; // FM指示灯3。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + } struct_FMRadio; + +编程注意事项: + 1,本版本暂未输出调谐、自动搜索、电台信号等控制和状态信息,因此,暂不能完成自动搜索电台等收音机功能。 + 2,FM收音机借用USB转串口模块(CH340)时钟(硬件设计原因),需要连接USB接口(供电、通信)到USB主设备,CH340方有时钟产生和输出。 + 故STC-B学习板的USB接口需要连接到一个USB主设备方可收音,仅USB供电时(如USB充电宝、或计算机休眠时的USB接口),FM收音机可能不工作 + +编写:徐成(电话18008400450) 2021年8月10日设计,2021年8月16日改进 +*/ + +#ifndef _FM_Radio_H_ +#define _FM_Radio_H_ + +typedef struct //FM收音机控制模型 + { unsigned int frequency; // FM收音机收音频率 (frequency参数范围:887~1080。单位:0.1MHz,如887代表88.7MHz)。错误参数或参数与当前值无变化,将忽略 + unsigned char volume; // FM收音机音量 (volume参数范围:0~15。0为最小音量)。错误参数或参数与当前值无变化,将忽略 + unsigned char GP1; // FM指示灯1。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP2; // FM指示灯2。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP3; // FM指示灯3。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + } struct_FMRadio; + +extern void FMRadioInit(struct_FMRadio FMRadio); //收音机模块初始化函数。输入FM控制模型数据,无返回值。初始化后,以下各应用函数方可正确使用 +extern void SetFMRadio(struct_FMRadio FMRadio); //设置FM收音机控制参数。输入FM控制模型数据,无返回值。 +extern struct_FMRadio GetFMRadio(void); //获取当前FM收音机参数。无输入参数,返回FM控制模型数据 + +#endif \ No newline at end of file diff --git a/1919810_2/inc/IR.h b/1919810_2/inc/IR.h new file mode 100644 index 0000000..2ae2d39 --- /dev/null +++ b/1919810_2/inc/IR.h @@ -0,0 +1,85 @@ +/********************************** IR V3.5a 说明 *********************************************** + +IR模块用于控制“STC-B学习板”上红外发送与接收控制,支持PWM、PPM红外编码协议的发送,PWM红外编码的接收,可用于制作红外遥控器、红外通信等。 +IR模块提供1个驱动函数、5个API应用函数、1个红外接收事件(enumEventIrRxd:红外Ir上收到一个数据包)。 +IR模块已不与串口通信(uart和uart2)冲突,可用与它们同时工作。(以前冲突) + + (1) void IrInit(unsigned char Protocol):IR模块初始化函数。 + 函数参数:unsigned char Protocol,定义红外协议。 + Protocol 暂仅提供取值:NEC_R05d(定义红外协议基本时间片时长 = 13.1*Protocol uS) + 函数返回值:无 + + (2) char IrTxdSet(unsigned char *pt,unsigned char num):以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等 + 函数参数:unsigned char *pt,指向待发送红外编码数据的首地址。编码规则如下: + 码1红外发送时长,码1红外发送停止时长 //单位:协议基本时间片的个数值,最大255。如当协议基本时间片为0.56mS时, + ,码2红外发送时长,码2红外发送停止时长 //如当协议基本时间片为0.56mS时,数值1代表0.56mS时长,3代表1.68mS时长,...... + ...... + ...... + ,码n红外发送时长,码n红外发送停止时长 + unsigned char num,待发送红外编码数据的大小(字节数) + 函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中 + (同IrPrint()函数返回值) + 补充说明:参照该格式定义和电器遥控器编码格式,可实现任何38KHz红外遥控器功能。 + + (3) char IrPrint(void *pt, unsigned char num)://以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与GetIrRxNum()、SetIrRxd()配合,可进行红外双机通信;等 + //红外发送数据格式为:引导码:发(16*基本时间片),停(8*基本时间片)。0.56mS时:发9mS、停4.5mS + 数据编码:"0" -- 发(1*基本时间片),停(1*基本时间片) + "1" -- 发(1*基本时间片),停(3*基本时间片) + 先发高位、后发低位 + 结束码:发(1*基本时间片),停(1*基本时间片) + //非阻塞函数,该函数从被调用到返回大约1uS左右时间,但所指定的数据经红外发送完毕则需要较长时间(每字节大约需要10mS量级时间)。 + //IrPrint()函数用法完全类似与uart模块的Uart1Print()和Uart2Print()用法,(仅num参数为unsigned char,可参照使用) + 函数参数:void *pt :指定发送数据包位置(数据包不含引导码、结束码信息,仅待发送的有效数据) + unsigned char num:发送数据包大小(字节数,不含引导码、结束码) + 函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中 + (同IrTxdSet()函数返回值) + + (4) void SetIrRxd(void *RxdPt,unsigned char RxdNmax):设置红外接收数据包存放位置、每个数据包最大字节数。 + 收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信 + 函数参数: void char *RxdPt:指定接收数据包存放区(首地址) + unsigned char RxdNmax:指定每个数据包接收最大字节数。当收到的数据大于Nmax后,将被丢弃。 + 函数返回值:无 + + (5) unsigned char GetIrRxNum(void):获取收到的红外接收数据包实际字节数。与SetIrRxd()配合,可实现红外数据包接收。(它机应使用IrPrint()函数发送数据包) + 返回取值 <= Ir接收缓冲区最大字节数(RxdNmax定义)。如果实际红外数据包字节数大于RxdNmax,收到的多余字节数将不被存储(也不进行计数) + 函数参数: 无 + 函数返回值:红外接收数据包大小(字节数)。 + 当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定 + + (6) char GetIrStatus(void): 获取Ir状态 + 函数返回值:enumIrFree:红外空闲 + enumIrBusy:红外正忙(正在发送数据包,或正在接收数据包) + + (7) 红外接收事件enumEventIrRxd:红外Ir上收到一个符合格式的数据包(红外格式见IrPrint()函数说明)。 + 如果接收数据包实际字节数大于Ir接收缓冲区最大字节数(RxdNmax定义),也在收到数据包结束符后产生enumEventIrRxd事件 + +补充说明: + (1) 串口1、串口2波特率可独立设置,互不影响. + (2) 串口1、串口2、红外通信可同时工作,互不影响 + (3) 串口1、串口2用法基本上完全一致,红外通信用法也基本相同。不同地方是: + a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作); + b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数; + c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。 + +编写:徐成(电话18008400450) 2021年8月24日设计,2021年11月5日更新 +*/ + +#ifndef _IR_H_ +#define _IR_H_ + +extern void IrInit(unsigned char Protocol); //IR模块初始化。参数:定义红外IR基本周期 +enum IrProtocalName {NEC_R05d=43}; //定义红外IR协议基本周期 = 43*1000/76 = 566 (uS) + +extern char IrTxdSet(unsigned char *pt,unsigned char num); //以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等 +extern char IrPrint(void *pt, unsigned char num); //以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与SetIrRxd()配合,可进行红外双机通信;等 +extern void SetIrRxd(void *RxdPt,unsigned char RxdNmax); //设置红外接收数据包存放位置、每个数据包最大字节数。收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信 +extern unsigned char GetIrRxNum(void); //当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定 +extern char GetIrStatus(void); //获取Ir状态,enumIrFree:红外接口空闲, enumIrBusy,红外接口正忙 + +enum IrActName {enumIrFree=0 //红外发送空闲 + ,enumIrBusy // 忙 + ,enumIrTxOK // 发送成功 + ,enumIrTxFailure}; // 发送失败(正忙) +#endif \ No newline at end of file diff --git a/1919810_2/inc/Key.H b/1919810_2/inc/Key.H new file mode 100644 index 0000000..57f6d07 --- /dev/null +++ b/1919810_2/inc/Key.H @@ -0,0 +1,34 @@ +/**********************************key V2.0 说明 ************************************************************************ +Key模块用于获取“STC-B学习板”上三个按键的状态。提供按键模块加载和一个应用函数,一个“按键事件:enumEventKey: + (1) KeyInit():按键模块加载函数; + (2) char GetKeyAct(char Key):获取按键状态。 + 函数参数:Key,指定要获取状态的按键。Key取值: + enumKey1 + enumKey2 + enumKey3 +(当参数取值超出有效范围,函数将返回fail) + 函数返回值: + enumKeyNull(无按键动作) + enumKeyPress(按下) + enumKeyRelease(抬起) + enumKeyFail(失败) + 返回值是经过多次检测按键实时状态和统计检测结果后(软件消抖)的有效事件。 + 每个按键查询一次后,事件值变成enumKeyNull。事件值仅查询一次有效。 + (3) 按键事件:enumEventKey + 当三个按键(enumKey1,enumKey2,enumKey3)中任意一个按键有”按下“或”抬起“动作时,将产生一个”按键事件“,响应按键事件的用户处理函数由用户编写,并有sys中提供的SetEventCallBack函数设置. + +补充说明:如果启用了ADC模块,按键3(Key3)任何操作在本模块不可检测到和有任何信息反应,这时按键3(Key3)任何操作将在ADC模块中检测和反应。使用方法相同,具体见ADC模块说明。 + +编写:徐成(电话18008400450) 2021年3月5日设计,2021年8月26日更新 +*/ + +#ifndef _key_H_ +#define _key_H_ + +extern void KeyInit(); +extern unsigned char GetKeyAct(char Key) ; //获取按键enumKey1,enumKey2,enumKey3事件 + //返回值:enumKeyNull——无,enumKeyPress——下降沿,enumKeyRelease——上升沿,enumKeyFail——错误 +enum KeyName {enumKey1,enumKey2,enumKey3}; //按键名 +enum KeyActName {enumKeyNull,enumKeyPress,enumKeyRelease,enumKeyFail}; //按键动作名 + +#endif \ No newline at end of file diff --git a/1919810_2/inc/M24C02.h b/1919810_2/inc/M24C02.h new file mode 100644 index 0000000..fc135cd --- /dev/null +++ b/1919810_2/inc/M24C02.h @@ -0,0 +1,32 @@ +/**********************************M24C02 V1.0 说明 ************************************************************************ +M24C02模块用于控制“STC-B学习板”上IIC接口的非易失存储器(NVM)M24C02芯片操作。 +M24C02提供2K bits(256 Bytes)非易失存储器(NVM)功能(非易失存储器单元地址为:00~0xff)。 +M24C0402模块共提供2个应用函数(本模块不需要初始化) + + (1) unsigned char M24C02_Read(unsigned char NVM_addr): 读取M24C02一个指定地址内容 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值00~0xff(共256个单元) + 函数返回值:返回M24C02中对应单元的存储数值(1Byte) + + (2) void M24C02_Write(unsigned char NVM_addr, unsigned char NVM_data):向M24C02一个指定地址写入新值 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值:00~0xff(共256个单元) + NVM_data:待写入M24C02单元的新值(1Byte) + +补充说明: + M24C02为非易失性存储器,其主要特点是:存储的内容在断电后能继续保存,一般用于保存断电需保留的工作系统参数; + 但读、写M24C02内部每一个字节均需要花费一定时间(每次读写操作大约数十uS,写周期为5~10mS),且有”写“寿命限制(每一单元大约”写“寿命为10万次量级寿命); + 与DS1302内部NVM区别:容量大(M24C02提供256字节,M24CXX系列最大可提供64K字节),但有“写”寿命限制(一般为数十万次“写”寿命“,且写周期长(5~10mS) + 因此,两次写操作之间需间隔5~10mS以上; + 仅在需要时使用以上读或写函数读写需要的特定字节内容,应避免对其进行无效、大量、重复操作! + +编写:徐成(电话18008400450) 2021年8月8日设计 +*/ + +#ifndef _M24C02_H_ +#define _M24C02_H_ + +extern unsigned char M24C02_Read(unsigned char NVM_addr); //读NVM(读M24C02中的非易失存储单元内容) +extern void M24C02_Write(unsigned char NVM_addr, unsigned char NVM_data); //写NVM(写M24C02中的非易失存储单元) + +#endif \ No newline at end of file diff --git a/1919810_2/inc/STC15F2K60S2.H b/1919810_2/inc/STC15F2K60S2.H new file mode 100644 index 0000000..96d807b --- /dev/null +++ b/1919810_2/inc/STC15F2K60S2.H @@ -0,0 +1,237 @@ +#ifndef __STC15F2K60S2_H_ +#define __STC15F2K60S2_H_ + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +sfr P_SW2 = 0xBA; //xxxx,x000 外设端口切换寄存器 + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 + +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 +sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +///////////////////////////////////////////////// + +#endif + diff --git a/1919810_2/inc/StepMotor.h b/1919810_2/inc/StepMotor.h new file mode 100644 index 0000000..6bbd1e8 --- /dev/null +++ b/1919810_2/inc/StepMotor.h @@ -0,0 +1,50 @@ +/**********************************StepMotor 说明 ************************************************************************ +StepMotor用于STC-B板控制步进电机。共提供1个驱动函数、3个应用函数: + (1) StepMotorInit():步进电机模块驱动函数 + (2) SetStepMotor(char StepMotor,unsigned char speed ,int steps ) 指定步进电机、按指定转动速度、转动指定步 + 函数参数:StepMotor 指定步进电机,取值(enum StepMotorName中定义) + enumStepMotor1: SM 接口上的步进电机 + enumStepMotor2: 此时,用L0~L3四个LED模拟一个4相步进电机 + enumStepMotor3: 此时,用L4~L7四个LED模拟一个4相步进电机 + speed 步进电机转动速度(0~255),单位:步/S。 (实际每步时间=int(1000mS/speed) mS),与设置速度可能存在一定误差 + steps 步进电机转动步数(-32768~32767),负值表示反转 + 函数返回:enumSetStepMotorOK: 调用成功(enum StepMotorActName中定义) + enumSetStepMotorFail:调用失败(电机名不在指定范围,或speed=0,或调用时正在转动) + (3)EmStop(char StepMotor) 紧急停止指定步进电机转动 + 函数参数:StepMotor 指定步进电机。函数参数不对将返回0值。 + 函数返回:剩余未转完的步数 + (4)GetStepMotorStatus(char StepMotor) 获取指定步进电机状态 + 函数参数:StepMotor 指定步进电机 + 函数返回:enumStepMotorFree:自由(enum StepMotorActName中定义) + enumStepMotorBusy,忙(正在转动) + enumSetStepMotorFail:调用失败(步进电机名不在指定范围) + +编写:徐成(电话18008400450) 2021年4月16日设计,2021年4月18日更新 +*/ + +#ifndef _StepMotor_H_ +#define _StepMotor_H_ + +extern void StepMotorInit(); // 步进电机模块初始化 +extern char SetStepMotor(char StepMotor,unsigned char speed ,int steps ); // 指定步进电机、按指定转动速度、转动指定步 + // 函数参数:StepMotor 指定步进电机,取值(enum StepMotorName中定义) + // enumStepMotor1: SM 接口上的步进电机 + // enumStepMotor2: 此时,用L0~L3四个LED模拟一个4相步进电机 + // enumStepMotor3: 此时,用L4~L7四个LED模拟一个4相步进电机 + // speed 步进电机转动速度(0~255),单位:步/S (实际每步时间=int(1000mS/speed) mS),与设置速度可能存在一定误差 + // steps 步进电机转动步数(-32768~32767),负值表示反转 + // 函数返回: + // enumSetStepMotorOK:调用成功 + // enumSetStepMotorFail:调用失败(电机名不在指定范围,或speed=0,或调用时正在转动) +extern int EmStop(char StepMotor); // 紧急停止指定步进电机转动 + // 函数参数:StepMotor 指定步进电机(函数参数不对将返回0值) + // 函数返回:剩余未转完的步数 +extern unsigned char GetStepMotorStatus(char StepMotor); // 获取指定步进电机状态 + // 函数参数:StepMotor 指定步进电机 + // 函数返回:enumStepMotorFree:自由 + // enumStepMotorBusy,忙(正在转动) + // enumSetStepMotorFail:调用失败(步进电机名不在指定范围) +enum StepMotorName {enumStepMotor1=0,enumStepMotor2,enumStepMotor3}; +enum StepMotorActName {enumStepMotorFree,enumStepMotorBusy,enumSetStepMotorOK,enumSetStepMotorFail}; + +#endif \ No newline at end of file diff --git a/1919810_2/inc/Vib.h b/1919810_2/inc/Vib.h new file mode 100644 index 0000000..ff8a281 --- /dev/null +++ b/1919810_2/inc/Vib.h @@ -0,0 +1,21 @@ +/**********************************振动传感器SV V2.0 说明 ************************************************************************ +SV用于获取"STC-B学习板"上Vib传感器状态.提供一个模块加载函数和一个应用函数,一个Vib事件enumEventVib: + (1) VibInit():振动传感器Vib模块初始化函数; + (2) char GetVibAct():获取Vib事件。 + 函数返回值:返回当前Vib传感器事件,返回值:enumVibNull——无,enumVibQuake——发生过振动 + 查询一次后,事件值变成 enumVibNull (仅查询一次有效) + (3) Vib传感器事件enumEventVib: + 当Vib检测到有”振动“事件时,将产生一个”振动事件“,响应事件的用户处理函数由用户编写, + 并有sys中提供的SetEventCallBack()函数设置. + +编写:徐成(电话18008400450) 2021年3月5日设计,2021年3月26日更新 +*/ + +#ifndef _Vib_H_ +#define _Vib_H_ + +extern void VibInit(); +extern unsigned char GetVibAct(void) reentrant; //获取Vib事件 +enum VibActName {enumVibNull,enumVibQuake}; //返回值:enuVibNull——无,enuVibQuake——发生过振动 + +#endif \ No newline at end of file diff --git a/1919810_2/inc/adc.h b/1919810_2/inc/adc.h new file mode 100644 index 0000000..eaf1a2c --- /dev/null +++ b/1919810_2/inc/adc.h @@ -0,0 +1,79 @@ +/**********************************ADC V3.5a 说明 ************************************************************************ +ADC模块用于“STC-B学习板”上与ADC相关电路:温度Rt、光照Rop、导航按键Nav、扩展接口EXT上的ADC转换。提供ADC模块初始化函数、2个应用函数,2个事件: + (1) AdcInit(char ADCsel):ADC模块初始化函数; + 函数参数: ADCsel选择扩展接口EXT是否用作ADC功能,取值: + ADCincEXT : 含对扩展接口EXT设置ADC功能(EXT上P1.0、P1.1不可作数字IO功能使用) + ADCexpEXT : 不含对扩展接口EXT设置ADC功能(EXT上P1.0、P1.1可作数字IO功能使用) + (2) struct_ADC GetADC():获取ADC值。 + 函数参数:无 + 函数返回值:返回数据结构 struct_ADC。 + 数据结构定义: + typedef struct //ADC转换结果 + { unsigned int EXT_P10; // 扩展接口EXT上P1.0脚ADC(10bit) + unsigned int EXT_P11; // 扩展接口EXT上P1.1脚ADC(10bit) + unsigned int Rt; // 热敏电阻上ADC(10bit) + unsigned int Rop; // 光敏电阻上ADC(10bit) + unsigned int Nav; // 导航按键上ADC(10bit) + } struct_ADC; + +说明1:每个数字表示 VCC/1024(单位:V),其中VCC为电路板供电电压(USB接口一般为5V左右) +说明2:对于导航按键,下面GetAdcNavAct函数输出消抖后导航按键事件和状态,更方便使用; + + (3) char GetAdcNavAct(char Nav_button):获取导航按键(包含K3)状态 + 函数参数:Nav_button:指定要获取状态的导航按键。取值: + enumAdcNavKey3(K3键), + enumAdcNavKeyRight(右按), + enumAdcNavKeyDown(下按), + enumAdcNavKeyCenter(中心按) + enumAdcNavKeyLeft(左按), + enumAdcNavKeyUp(上按). +(当参数取值不在有效范围,函数将返回enumKeyFail) + 函数返回值:返回当前按键事件,返回值:(同Key模块GetAdcKeyAct()返回值) + enumKeyNull(无按键动作), + enumKeyPress(按下), + enumKeyRelease(抬起), + enumKeyFail(失败) + 返回值是经过多次检测按键实时状态和统计检测结果后(软件消抖)的有效事件。 + 每个按键查询一次后,事件值变成 enumKeyNull (仅查询一次有效) + (4) 导航按键事件“:enumEventNav + 当导航按键5个方向或按键K3有任意”按下“或”抬起“动作时,将产生一个”导航按键事件“enumEventNav。响应导航按键事件的用户回调函数由用户编写,并由sys提供的SetEventCallBack()函数设置响应函数. + (5) 扩展接口EXT上P1.0、P1.1两个端口有新的AD值事件“:enumEventXADC + 当ADC模块对P1.0、P1.1进行ADC转换,获得了它们新的ADC结果时,将产生enumEventXADC事件,通知用户进行处理。响应enumEventXADC事件的用户回调函数由用户编写,并有sys提供的SetEventCallBack()函数设置响应函数. + ADC模块对P1.0、P1.1进行ADC转换速度为3mS,也即每3mS或每秒钟333次转换. + (6) 补充说明: + a:对EXT上P1.0、P1.0的转换速度为3mS,也即每秒钟提供333次转换结果,提供了有新转换结果事件:enumEventXADC,方便用户处理 +b:对于Rt、Rop,转换速度为9mS,也即每秒钟提供111次转换结果。没有提供相应“事件”,用户随时用函数GetAdcResult()查询和使用 + c:对导航按键进行了软件消抖处理,最快可支持导航按键每秒12次操作速度,提供了导航按键发生了操作事件:enumEventNav + d:由于导航按键与K3键共用了单片机同一个端口(P1.7),启用ADC模块后,P1.7口IO功能失效,只能用GetAdcNavAct(char Nav_button)函数获取K3按键的事件或状态。 + e: STC-B板上Rt型号为:10K/3950 NTC热敏电阻,光敏电阻Rop型号为:GL5516. 它们的ADC值与温度、光照强度关系请参阅它们的数据手册与STC-B电路图进行换算。 + + +编写:徐成(电话18008400450) 2021年3月25日设计,2021年8月30日修改 +*/ + +#ifndef _adc_H_ +#define _adc_H_ + +#define ADCincEXT 0x9B +#define ADCexpEXT 0x98 + +typedef struct //ADC转换结果 + { unsigned int EXT_P10; // 扩展接口EXT上P1.0脚ADC + unsigned int EXT_P11; // 扩展接口EXT上P1.1脚ADC + unsigned int Rt; // 热敏电阻上ADC + unsigned int Rop; // 光敏电阻上ADC + unsigned int Nav; // 导航按键上ADC + } struct_ADC; + +extern void AdcInit(char ADCsel); + +extern struct_ADC GetADC(); +extern unsigned char GetAdcNavAct(char Nav_button); //获取导航按键5个方向(右、下、中心、左、上)操作,以及按键K3操作的事件 + //返回值:enuKeyNull(无按键动作),enuKeyPress(按下),enuKeyRelease(抬起),enuKeyFail(失败) +enum KN_name {enumAdcNavKey3=0, //导航按键:按键K3 + enumAdcNavKeyRight, //导航按键:右 + enumAdcNavKeyDown, //导航按键:下 + enumAdcNavKeyCenter, //导航按键:中心 + enumAdcNavKeyLeft, //导航按键:左 + enumAdcNavKeyUp}; //导航按键:上 +#endif \ No newline at end of file diff --git a/1919810_2/inc/displayer.h b/1919810_2/inc/displayer.h new file mode 100644 index 0000000..9cd02dc --- /dev/null +++ b/1919810_2/inc/displayer.h @@ -0,0 +1,26 @@ +/**********************************display V2.0 说明 ************************************************************************ +displayer用于控制“STC-B学习板”上8个7段数码管(Seg7)和8个指示灯(Led)工作.提供显示模块加载和三个应用函数: + + (1) displayerInit():显示模块加载函数; + + (2) SetDisplayerArea(char Begin_of_scan,char Ending_of_Scan):设置LED启用区域。8个数码管从左至右编号分别为0——7,函数参数 + Begin_of_scan设定启用数码管起始编号,Ending_of_Scan为结束编号。设定范围内的数码管才工作和显示。 + 注:正常情况下,两个参数取值范围为0——7,且Ending_of_Scan>Begin_of_scan。但利用动态扫描和人眼视觉效果,可设置超出 + 该范围的参数,以实现特殊显示效果:如软件调整显示亮度,或非灯亮度显示,等; + + (3) Seg7Print(char d0,char d1,char d2,char d3,char d4,char d5,char d6,char d7):将8个参数值分别译码显示到对应的数码管上。 + 显示译码表(code char decode_table[])在main.c中,用户可以修改和增减. + + (4) LedPrint(char led_val):控制8个指示灯开关。参数light_val的8个bit位对应8个指示灯的开关,“1”——指示灯“亮” + +编写:徐成(电话18008400450) 2021年2月26日设计,2021年3月15日更新 +*/ + +#ifndef _displayer_H_ +#define _displayer_H_ +extern void DisplayerInit(); //加载显示模块工作 +extern void SetDisplayerArea(char Begin_of_scan,char Ending_of_Scan); //设置有效显示区域 +extern void Seg7Print(char d0,char d1,char d2,char d3,char d4,char d5,char d6,char d7); //在数码管上输出 +extern void LedPrint(char led_val); +#endif + diff --git a/1919810_2/inc/hall.H b/1919810_2/inc/hall.H new file mode 100644 index 0000000..bfcc3b1 --- /dev/null +++ b/1919810_2/inc/hall.H @@ -0,0 +1,24 @@ +/**********************************hall V2.0 说明 ************************************************************************ +Hall模块用于获取“STC-B学习板”上hall传感器状态。hall模块共提供1个加载函数、1个应用函数,一个Hall事件:enumEventHall + (1)HallInit():hall模块初始化函数 + (2)unsigned char GetHallAct(void):获取hall事件。 + 函数返回值: + enumHallNull(无变化) + enumHallGetClose(磁场接近) + enumHallGetAway(磁场离开) + 查询一次后,事件值变成enumEventHall (仅查询一次有效) + (3)hall传感器事件: + 当Hall检测到有"磁场接近"或"磁场离开"事件时,将产生一个Hall传感器事件(enumEventHall).响应事件的用户处理函数由用户编写, 并有sys中提供的SetEventCallBack()函数设置事件响应函数. + + +编写:徐成(电话18008400450) 2021年3月15日设计 2021年3月26日修改 +*/ + +#ifndef _hall_H_ +#define _hall_H_ + +extern void HallInit(void); //加载hall模块 +extern unsigned char GetHallAct(void); //获取hall事件 +enum HallActName {enumHallNull,enumHallGetClose,enumHallGetAway}; //返回值:enumHallNull——无,enumHallGetClose——下降沿(磁场接近),enumHallGetAway——上升沿(磁场离开) + +#endif \ No newline at end of file diff --git a/1919810_2/inc/music.h b/1919810_2/inc/music.h new file mode 100644 index 0000000..0c219a9 --- /dev/null +++ b/1919810_2/inc/music.h @@ -0,0 +1,100 @@ +/********************************** music V2.0 说明 ************************************************************************ +Music模块在Beep和Displayer模块基础上再次封装,用于控制“STC-B学习板”上播放音乐。加载该模块,将同时加载Beep模块、displayer模块。music模块共提供1个music驱动函数、4个应用函数: + (1)MusicPlayerInit():驱动music模块; + (2)char PlayTone(unsigned char tone, unsigned char beatsPM ,unsigned char scale, unsigned char beats):播放音乐音阶,实现用指定音调、指定节拍率、发指定音阶、发音节拍数。 +函数参数: + tone:指定音调,有效值:0xFA、0xFB、0xFC、0xFD、0xFE、0xFF、0xF9分别对应音乐A、B、C、D、E、F、G调 + beatsPM:节拍率,即每分钟节拍数,值范围10~255拍/分钟 + scale:音乐简谱音高,1字节。 +0x00——休止符 +高4位:1——低8度音 2——中8度音 3——高8度音 +低3位:1-7对应简谱音。其它值无效。 +如:0x13表示低音3(mi) + beats:音长(节拍数),单位1/16拍。 +如:16(0x10)对应1拍,32(0x20)对应2拍,8(0x08)对应半拍...... 。 +函数返回值:enumBeepOK:调用成功 + enumBeepBusy:忙(上一音未按设定发完,或因蜂鸣器正在发音) + enumBeepFail:调用失败(音调参数tone不对,或音高编码scale不对) + (见Beep.h中定义BeepActName) + (3)SetMusic(unsigned char beatsPM, unsigned char tone, unsigned char *pt, unsigned int datasize, unsigned char display):设定或改变要播放音乐和播放参数。 +函数参数: + beatsPM:节拍率,即每分钟节拍数,值范围10~255拍/分钟,如果参数值为enumModeInvalid将不改变原beatsPM; + tone:指定音调, 有效值:0xFA、0xFB、0xFC、0xFD、0xFE、0xFF、0xF9分别对应音乐A、B、C、D、E、F、G调,参数值为enumModeInvalid或其它值将不改变原tone + *pt :指向要播放的音乐编码的首地址 。*pt 和 datasize 只有有一个参数 = enumModeInvalid,将不改变 *pt 和 datasize + datasize:要播放的音乐编码的长度(字节数) 。*pt 和 datasize 只有有一个参数 = enumModeInvalid,将不改变 *pt 和 datasize + display:Seg7和Led是否用来显示播放音乐信息,取值: + enumMscNull —— 不用 + enumMscDrvSeg7 —— 用7段数码管Seg7(显示信息) + enumMscDrvLed —— 用Led指示灯(打拍) enumMscDrvSeg7andLed —— 用Seg7 和 Led + 参数值为enumModeInvalid或其它值将不改变原display +音乐编码规则: +1,常规音乐简谱发音编码(成对出现,不可分开,中间不能插入其它编码和控制字) + 基本格式:音高(1字节),节拍数(1字节),音高,节拍,...... + 其中“音高”部分: +0x11 — 0x17 :对应低音 do、re、mi、fa、so、la、si、 0x21 — 0x27 :对应中音 do、re、mi、fa、so、la、si + 0x31 — 0x37 :对应高音 do、re、mi、fa、so、la、si + 其中“节拍数”部分: +0x01-0xFF:单位1/16拍。也即十六进制中,高4位表示整拍数,低4位表示分拍数(1/16) + 如:发音2拍: 0x20 + 发音半拍: 0x08 + 发音1拍半:0x18 + 2,音乐编码中可以插入以下控制字,用于设定音乐播放参数等(前6个也可以通过函数,用程序设定和实现): + enumMscNull : 不用 + enumMscDrvSeg7 : 用7段数码管Seg7(显示信息) + enumMscDrvLed : 用Led指示灯(打拍) + enumMscDrvSeg7andLed : 用Seg7 和 Led + enumMscSetBeatsPM : 设置节拍率, 后面再跟 节拍率(1字节) + enumMscSetTone : 设置音调, 后面再跟 音调(1字节) +0xFA 或 0xFB 或 0xFC 或 0xFD 或 0xFE 或 0xFF 或 0xF9 +分别对应音乐:A调 或B调……… + enumMscRepeatBegin : 设置音乐播放重复开始处。重复一次(暂不支持多次),暂不能嵌套(嵌套无效或可能导致不可预期结果) + enumMscRepeatEnd : 设置音乐播放重复结束处 + + (4)SetPlayerMode(unsigned char play_ctrl) :音乐播放控制函数。 + 函数参数: + play_ctrl:enumModePlay : ”播放“ + enumModePause : ”暂停“ + enumModeStop :”停止/结束“ + (其它参数无效) +所有操作在当前”音“播放完成后生效; + (5)char GetPlayerMode(void): 获取当前播放状态 + 函数返回值:(play_ctrl值) + enumModePlay : 播放状态 + enumModePause : 暂停状态 + enumModeStop : 停止/结束 +(其它功能应用型函数可根据需要设置和增加) + + +编写:徐成(电话18008400450) 2021年3月5日设计,2021年9月5日更新 +*/ + +#ifndef _music_H_ +#define _music_H_ + +extern void MusicPlayerInit(); +extern char PlayTone(unsigned char tone, unsigned char beatsPM ,unsigned char scale, unsigned char beats); + // tone: 音调。F9,FA,FB,FC,FD,FE,FF分别对应G\A\B\C\D\E\F调,其它值无效 + // beatsPM:节凑,单位:每分钟节拍数 + // scale: 音高。0x00——休止符,高4位:1——低8度音 2——中8度音 3——高8度音,低3位:1-7简谱音。其它无效 + // beats: 音长(节拍数),单位1/16拍。16(0x10)对应1拍,32(0x20)对应2拍,8(0x08)对应半拍...... +extern void SetMusic(unsigned char beatsPM, unsigned char tone, unsigned char *pt, unsigned int datasize, unsigned char display); + //可设置或改变:全部、或部分播放参数(节拍率、音调、显示方式、音乐原数据) + //其中节拍率、音调、显示方式 也可以在音乐编码中设置 +extern void SetPlayerMode(unsigned char play_ctrl); + //操作播放:enumModePlay 或 enumModePause 或 enumModeStop,分别设置音乐”播放“、”暂停“、”停止/结束“,所有操作在当前”音“播放完成后生效; +extern char GetPlayerMode(void); //获取当前播放状态 + +enum PlayerMode {enumModeInvalid=0, //播放模式非法 + enumModePlay, //播放 + enumModePause, //暂停(可恢复续放) + enumModeStop}; //停止(结束) +enum MusicKeyword {enumMscNull=0xF0, //播放音乐时,不用7段数码管、LED指示灯(显示音乐播放相关信息) + enumMscDrvSeg7, //播放音乐时, 用7段数码管 + enumMscDrvLed, //播放音乐时, 用 LED指示灯 + enumMscDrvSeg7andLed, //播放音乐时, 用7段数码管、LED指示灯 + enumMscSetBeatsPM, //音乐编码中关键字: 设置 音乐节拍 + enumMscSetTone, //音乐编码中关键字: 设置 音调 + enumMscRepeatBegin, //音乐编码中关键字: 设置 重复开始 + enumMscRepeatEnd}; //音乐编码中关键字: 设置 重复结束 + +#endif \ No newline at end of file diff --git a/1919810_2/inc/sys.H b/1919810_2/inc/sys.H new file mode 100644 index 0000000..c03d3d8 --- /dev/null +++ b/1919810_2/inc/sys.H @@ -0,0 +1,63 @@ +/******************************* sys Ver3.6 说明 ************************************************ + (1) sys.c构成STC程序基本架构。提供: + a, 系统初始化MySTC_Init(),系统调度函数MySTC_OS(),加载用户回调函数SetEventCallBack() + b, 若干可设置和触发回调函数的事件; + enumEventSys1mS : 1mS定时到 + enumEventSys10mS : 10mS定时到 + enumEventSys100mS : 100mS定时到 + enumEventSys1S : 1S定时到 + enumEventKey : 按键事件 + enumEventNav : 导航按键事件“ + enumEventHall : hall传感器事件 + enumEventVib : 振动传感器事件 + enumEventXADC : 扩展接口上新的AD值事件 + enumEventUart1Rxd : 串口1上收到一个符合格式定义的数据包事件。串口1:USB上与PC机通信 + enumEventUart2Rxd : 串口2上收到一个符合格式定义的数据包事件。串口2:485上UART、EXT上UART、或485上ModBus协议(2022年5月2日新增) + enumEventIrRxd : 红外收到一个数据包事件 + c, 获取系统运行性能评价参数 + + (2) MySTC_Init():sys初始化函数,必须执行一次。 + (3) MySTC_OS(): sys调度函数,应在while(1)循环中。 + (4) SetEventCallBack(char event, void *(user_callback)):加载"事件"用户回调函数. + (5) SysPerF GetSysPerformance(void) :获取系统运行性能评估参数 + 函数参数:无 + 函数返回值:结构 struct SysPerF。定义如下: + typedef struct //系统性能评估参数,每秒更新一次 + { unsigned long MainLoops; //SysPerformance.MainLoops 每秒主循环次数(应大于1000以上) + unsigned char PollingMisses; //SysPerformance.PollingMisses 每秒轮询丢失次数(理想值为0。如果有非0情况,说明用户程序或算法存在问题) + } SysPerF; + + (6) 补充说明: + sys.c 基本调度时间为1mS,非抢占式,要求用户程序片段,其单次循环执行时间累加起来应小于1mS。 + +编写:徐成(电话18008400450) 2021年2月26日设计,2022年5月2日更新 +*/ + +#ifndef _sys_h_ +#define _sys_h_ + +typedef struct //系统性能评估参数,每秒更新一次 + { unsigned long MainLoops; //SysPerformance.MainLoops 每秒主循环次数(应大于1000以上) + unsigned char PollingMisses; //SysPerformance.PollingMisses 每秒轮询丢失次数(理想值为0。如果有非0情况,说明用户程序或算法存在问题) + } struct_SysPerF; + +extern void MySTC_Init(); //sys初始化函数 +extern void MySTC_OS(); //sys调度函数,应在while(1)循环中 +extern void SetEventCallBack(char event, void *(user_callback)); //加载"事件"用户回调函数. +extern struct_SysPerF GetSysPerformance(void); + +enum event{enumEventSys1mS, //系统1mS事件 + enumEventSys10mS, //系统10mS事件 + enumEventSys100mS, //系统100mS事件 + enumEventSys1S, //系统1S事件 + enumEventKey, //按键事件 + enumEventHall, //hall传感器事件 + enumEventVib, //振动传感器事件 + enumEventNav, //导航按键事件“ + enumEventXADC, //扩展接口上新的AD值事件 + enumEventUart1Rxd, //串口1上收到一个符合格式定义的事件 + enumEventUart2Rxd, //串口2上收到一个符合格式定义("数据包格式"、或"ModBus协议+数据包格式")的事件。 (2022年5月2日新增) + enumEventIrRxd //红外Ir上收到一个数据包 + }; + +#endif \ No newline at end of file diff --git a/1919810_2/inc/uart1.h b/1919810_2/inc/uart1.h new file mode 100644 index 0000000..ef39ba0 --- /dev/null +++ b/1919810_2/inc/uart1.h @@ -0,0 +1,58 @@ +/**********************************Uart1串行通信模块 V2.0 说明 ************************************************************************ +Uart1模块提供Uart1模块初始化函数、3个应用函数,1个事件(enumEventRxd): +(1) Uart1Init(unsigned long band):Uart1模块初始化函数。 + 函数参数:unsigned long band定义串口1的通信波特率(单位:bps)(8个数据位、1个停止位,无奇偶校验位) + 函数返回值:无 + +(2) void SetUart1Rxd(char *RxdPt, unsigned int Nmax, char *matchhead, unsigned int matchheadsize); + 设置串口1接收参数:数据包存放位置、大小,包头匹配字符、匹配字符个数。收到符合条件的数据包时将产生enumEventRxd事件。 + 函数参数: char *RxdPt:指定接收数据包存放区(首地址) + unsigned int Nmax:接收数据包大小(字节数),最大65535。当收到的数据大于Nmax后,将被丢弃 (2022年5月2日更改) + char *matchhead: 需要匹配的数据包头(首地址) + unsigned int matchheadsize:需要匹配的字节数 + 补充说明: + Nmax=1:为单字节接收,即收到一个字节就产生enumUart1EventRxd事件(如果定义了匹配,还需满足匹配条件); + 0 < matchheadsize < Nmax:要求接收数据中连续matchheadsize个字节与*matchhead处数据完全匹配,才在收到Nmax数据时产生enumEventRxd事件; + matchheadsize = Nmax:设定接收数据包完全匹配 + matchheadsize=0 或 matchheadsize > Nmax:将不做匹配,接收到任意Nmax数据时产生enumEventRxd事件; + 在enumEventRxd事件发出后,用户回调函数返回才接收下一个数据包 (2022年5月2日更改) + 函数返回值:无 + + (3) char Uart1Print(void *pt, unsigned int num):发送数据包,非阻塞函数(即函数不等到所设定任务全部完成才返回),该函数从被调用到返回大约1uS左右时间。 + 函数参数: void *pt :指定发送数据包位置 + unsigned int num:发送数据包大小; + 函数返回值:enumTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumTxFailure:调用失败(主要原因是:串口正忙(上一数据包未发完) + 补充说明:串口上发送1个字节数据大约需要时间0.1mS~10mS(视所设定的波特率),对计算机来说,如果发送多个字节是一个很要时间才能完成的事。类似于 + 前面用蜂鸣器演奏音乐,对这类事件与程序"异步"的问题,编程时不仅要注意程序逻辑性、还有注意程序时效性。(这个问题其实总是要注意、必须要注意的) + + (4) char GetUart1TxStatus(void): 获取Uart1发送状态 + 函数返回值:enumUart1TxFree:串口1发送空闲 + enumUart1TxBusy,串口1发送正忙 + + (5) Uart1接收事件:enumEventUart1Rxd。表示收到了一个符合指定要求(数据包头匹配、数据包大小一致)的数据包。 + 补充说明:串口(1和2)上收到的两个数据包之时间间隔要求不小于1mS(原因:系统内部调度方法限制) + +补充说明: + (1) 串口1、串口2波特率可独立设置,互不影响. + (2) 串口1、串口2、红外通信可同时工作,互不影响 + (3) 串口1、串口2用法基本上完全一致,红外通信用法也基本相同。不同地方是: + a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作); + b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数; + c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。 + + +编写:徐成(电话18008400450) 2021年3月28日设计 2021年11月8日更新 +*/ + + +#ifndef _uart1_H_ +#define _uart1_H_ + +extern void Uart1Init(unsigned long band); //串口初始化,参数:波特率 +extern void SetUart1Rxd(void *RxdPt, unsigned int Nmax, void *matchhead, unsigned int matchheadsize); //设置接收条件:数据包存放位置、大小,包头匹配字符、匹配字符个数。符合条件的包将产生enumEventRxd事件 +extern char Uart1Print(void *pt, unsigned int num); //发送数据包。非阻塞函数。数据包位置、大小。返回值enumTxOK调用成功,enumTxFailure失败(串口忙,上一数据包未发完) +extern char GetUart1TxStatus(void); //获取串口1发送状态,enumUart1TxFree:串口1发送空闲, enumUart1TxBusy,串口1发送正忙 +enum Uart1ActName {enumUart1TxFree=0,enumUart1TxBusy,enumUart1TxOK,enumUart1TxFailure}; + +#endif \ No newline at end of file diff --git a/1919810_2/inc/uart2.h b/1919810_2/inc/uart2.h new file mode 100644 index 0000000..0d68121 --- /dev/null +++ b/1919810_2/inc/uart2.h @@ -0,0 +1,65 @@ +/********************************** Uart2串行通信模块 V2.0 说明 *************************************************************** +Uart2模块提供Uart2模块初始化函数、3个应用函数,1个事件(enumUart2EventRxd): +(1) Uart2Init(unsigned long band,unsigned char Uart2mode):Uart2模块初始化函数。 + 函数参数:unsigned long band:定义串口2的通信波特率(单位:bps)(固定8个数据位、1个停止位,无奇偶校验位) + unsigned char Uart2mode:定义串口2位置 + 取值:Uart2UsedforEXT —— 串口2在EXT扩展插座上(TTL标准串口) + Uart2Usedfor485 —— 串口2用于485通信(半双工。发送数据包时不能接收数据) + Uart2Usedfor485ModBus —— 串口2用于485上,ModBus协议收发 (2022年5月2日新增) +(2) void SetUart2Rxd(char *RxdPt, unsigned int Nmax, char *matchhead, unsigned int matchheadsize); + 设置串口2接收参数:数据包存放位置、大小,包头匹配字符、匹配字符个数。收到符合条件的数据包时将产生enumEventRxd事件。 + 函数参数: char *RxdPt:指定接收数据包存放区(首地址) + unsigned int Nmax:接收数据包大小(字节数),最大65535。当收到的数据大于Nmax后,将被丢弃 (2022年5月2日更改) + char *matchhead: 需要匹配的数据包头(首地址) + unsigned int matchheadsize:需要匹配的字节数 + 补充说明: + Nmax=1:为单字节接收,即收到一个字节就产生enumEventUart2Rxd事件(如果定义了匹配,还需满足匹配条件); + 0 < matchheadsize < Nmax:要求接收数据中连续matchheadsize个字节与*matchhead处数据完全匹配,才在收到Nmax数据时产生enumEventRxd事件; + matchheadsize = Nmax:设定接收数据包完全匹配 + matchheadsize=0 或 matchheadsize > Nmax:将不做匹配,接收到任意Nmax数据时产生enumEventRxd事件; + 在enumEventRxd事件发出后,用户回调函数返回才接收下一个数据包 (2022年5月2日更改) +(3) char Uart2Print(void *pt, unsigned int num):发送数据包,非阻塞函数(即函数不等到所设定任务全部完成才返回),该函数从被调用到返回大约1uS左右时间。 + 函数参数: void *pt :指定发送数据包位置 + unsigned int num:发送数据包大小; + 函数返回值:enumTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumTxFailure:调用失败(主要原因是:串口正忙(上一数据包未发完) + 补充说明:串口上发送1个字节数据大约需要时间0.1mS~10mS(视所设定的波特率),对计算机来说,如果发送多个字节是一个很要时间才能完成的事。 + 类似于前面用蜂鸣器演奏音乐,对这类事件与程序"异步"的问题,编程时不仅要注意程序逻辑性、还有注意程序时效性。(这个问题其实总是要注意、必须要注意的) +(4) char GetUart2TxStatus(void): 获取Uart2发送状态 + 函数返回值:enumUart2TxFree:串口2发送空闲 + enumUart2TxBusy,串口2发送正忙 +(5) Uart2接收事件:enumUart2EventRxd。表示收到了一个符合指定要求(数据包头匹配、数据包大小一致)的数据包。 + 当串口2工作于: Uart2UsedforEXT 或 Uart2Usedfor485 方式时, + Uart2接收事件为:同串口1性质一致,即:数据包头匹配、数据包大小一致 + 当串口2工作于: Uart2Usedfor485ModBus 方式时, (2022年5月2日新增) + Uart2接收事件为:收到一个ModBus数据帧(数据包内字节间间隔<4字节收发时间),且帧内包头内容与设定内容匹配 + 但:1,数据帧内未进行CRC校验。建议用户在回调函数中,为了验证数据包正确性,应对数据包进行CRC校验 + 2,未返回ModBus数据帧有效字节数。用户可从收到的指令类型(第2字节)及对应帧内数据(一般第5、6字节)判断帧字节数 + 补充说明:串口(1和2)上收到的两个数据包之时间间隔要求不小于1mS(原因:系统内部调度方法限制) + +补充说明: + (1) 串口1、串口2波特率可独立设置,互不影响. + (2) 串口1、串口2、红外通信可同时工作,互不影响 + (3) 串口1、串口2(除开ModBus)用法基本上完全一致,红外通信用法也基本相同。不同地方是: + a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作); + b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数; + c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。 + (4)2022年5月2日新增串口2在485接口上支持ModBus协议数据帧监测功能,使"STC-B学习板"方便实现ModBus协议的节点等功能 (2022年5月2日新增) + +编写:徐成(电话18008400450) 2021年3月28日设计 2022年5月2日更新 +*/ + + +#ifndef _uart2_H_ +#define _uart2_H_ + +extern void Uart2Init(unsigned long band,unsigned char Uart2mode); //串口2初始化,参数:波特率、串口2位置 +enum Uart2PortName {Uart2UsedforEXT,Uart2Usedfor485,Uart2Usedfor485ModBus}; // Uart2UsedforEXT —— 串口2在EXT扩展插座上(TTL标准串口) + // Uart2Usedfor485 —— 串口2用于485通信(半双工。发送数据包时不能接收数据) + // Uart2Usedfor485ModBus —— 串口2用于485上,ModBus协议收发 +extern void SetUart2Rxd(void *RxdPt, unsigned int Nmax, void *matchhead, unsigned int matchheadsize); //设置接收条件:数据包存放位置、大小,包头匹配字符、匹配字符个数。符合条件的包将产生enumUart2EventRxd事件 +extern char Uart2Print(void *pt, unsigned int num); //发送数据包。非阻塞函数。数据包位置、大小。返回值enumUart2TxOK调用成功,enumUart2TxFailure失败(串口忙,上一数据包未发完) +extern char GetUart2TxStatus(void); //获取串口2发送状态,enumUart2TxFree:串口2发送空闲, enumUart2TxBusy,串口2发送正忙 +enum Uart2ActName {enumUart2TxFree=0,enumUart2TxBusy,enumUart2TxOK,enumUart2TxFailure}; + +#endif \ No newline at end of file diff --git a/1919810_2/source/STCBSP_V3.6.LIB b/1919810_2/source/STCBSP_V3.6.LIB new file mode 100644 index 0000000..bf42f13 Binary files /dev/null and b/1919810_2/source/STCBSP_V3.6.LIB differ diff --git a/1919810_2/source/main.c b/1919810_2/source/main.c new file mode 100644 index 0000000..e754455 --- /dev/null +++ b/1919810_2/source/main.c @@ -0,0 +1,43 @@ +// This project is used for demonstrating digital tubes of BSP library. +#include "STC15F2K60S2.H" +#include "displayer.h" +#include "sys.H" + +code unsigned long SysClock = 11059200; //蹇呴』銆傚畾涔夌郴缁熷伐浣滄椂閽熼鐜(Hz)锛岀敤鎴峰繀椤讳慨鏀规垚涓庡疄闄呭伐浣滈鐜囷紙涓嬭浇鏃堕夋嫨鐨勶級涓鑷 +#ifdef _displayer_H_ //鏄剧ず妯″潡閫夌敤鏃跺繀椤汇傦紙鏁扮爜绠℃樉绀鸿瘧鐮佽〃锛岀敤鎴跺彲淇敼銆佸鍔犵瓑锛 +code char decode_table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x08, 0x40, 0x01, 0x41, 0x48, + /* 搴忓彿: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ + /* 鏄剧ず: 0 1 2 3 4 5 6 7 8 9 (鏃) 涓- 涓- 涓- 涓婁腑- 涓笅- */ + 0x3f | 0x80, 0x06 | 0x80, 0x5b | 0x80, 0x4f | 0x80, 0x66 | 0x80, 0x6d | 0x80, 0x7d | 0x80, 0x07 | 0x80, 0x7f | 0x80, 0x6f | 0x80}; +/* 甯﹀皬鏁扮偣 0 1 2 3 4 5 6 7 8 9 */ +#endif + +void switch_status() +{ + static int status; + if (status == 0) + { + SetDisplayerArea(2, 7); + Seg7Print(0, 0, 1, 1, 4, 5, 1, 4); + status = 1; + } + else + { + SetDisplayerArea(1, 7); + Seg7Print(0, 1, 9, 1, 9, 8, 1, 0); + status = 0; + } +} + +void main() +{ + DisplayerInit(); + SetDisplayerArea(0, 7); + LedPrint(0); + SetEventCallBack(enumEventSys1S, switch_status); + MySTC_Init(); + while (1) + { + MySTC_OS(); + } +} diff --git a/key/inc/Beep.h b/key/inc/Beep.h new file mode 100644 index 0000000..a95550e --- /dev/null +++ b/key/inc/Beep.h @@ -0,0 +1,28 @@ +/**********************************Beep V2.0 说明 ************************************************************************ +Beep用于控制“STC-B学习板”上无源蜂鸣器的发声。Beep模块共提供1个驱动函数、2个应用函数: + (1) BeepInit():蜂鸣器模块驱动函数 + (2) Set_Beep(unsigned int Beep_freq, unsigned char Beep_time):控制蜂鸣器发声,非阻塞型 + 函数参数: + Beep_freq:指定发声频率,单位Hz。小于10将无输出 + Beep_time:指定发声时长。发声时长=10*Beep_time (mS) ,最长 655350mS + 函数返回值:enumSetBeepOK:调用成功,enumSetBeepFail:调用失败(或因蜂鸣器正在发音) + (3) GetBeepStatus(void): 获取Beep当前状态,enmuBeepFree:空闲, enumBeepBusy ,正在发音 + (4) Beep模块使用了STC内部CCP模块1通道 + +编写:徐成(电话18008400450) 2021年3月3日设计,2021年3月26日更新 +*/ + +#ifndef _beep_H_ +#define _beep_H_ + +extern void BeepInit(); // 蜂鸣器初始化 + +extern char SetBeep(unsigned int Beep_freq, unsigned int Beep_time); // 发指定频率声音, 发声时长=10×Beep_time (mS) ,最长 655350mS + // Beep_freq < 10 Hz, 不发音 + // 函数返回 enumSetBeepOK:调用成功, enumSetBeepFail:调用失败(调用时正在发音) + +extern unsigned char GetBeepStatus(void); // 获取状态,enumBeepFree:自由, enumBeepBusy,正在发声 + +enum BeepActName {enumBeepFree=0,enumBeepBusy,enumSetBeepOK,enumSetBeepFail}; + +#endif \ No newline at end of file diff --git a/key/inc/DS1302.h b/key/inc/DS1302.h new file mode 100644 index 0000000..377b96e --- /dev/null +++ b/key/inc/DS1302.h @@ -0,0 +1,75 @@ +/**********************************DS1302 V1.1 说明 ************************************************************************ +DS1302模块用于控制“STC-B学习板”上DS1302芯片操作。 +DS1302提供RTC(实时时钟)和NVM(非易失存储器)功能(断电后,RTC和NVM是依靠纽扣电池BAT维持工作的)。其中: + RTC提供:年、月、日、星期、时、分、秒功能 + NVM提供:31 Bytes非易失存储器功能(地址为:0~30)。其中,地址为30的单元被DS1302Init()函数用于检测DS1302是否掉电,用户不能使用) +DS1302模块共提供1个驱动函数、4个应用函数: + + (1) void DS1302Init(struct_DS1302_RTC time):DS1302驱动函数。使用DS1302,需用该函数初始化和驱动一次 + 函数参数:结构struct_DS1302_RTC time + 如果DS1302掉电(初始化时检测RTC数据失效),则以参数time定义的时间初始化RTC + 函数返回值:无 + + (2) struct_DS1302_RTC RTC_Read(void):读取DS1302内部实时时钟RTC内容 + 函数参数:无 + 函数返回值:结构struct_DS1302(见结构struct_DS1302定义) + + (3) void RTC_Write(struct_DS1302_RTC time) :写DS1302内部实时时钟RTC内容 + 函数参数:结构struct_DS1302 time(见结构struct_DS1302定义) + 函数返回值:无 + + (4) unsigned char NVM_Read(unsigned char NVM_addr): 读取NVM一个指定地址内容 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值0~30(共31个单元) + 函数返回值:当函数参数正常时,返回NVM中对应单元的存储数值(1Byte) + 当函数参数错误时,返回enumDS1302_error + + (5) unsigned char NVM_Write(unsigned char NVM_addr, unsigned char NVM_data):向NVM一个指定地址写入新值 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值:0~30(共31个单元。其中,第30单元被DS1302Init()函数用于检测DS1302是否掉电,用户不能使用)) + NVM_data:待写入NVM单元的新值(1Byte) + 函数返回值:当函数参数正常时,返回enumDS1302_OK + 当函数参数错误时,返回enumDS1302_error + +结构struct_DS1302_RTC定义:(参见DS1302Z数据手册) +typedef struct + { unsigned char second; //秒(BCD码,以下均为BCD码) + unsigned char minute; //分 + unsigned char hour; //时 + unsigned char day; //日 + unsigned char month; //月 + unsigned char week; //星期 + unsigned char year; //年 + } struct_DS1302_RTC; + +关于DS1302内部非易失性存储器补充说明: + DS1302提供的非易失性存储器为低功耗RAM结构,靠纽扣电池保持掉电后其存储内容不变。 + 与M24C01区别:容量小(仅31字节),但无”写“寿命问题,且写周期很短(可忽略:即两次写操作之间无需等待); + 读、写DS1302内部NVM每一个字节均需要花费一定操作时间(数十uS); + 仅在需要时使用以上读或写函数读写需要的特定字节内容,应避免对其进行无效、大量、重复操作! + +编写:徐成(电话18008400450) 2021年8月5日设计,2021年8月15日改进 +*/ + +#ifndef _DS1302_H_ +#define _DS1302_H_ + +typedef struct + { unsigned char second; //秒(BCD码,以下均为BCD码) + unsigned char minute; //分 + unsigned char hour; //时 + unsigned char day; //日 + unsigned char month; //月 + unsigned char week; //星期 + unsigned char year; //年 + } struct_DS1302_RTC; + +extern void DS1302Init(struct_DS1302_RTC time); //DS1302初始化 +extern struct_DS1302_RTC RTC_Read(void); //读RTC(读RTC时钟内容) +extern void RTC_Write(struct_DS1302_RTC time); //写RTC(校对RTC时钟) +extern unsigned char NVM_Read(unsigned char NVM_addr); //读NVM(读DS1302中的非易失存储单元内容) +extern unsigned char NVM_Write(unsigned char NVM_addr, unsigned char NVM_data); //写NVM(写DS1302中的非易失存储单元) + +enum DS1302name {enumDS1302_OK,enumDS1302_error}; + +#endif \ No newline at end of file diff --git a/key/inc/EXT.h b/key/inc/EXT.h new file mode 100644 index 0000000..65b8b87 --- /dev/null +++ b/key/inc/EXT.h @@ -0,0 +1,64 @@ +/********************************** EXT V1.0 说明 *********************************************** + +EXT模块用于控制“STC-B学习板”上扩展接口EXT上相关操作。 +EXT模块根据应用需要,在外接相应模块或部件后,可实现多种相应功能。这里提供部分应用驱动和API函数。 +EXT模块这里提供1个驱动函数和若干个应用层API函数。 +EXT模块的API函数不是同时有效的,而是根据初始化函数参数不同而分别有效。 + + (1) void EXTInit(char EXTfunction):EXT初始化函数。 + 函数参数:EXTfunction。定义EXT接口功能 + EXTfunction 取值:enumEXTWeight(秤重:由HX710、HX711组成的电子秤) + enumEXTPWM (脉宽调制:可用于控制直流电机正反转、速度,灯亮度等) + enumEXTDecode(增量式计数) + enumEXTUltraSonic (超声波测距) + 函数返回值:无 + 注意:当EXT扩展接口用于串口2时(TTL Uart,可用于串行通信、蓝牙模块连接等),在使用Uart2Init()函数初始化EXT后,不要再使用EXTInit()函数,以免引起功能冲突 + + (2)API函数 + (a) 电子秤。当EXTInit(char EXTfunction)使用enumEXTWeight参数时,GetWeight函数有效。 + int GetWeight(void) //获取电子秤ADC秤重数据(16bit,带符号整数。未清零、未标定。参见HX710、HX711数据手册(高16bit)) + + (b) PWM脉宽调制输出。当EXTInit(char EXTfunction)使用enumEXTPWM参数时,SetPWM函数有效。 + void SetPWM(unsigned char PWM1, unsigned char freq1, unsigned char PWM2, unsigned char freq2); + //设置EXT上输出PWM(参数PWM为占空比(输出高电平时间的比例):0~100,单位%)。freqx为频率:1~255Hz) + //实际频率 = 1000/int(1000/freqx)。即:1000/i=4,5,6...1000,或250,200,167,143,125,111,100,91,83...1 + //可用于控制直流电机正反转、转速(配合H型桥式电路),灯亮度,等 + + (c) 旋转编码器、或增量式编码器。当EXTInit(char EXTfunction)使用enumEXTDecode参数时,GetDecode函数有效。 + int GetDecode(void); //获取增量编码器增量值(相对上次读取后的新增量) + + (d) 超声波测距。当EXTInit(char EXTfunction)使用enumEXTUltraSonic参数时,GetUltraSonic函数有效。 + int GetUltraSonic(void); //获取超声波测距值(每秒5次测量,返回值单位:cm) + + (e) RFID读卡(暂缓) + (g) (蓝牙、串口)见串口2 + (h) (气敏、数据采集、电子尺、额温)见ADC +编程注意事项: + + +编写:徐成(电话18008400450) 2021年8月24日设计 +*/ + +#ifndef _EXT_H_ +#define _EXT_H_ + +extern void EXTInit(char EXTfunction); //扩展接口初始化 +enum EXTname {enumEXTWeight //电子秤 + ,enumEXTPWM, //PWM,控制直流电机转动方向、快慢 + ,enumEXTDecode //增量式计数(旋转编码器) + ,enumEXTUltraSonic //超声波测距 + //串口2,蓝牙:见uart2模块 + //气敏、数据采集、电子尺、额温枪等:见ADC + }; +extern int GetWeight(void); //获取电子秤ADC秤重数据(HX710、HX711输出高16bit,带符号数整数。未清零、未标定) +extern int GetDecode(void); //获取增量编码器增量值(相对上次读取后的新增量) +extern int GetUltraSonic(void); //获取超声波测距值(每秒5次测量,返回值单位:cm) +extern void SetPWM(unsigned char PWM1, unsigned char freq1, unsigned char PWM2, unsigned char freq2); + //设置EXT上输出PWM(参数PWM为占空比(输出高电平时间的比例):0~100,单位%)。freqx为频率:1~255Hz) + //实际频率 = 1000/int(1000/freqx)。即:1000/i=4,5,6...1000,或250,200,167,143,125,111,100,91,83...1 + //可用于控制直流电机正反转、转速(配合H型桥式电路),灯亮度,等 + + + + +#endif \ No newline at end of file diff --git a/key/inc/FM_Radio.h b/key/inc/FM_Radio.h new file mode 100644 index 0000000..3b15155 --- /dev/null +++ b/key/inc/FM_Radio.h @@ -0,0 +1,49 @@ +/********************************** FMRadio V1.1 说明 ************************************************************************ +FMRadio模块用于控制“STC-B学习板”上FM收音机操作。 +FMRadio模块模块共提供1个初始化函数、2个应用函数 + + (1) void FMRadioInit(struct_FMRadio FMRadio); //收音机模块初始化函数。该函数只执行一次。初始化后,以下各应用函数方可正确使用。 + 函数参数:FMRadio (见结构struct_FMRadio定义) + 函数返回值:无 + + (2) void SetFMRadio(struct_FMRadio FMRadio); //设置FM收音机控制参数。 + 函数参数:FMRadio (见结构struct_FMRadio定义) + 函数返回值:无 + + (3) struct_FMRadio GetFMRadio(void); //获取当前FM收音机参数。 + 函数参数:无 + 函数返回值:返回FM控制模型数据(见结构struct_FMRadio定义) + +结构struct_FMRadio定义: + typedef struct //FM收音机控制模型 + { unsigned int frequency; // FM收音机收音频率 (frequency参数范围:887~1080。单位:0.1MHz,如887代表88.7MHz)。错误参数或参数与当前值无变化,将忽略 + unsigned char volume; // FM收音机音量 (volume参数范围:0~15。0为最小音量)。错误参数或参数与当前值无变化,将忽略 + unsigned char GP1; // FM指示灯1。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP2; // FM指示灯2。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP3; // FM指示灯3。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + } struct_FMRadio; + +编程注意事项: + 1,本版本暂未输出调谐、自动搜索、电台信号等控制和状态信息,因此,暂不能完成自动搜索电台等收音机功能。 + 2,FM收音机借用USB转串口模块(CH340)时钟(硬件设计原因),需要连接USB接口(供电、通信)到USB主设备,CH340方有时钟产生和输出。 + 故STC-B学习板的USB接口需要连接到一个USB主设备方可收音,仅USB供电时(如USB充电宝、或计算机休眠时的USB接口),FM收音机可能不工作 + +编写:徐成(电话18008400450) 2021年8月10日设计,2021年8月16日改进 +*/ + +#ifndef _FM_Radio_H_ +#define _FM_Radio_H_ + +typedef struct //FM收音机控制模型 + { unsigned int frequency; // FM收音机收音频率 (frequency参数范围:887~1080。单位:0.1MHz,如887代表88.7MHz)。错误参数或参数与当前值无变化,将忽略 + unsigned char volume; // FM收音机音量 (volume参数范围:0~15。0为最小音量)。错误参数或参数与当前值无变化,将忽略 + unsigned char GP1; // FM指示灯1。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP2; // FM指示灯2。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + unsigned char GP3; // FM指示灯3。 =0 输出低,GP1亮; !=0 输出高,GP1灭 + } struct_FMRadio; + +extern void FMRadioInit(struct_FMRadio FMRadio); //收音机模块初始化函数。输入FM控制模型数据,无返回值。初始化后,以下各应用函数方可正确使用 +extern void SetFMRadio(struct_FMRadio FMRadio); //设置FM收音机控制参数。输入FM控制模型数据,无返回值。 +extern struct_FMRadio GetFMRadio(void); //获取当前FM收音机参数。无输入参数,返回FM控制模型数据 + +#endif \ No newline at end of file diff --git a/key/inc/IR.h b/key/inc/IR.h new file mode 100644 index 0000000..2ae2d39 --- /dev/null +++ b/key/inc/IR.h @@ -0,0 +1,85 @@ +/********************************** IR V3.5a 说明 *********************************************** + +IR模块用于控制“STC-B学习板”上红外发送与接收控制,支持PWM、PPM红外编码协议的发送,PWM红外编码的接收,可用于制作红外遥控器、红外通信等。 +IR模块提供1个驱动函数、5个API应用函数、1个红外接收事件(enumEventIrRxd:红外Ir上收到一个数据包)。 +IR模块已不与串口通信(uart和uart2)冲突,可用与它们同时工作。(以前冲突) + + (1) void IrInit(unsigned char Protocol):IR模块初始化函数。 + 函数参数:unsigned char Protocol,定义红外协议。 + Protocol 暂仅提供取值:NEC_R05d(定义红外协议基本时间片时长 = 13.1*Protocol uS) + 函数返回值:无 + + (2) char IrTxdSet(unsigned char *pt,unsigned char num):以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等 + 函数参数:unsigned char *pt,指向待发送红外编码数据的首地址。编码规则如下: + 码1红外发送时长,码1红外发送停止时长 //单位:协议基本时间片的个数值,最大255。如当协议基本时间片为0.56mS时, + ,码2红外发送时长,码2红外发送停止时长 //如当协议基本时间片为0.56mS时,数值1代表0.56mS时长,3代表1.68mS时长,...... + ...... + ...... + ,码n红外发送时长,码n红外发送停止时长 + unsigned char num,待发送红外编码数据的大小(字节数) + 函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中 + (同IrPrint()函数返回值) + 补充说明:参照该格式定义和电器遥控器编码格式,可实现任何38KHz红外遥控器功能。 + + (3) char IrPrint(void *pt, unsigned char num)://以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与GetIrRxNum()、SetIrRxd()配合,可进行红外双机通信;等 + //红外发送数据格式为:引导码:发(16*基本时间片),停(8*基本时间片)。0.56mS时:发9mS、停4.5mS + 数据编码:"0" -- 发(1*基本时间片),停(1*基本时间片) + "1" -- 发(1*基本时间片),停(3*基本时间片) + 先发高位、后发低位 + 结束码:发(1*基本时间片),停(1*基本时间片) + //非阻塞函数,该函数从被调用到返回大约1uS左右时间,但所指定的数据经红外发送完毕则需要较长时间(每字节大约需要10mS量级时间)。 + //IrPrint()函数用法完全类似与uart模块的Uart1Print()和Uart2Print()用法,(仅num参数为unsigned char,可参照使用) + 函数参数:void *pt :指定发送数据包位置(数据包不含引导码、结束码信息,仅待发送的有效数据) + unsigned char num:发送数据包大小(字节数,不含引导码、结束码) + 函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中 + (同IrTxdSet()函数返回值) + + (4) void SetIrRxd(void *RxdPt,unsigned char RxdNmax):设置红外接收数据包存放位置、每个数据包最大字节数。 + 收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信 + 函数参数: void char *RxdPt:指定接收数据包存放区(首地址) + unsigned char RxdNmax:指定每个数据包接收最大字节数。当收到的数据大于Nmax后,将被丢弃。 + 函数返回值:无 + + (5) unsigned char GetIrRxNum(void):获取收到的红外接收数据包实际字节数。与SetIrRxd()配合,可实现红外数据包接收。(它机应使用IrPrint()函数发送数据包) + 返回取值 <= Ir接收缓冲区最大字节数(RxdNmax定义)。如果实际红外数据包字节数大于RxdNmax,收到的多余字节数将不被存储(也不进行计数) + 函数参数: 无 + 函数返回值:红外接收数据包大小(字节数)。 + 当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定 + + (6) char GetIrStatus(void): 获取Ir状态 + 函数返回值:enumIrFree:红外空闲 + enumIrBusy:红外正忙(正在发送数据包,或正在接收数据包) + + (7) 红外接收事件enumEventIrRxd:红外Ir上收到一个符合格式的数据包(红外格式见IrPrint()函数说明)。 + 如果接收数据包实际字节数大于Ir接收缓冲区最大字节数(RxdNmax定义),也在收到数据包结束符后产生enumEventIrRxd事件 + +补充说明: + (1) 串口1、串口2波特率可独立设置,互不影响. + (2) 串口1、串口2、红外通信可同时工作,互不影响 + (3) 串口1、串口2用法基本上完全一致,红外通信用法也基本相同。不同地方是: + a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作); + b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数; + c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。 + +编写:徐成(电话18008400450) 2021年8月24日设计,2021年11月5日更新 +*/ + +#ifndef _IR_H_ +#define _IR_H_ + +extern void IrInit(unsigned char Protocol); //IR模块初始化。参数:定义红外IR基本周期 +enum IrProtocalName {NEC_R05d=43}; //定义红外IR协议基本周期 = 43*1000/76 = 566 (uS) + +extern char IrTxdSet(unsigned char *pt,unsigned char num); //以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等 +extern char IrPrint(void *pt, unsigned char num); //以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与SetIrRxd()配合,可进行红外双机通信;等 +extern void SetIrRxd(void *RxdPt,unsigned char RxdNmax); //设置红外接收数据包存放位置、每个数据包最大字节数。收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信 +extern unsigned char GetIrRxNum(void); //当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定 +extern char GetIrStatus(void); //获取Ir状态,enumIrFree:红外接口空闲, enumIrBusy,红外接口正忙 + +enum IrActName {enumIrFree=0 //红外发送空闲 + ,enumIrBusy // 忙 + ,enumIrTxOK // 发送成功 + ,enumIrTxFailure}; // 发送失败(正忙) +#endif \ No newline at end of file diff --git a/key/inc/Key.H b/key/inc/Key.H new file mode 100644 index 0000000..4902f4a --- /dev/null +++ b/key/inc/Key.H @@ -0,0 +1,34 @@ +/**********************************key V2.0 璇存槑 ************************************************************************ +Key妯″潡鐢ㄤ簬鑾峰彇鈥淪TC-B瀛︿範鏉库濅笂涓変釜鎸夐敭鐨勭姸鎬併傛彁渚涙寜閿ā鍧楀姞杞藉拰涓涓簲鐢ㄥ嚱鏁,涓涓滄寜閿簨浠讹細enumEventKey锛 + (1) KeyInit()锛氭寜閿ā鍧楀姞杞藉嚱鏁帮紱 + (2) char GetKeyAct(char Key)锛氳幏鍙栨寜閿姸鎬併 + 鍑芥暟鍙傛暟锛欿ey锛屾寚瀹氳鑾峰彇鐘舵佺殑鎸夐敭銆侹ey鍙栧硷細 + enumKey1 + enumKey2 + enumKey3 +锛堝綋鍙傛暟鍙栧艰秴鍑烘湁鏁堣寖鍥达紝鍑芥暟灏嗚繑鍥瀎ail锛 + 鍑芥暟杩斿洖鍊硷細 + enumKeyNull锛堟棤鎸夐敭鍔ㄤ綔锛 + enumKeyPress锛堟寜涓嬶級 + enumKeyRelease锛堟姮璧凤級 + enumKeyFail锛堝け璐ワ級 + 杩斿洖鍊兼槸缁忚繃澶氭妫娴嬫寜閿疄鏃剁姸鎬佸拰缁熻妫娴嬬粨鏋滃悗锛堣蒋浠舵秷鎶栵級鐨勬湁鏁堜簨浠躲 + 姣忎釜鎸夐敭鏌ヨ涓娆″悗,浜嬩欢鍊煎彉鎴恊numKeyNull銆備簨浠跺间粎鏌ヨ涓娆℃湁鏁堛 + (3) 鎸夐敭浜嬩欢锛歟numEventKey + 褰撲笁涓寜閿紙enumKey1,enumKey2,enumKey3锛変腑浠绘剰涓涓寜閿湁鈥濇寜涓嬧滄垨鈥濇姮璧封滃姩浣滄椂锛屽皢浜х敓涓涓濇寜閿簨浠垛滐紝鍝嶅簲鎸夐敭浜嬩欢鐨勭敤鎴峰鐞嗗嚱鏁扮敱鐢ㄦ埛缂栧啓,骞舵湁sys涓彁渚涚殑SetEventCallBack鍑芥暟璁剧疆. + +琛ュ厖璇存槑锛氬鏋滃惎鐢ㄤ簡ADC妯″潡锛屾寜閿3锛圞ey3锛変换浣曟搷浣滃湪鏈ā鍧椾笉鍙娴嬪埌鍜屾湁浠讳綍淇℃伅鍙嶅簲锛岃繖鏃舵寜閿3锛圞ey3锛変换浣曟搷浣滃皢鍦ˋDC妯″潡涓娴嬪拰鍙嶅簲銆備娇鐢ㄦ柟娉曠浉鍚岋紝鍏蜂綋瑙丄DC妯″潡璇存槑銆 + +缂栧啓锛氬緪鎴愶紙鐢佃瘽18008400450锛 2021骞3鏈5鏃ヨ璁★紝2021骞8鏈26鏃ユ洿鏂 +*/ + +#ifndef _key_H_ +#define _key_H_ + +extern void KeyInit(); +extern unsigned char GetKeyAct(char Key) ; //鑾峰彇鎸夐敭enumKey1,enumKey2,enumKey3浜嬩欢 + //杩斿洖鍊硷細enumKeyNull鈥斺旀棤锛宔numKeyPress鈥斺斾笅闄嶆部锛宔numKeyRelease鈥斺斾笂鍗囨部锛宔numKeyFail鈥斺旈敊璇 +enum KeyName {enumKey1,enumKey2,enumKey3}; //鎸夐敭鍚 +enum KeyActName {enumKeyNull,enumKeyPress,enumKeyRelease,enumKeyFail}; //鎸夐敭鍔ㄤ綔鍚 + +#endif \ No newline at end of file diff --git a/key/inc/M24C02.h b/key/inc/M24C02.h new file mode 100644 index 0000000..fc135cd --- /dev/null +++ b/key/inc/M24C02.h @@ -0,0 +1,32 @@ +/**********************************M24C02 V1.0 说明 ************************************************************************ +M24C02模块用于控制“STC-B学习板”上IIC接口的非易失存储器(NVM)M24C02芯片操作。 +M24C02提供2K bits(256 Bytes)非易失存储器(NVM)功能(非易失存储器单元地址为:00~0xff)。 +M24C0402模块共提供2个应用函数(本模块不需要初始化) + + (1) unsigned char M24C02_Read(unsigned char NVM_addr): 读取M24C02一个指定地址内容 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值00~0xff(共256个单元) + 函数返回值:返回M24C02中对应单元的存储数值(1Byte) + + (2) void M24C02_Write(unsigned char NVM_addr, unsigned char NVM_data):向M24C02一个指定地址写入新值 + 函数参数: + NVM_addr:指定非易失存储单元地址,有效值:00~0xff(共256个单元) + NVM_data:待写入M24C02单元的新值(1Byte) + +补充说明: + M24C02为非易失性存储器,其主要特点是:存储的内容在断电后能继续保存,一般用于保存断电需保留的工作系统参数; + 但读、写M24C02内部每一个字节均需要花费一定时间(每次读写操作大约数十uS,写周期为5~10mS),且有”写“寿命限制(每一单元大约”写“寿命为10万次量级寿命); + 与DS1302内部NVM区别:容量大(M24C02提供256字节,M24CXX系列最大可提供64K字节),但有“写”寿命限制(一般为数十万次“写”寿命“,且写周期长(5~10mS) + 因此,两次写操作之间需间隔5~10mS以上; + 仅在需要时使用以上读或写函数读写需要的特定字节内容,应避免对其进行无效、大量、重复操作! + +编写:徐成(电话18008400450) 2021年8月8日设计 +*/ + +#ifndef _M24C02_H_ +#define _M24C02_H_ + +extern unsigned char M24C02_Read(unsigned char NVM_addr); //读NVM(读M24C02中的非易失存储单元内容) +extern void M24C02_Write(unsigned char NVM_addr, unsigned char NVM_data); //写NVM(写M24C02中的非易失存储单元) + +#endif \ No newline at end of file diff --git a/key/inc/STC15F2K60S2.H b/key/inc/STC15F2K60S2.H new file mode 100644 index 0000000..96d807b --- /dev/null +++ b/key/inc/STC15F2K60S2.H @@ -0,0 +1,237 @@ +#ifndef __STC15F2K60S2_H_ +#define __STC15F2K60S2_H_ + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +sfr P_SW2 = 0xBA; //xxxx,x000 外设端口切换寄存器 + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 + +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 +sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +///////////////////////////////////////////////// + +#endif + diff --git a/key/inc/StepMotor.h b/key/inc/StepMotor.h new file mode 100644 index 0000000..6bbd1e8 --- /dev/null +++ b/key/inc/StepMotor.h @@ -0,0 +1,50 @@ +/**********************************StepMotor 说明 ************************************************************************ +StepMotor用于STC-B板控制步进电机。共提供1个驱动函数、3个应用函数: + (1) StepMotorInit():步进电机模块驱动函数 + (2) SetStepMotor(char StepMotor,unsigned char speed ,int steps ) 指定步进电机、按指定转动速度、转动指定步 + 函数参数:StepMotor 指定步进电机,取值(enum StepMotorName中定义) + enumStepMotor1: SM 接口上的步进电机 + enumStepMotor2: 此时,用L0~L3四个LED模拟一个4相步进电机 + enumStepMotor3: 此时,用L4~L7四个LED模拟一个4相步进电机 + speed 步进电机转动速度(0~255),单位:步/S。 (实际每步时间=int(1000mS/speed) mS),与设置速度可能存在一定误差 + steps 步进电机转动步数(-32768~32767),负值表示反转 + 函数返回:enumSetStepMotorOK: 调用成功(enum StepMotorActName中定义) + enumSetStepMotorFail:调用失败(电机名不在指定范围,或speed=0,或调用时正在转动) + (3)EmStop(char StepMotor) 紧急停止指定步进电机转动 + 函数参数:StepMotor 指定步进电机。函数参数不对将返回0值。 + 函数返回:剩余未转完的步数 + (4)GetStepMotorStatus(char StepMotor) 获取指定步进电机状态 + 函数参数:StepMotor 指定步进电机 + 函数返回:enumStepMotorFree:自由(enum StepMotorActName中定义) + enumStepMotorBusy,忙(正在转动) + enumSetStepMotorFail:调用失败(步进电机名不在指定范围) + +编写:徐成(电话18008400450) 2021年4月16日设计,2021年4月18日更新 +*/ + +#ifndef _StepMotor_H_ +#define _StepMotor_H_ + +extern void StepMotorInit(); // 步进电机模块初始化 +extern char SetStepMotor(char StepMotor,unsigned char speed ,int steps ); // 指定步进电机、按指定转动速度、转动指定步 + // 函数参数:StepMotor 指定步进电机,取值(enum StepMotorName中定义) + // enumStepMotor1: SM 接口上的步进电机 + // enumStepMotor2: 此时,用L0~L3四个LED模拟一个4相步进电机 + // enumStepMotor3: 此时,用L4~L7四个LED模拟一个4相步进电机 + // speed 步进电机转动速度(0~255),单位:步/S (实际每步时间=int(1000mS/speed) mS),与设置速度可能存在一定误差 + // steps 步进电机转动步数(-32768~32767),负值表示反转 + // 函数返回: + // enumSetStepMotorOK:调用成功 + // enumSetStepMotorFail:调用失败(电机名不在指定范围,或speed=0,或调用时正在转动) +extern int EmStop(char StepMotor); // 紧急停止指定步进电机转动 + // 函数参数:StepMotor 指定步进电机(函数参数不对将返回0值) + // 函数返回:剩余未转完的步数 +extern unsigned char GetStepMotorStatus(char StepMotor); // 获取指定步进电机状态 + // 函数参数:StepMotor 指定步进电机 + // 函数返回:enumStepMotorFree:自由 + // enumStepMotorBusy,忙(正在转动) + // enumSetStepMotorFail:调用失败(步进电机名不在指定范围) +enum StepMotorName {enumStepMotor1=0,enumStepMotor2,enumStepMotor3}; +enum StepMotorActName {enumStepMotorFree,enumStepMotorBusy,enumSetStepMotorOK,enumSetStepMotorFail}; + +#endif \ No newline at end of file diff --git a/key/inc/Vib.h b/key/inc/Vib.h new file mode 100644 index 0000000..ff8a281 --- /dev/null +++ b/key/inc/Vib.h @@ -0,0 +1,21 @@ +/**********************************振动传感器SV V2.0 说明 ************************************************************************ +SV用于获取"STC-B学习板"上Vib传感器状态.提供一个模块加载函数和一个应用函数,一个Vib事件enumEventVib: + (1) VibInit():振动传感器Vib模块初始化函数; + (2) char GetVibAct():获取Vib事件。 + 函数返回值:返回当前Vib传感器事件,返回值:enumVibNull——无,enumVibQuake——发生过振动 + 查询一次后,事件值变成 enumVibNull (仅查询一次有效) + (3) Vib传感器事件enumEventVib: + 当Vib检测到有”振动“事件时,将产生一个”振动事件“,响应事件的用户处理函数由用户编写, + 并有sys中提供的SetEventCallBack()函数设置. + +编写:徐成(电话18008400450) 2021年3月5日设计,2021年3月26日更新 +*/ + +#ifndef _Vib_H_ +#define _Vib_H_ + +extern void VibInit(); +extern unsigned char GetVibAct(void) reentrant; //获取Vib事件 +enum VibActName {enumVibNull,enumVibQuake}; //返回值:enuVibNull——无,enuVibQuake——发生过振动 + +#endif \ No newline at end of file diff --git a/key/inc/adc.h b/key/inc/adc.h new file mode 100644 index 0000000..eaf1a2c --- /dev/null +++ b/key/inc/adc.h @@ -0,0 +1,79 @@ +/**********************************ADC V3.5a 说明 ************************************************************************ +ADC模块用于“STC-B学习板”上与ADC相关电路:温度Rt、光照Rop、导航按键Nav、扩展接口EXT上的ADC转换。提供ADC模块初始化函数、2个应用函数,2个事件: + (1) AdcInit(char ADCsel):ADC模块初始化函数; + 函数参数: ADCsel选择扩展接口EXT是否用作ADC功能,取值: + ADCincEXT : 含对扩展接口EXT设置ADC功能(EXT上P1.0、P1.1不可作数字IO功能使用) + ADCexpEXT : 不含对扩展接口EXT设置ADC功能(EXT上P1.0、P1.1可作数字IO功能使用) + (2) struct_ADC GetADC():获取ADC值。 + 函数参数:无 + 函数返回值:返回数据结构 struct_ADC。 + 数据结构定义: + typedef struct //ADC转换结果 + { unsigned int EXT_P10; // 扩展接口EXT上P1.0脚ADC(10bit) + unsigned int EXT_P11; // 扩展接口EXT上P1.1脚ADC(10bit) + unsigned int Rt; // 热敏电阻上ADC(10bit) + unsigned int Rop; // 光敏电阻上ADC(10bit) + unsigned int Nav; // 导航按键上ADC(10bit) + } struct_ADC; + +说明1:每个数字表示 VCC/1024(单位:V),其中VCC为电路板供电电压(USB接口一般为5V左右) +说明2:对于导航按键,下面GetAdcNavAct函数输出消抖后导航按键事件和状态,更方便使用; + + (3) char GetAdcNavAct(char Nav_button):获取导航按键(包含K3)状态 + 函数参数:Nav_button:指定要获取状态的导航按键。取值: + enumAdcNavKey3(K3键), + enumAdcNavKeyRight(右按), + enumAdcNavKeyDown(下按), + enumAdcNavKeyCenter(中心按) + enumAdcNavKeyLeft(左按), + enumAdcNavKeyUp(上按). +(当参数取值不在有效范围,函数将返回enumKeyFail) + 函数返回值:返回当前按键事件,返回值:(同Key模块GetAdcKeyAct()返回值) + enumKeyNull(无按键动作), + enumKeyPress(按下), + enumKeyRelease(抬起), + enumKeyFail(失败) + 返回值是经过多次检测按键实时状态和统计检测结果后(软件消抖)的有效事件。 + 每个按键查询一次后,事件值变成 enumKeyNull (仅查询一次有效) + (4) 导航按键事件“:enumEventNav + 当导航按键5个方向或按键K3有任意”按下“或”抬起“动作时,将产生一个”导航按键事件“enumEventNav。响应导航按键事件的用户回调函数由用户编写,并由sys提供的SetEventCallBack()函数设置响应函数. + (5) 扩展接口EXT上P1.0、P1.1两个端口有新的AD值事件“:enumEventXADC + 当ADC模块对P1.0、P1.1进行ADC转换,获得了它们新的ADC结果时,将产生enumEventXADC事件,通知用户进行处理。响应enumEventXADC事件的用户回调函数由用户编写,并有sys提供的SetEventCallBack()函数设置响应函数. + ADC模块对P1.0、P1.1进行ADC转换速度为3mS,也即每3mS或每秒钟333次转换. + (6) 补充说明: + a:对EXT上P1.0、P1.0的转换速度为3mS,也即每秒钟提供333次转换结果,提供了有新转换结果事件:enumEventXADC,方便用户处理 +b:对于Rt、Rop,转换速度为9mS,也即每秒钟提供111次转换结果。没有提供相应“事件”,用户随时用函数GetAdcResult()查询和使用 + c:对导航按键进行了软件消抖处理,最快可支持导航按键每秒12次操作速度,提供了导航按键发生了操作事件:enumEventNav + d:由于导航按键与K3键共用了单片机同一个端口(P1.7),启用ADC模块后,P1.7口IO功能失效,只能用GetAdcNavAct(char Nav_button)函数获取K3按键的事件或状态。 + e: STC-B板上Rt型号为:10K/3950 NTC热敏电阻,光敏电阻Rop型号为:GL5516. 它们的ADC值与温度、光照强度关系请参阅它们的数据手册与STC-B电路图进行换算。 + + +编写:徐成(电话18008400450) 2021年3月25日设计,2021年8月30日修改 +*/ + +#ifndef _adc_H_ +#define _adc_H_ + +#define ADCincEXT 0x9B +#define ADCexpEXT 0x98 + +typedef struct //ADC转换结果 + { unsigned int EXT_P10; // 扩展接口EXT上P1.0脚ADC + unsigned int EXT_P11; // 扩展接口EXT上P1.1脚ADC + unsigned int Rt; // 热敏电阻上ADC + unsigned int Rop; // 光敏电阻上ADC + unsigned int Nav; // 导航按键上ADC + } struct_ADC; + +extern void AdcInit(char ADCsel); + +extern struct_ADC GetADC(); +extern unsigned char GetAdcNavAct(char Nav_button); //获取导航按键5个方向(右、下、中心、左、上)操作,以及按键K3操作的事件 + //返回值:enuKeyNull(无按键动作),enuKeyPress(按下),enuKeyRelease(抬起),enuKeyFail(失败) +enum KN_name {enumAdcNavKey3=0, //导航按键:按键K3 + enumAdcNavKeyRight, //导航按键:右 + enumAdcNavKeyDown, //导航按键:下 + enumAdcNavKeyCenter, //导航按键:中心 + enumAdcNavKeyLeft, //导航按键:左 + enumAdcNavKeyUp}; //导航按键:上 +#endif \ No newline at end of file diff --git a/key/inc/displayer.h b/key/inc/displayer.h new file mode 100644 index 0000000..7888dcc --- /dev/null +++ b/key/inc/displayer.h @@ -0,0 +1,26 @@ +/**********************************display V2.0 璇存槑 ************************************************************************ +displayer鐢ㄤ簬鎺у埗鈥淪TC-B瀛︿範鏉库濅笂8涓7娈垫暟鐮佺锛圫eg7锛夊拰8涓寚绀虹伅锛圠ed锛夊伐浣.鎻愪緵鏄剧ず妯″潡鍔犺浇鍜屼笁涓簲鐢ㄥ嚱鏁帮細 + + (1) displayerInit()锛氭樉绀烘ā鍧楀姞杞藉嚱鏁帮紱 + + (2) SetDisplayerArea(char Begin_of_scan,char Ending_of_Scan)锛氳缃甃ED鍚敤鍖哄煙銆8涓暟鐮佺浠庡乏鑷冲彸缂栧彿鍒嗗埆涓0鈥斺7锛屽嚱鏁板弬鏁 + Begin_of_scan璁惧畾鍚敤鏁扮爜绠¤捣濮嬬紪鍙凤紝Ending_of_Scan涓虹粨鏉熺紪鍙枫傝瀹氳寖鍥村唴鐨勬暟鐮佺鎵嶅伐浣滃拰鏄剧ず銆 + 娉細姝e父鎯呭喌涓嬶紝涓や釜鍙傛暟鍙栧艰寖鍥翠负0鈥斺7锛屼笖Ending_of_Scan>Begin_of_scan銆備絾鍒╃敤鍔ㄦ佹壂鎻忓拰浜虹溂瑙嗚鏁堟灉锛屽彲璁剧疆瓒呭嚭 + 璇ヨ寖鍥寸殑鍙傛暟锛屼互瀹炵幇鐗规畩鏄剧ず鏁堟灉锛氬杞欢璋冩暣鏄剧ず浜害锛屾垨闈炵伅浜害鏄剧ず锛岀瓑锛 + + (3) Seg7Print(char d0,char d1,char d2,char d3,char d4,char d5,char d6,char d7)锛氬皢8涓弬鏁板煎垎鍒瘧鐮佹樉绀哄埌瀵瑰簲鐨勬暟鐮佺涓娿 + 鏄剧ず璇戠爜琛(code char decode_table[])鍦╩ain.c涓,鐢ㄦ埛鍙互淇敼鍜屽鍑. + + (4) LedPrint(char led_val)锛氭帶鍒8涓寚绀虹伅寮鍏炽傚弬鏁發ight_val鐨8涓猙it浣嶅搴8涓寚绀虹伅鐨勫紑鍏筹紝鈥1鈥濃斺旀寚绀虹伅鈥滀寒鈥 + +缂栧啓锛氬緪鎴愶紙鐢佃瘽18008400450锛 2021骞2鏈26鏃ヨ璁★紝2021骞3鏈15鏃ユ洿鏂 +*/ + +#ifndef _displayer_H_ +#define _displayer_H_ +extern void DisplayerInit(); //鍔犺浇鏄剧ず妯″潡宸ヤ綔 +extern void SetDisplayerArea(char Begin_of_scan,char Ending_of_Scan); //璁剧疆鏈夋晥鏄剧ず鍖哄煙 +extern void Seg7Print(char d0,char d1,char d2,char d3,char d4,char d5,char d6,char d7); //鍦ㄦ暟鐮佺涓婅緭鍑 +extern void LedPrint(char led_val); +#endif + diff --git a/key/inc/hall.H b/key/inc/hall.H new file mode 100644 index 0000000..bfcc3b1 --- /dev/null +++ b/key/inc/hall.H @@ -0,0 +1,24 @@ +/**********************************hall V2.0 说明 ************************************************************************ +Hall模块用于获取“STC-B学习板”上hall传感器状态。hall模块共提供1个加载函数、1个应用函数,一个Hall事件:enumEventHall + (1)HallInit():hall模块初始化函数 + (2)unsigned char GetHallAct(void):获取hall事件。 + 函数返回值: + enumHallNull(无变化) + enumHallGetClose(磁场接近) + enumHallGetAway(磁场离开) + 查询一次后,事件值变成enumEventHall (仅查询一次有效) + (3)hall传感器事件: + 当Hall检测到有"磁场接近"或"磁场离开"事件时,将产生一个Hall传感器事件(enumEventHall).响应事件的用户处理函数由用户编写, 并有sys中提供的SetEventCallBack()函数设置事件响应函数. + + +编写:徐成(电话18008400450) 2021年3月15日设计 2021年3月26日修改 +*/ + +#ifndef _hall_H_ +#define _hall_H_ + +extern void HallInit(void); //加载hall模块 +extern unsigned char GetHallAct(void); //获取hall事件 +enum HallActName {enumHallNull,enumHallGetClose,enumHallGetAway}; //返回值:enumHallNull——无,enumHallGetClose——下降沿(磁场接近),enumHallGetAway——上升沿(磁场离开) + +#endif \ No newline at end of file diff --git a/key/inc/music.h b/key/inc/music.h new file mode 100644 index 0000000..0c219a9 --- /dev/null +++ b/key/inc/music.h @@ -0,0 +1,100 @@ +/********************************** music V2.0 说明 ************************************************************************ +Music模块在Beep和Displayer模块基础上再次封装,用于控制“STC-B学习板”上播放音乐。加载该模块,将同时加载Beep模块、displayer模块。music模块共提供1个music驱动函数、4个应用函数: + (1)MusicPlayerInit():驱动music模块; + (2)char PlayTone(unsigned char tone, unsigned char beatsPM ,unsigned char scale, unsigned char beats):播放音乐音阶,实现用指定音调、指定节拍率、发指定音阶、发音节拍数。 +函数参数: + tone:指定音调,有效值:0xFA、0xFB、0xFC、0xFD、0xFE、0xFF、0xF9分别对应音乐A、B、C、D、E、F、G调 + beatsPM:节拍率,即每分钟节拍数,值范围10~255拍/分钟 + scale:音乐简谱音高,1字节。 +0x00——休止符 +高4位:1——低8度音 2——中8度音 3——高8度音 +低3位:1-7对应简谱音。其它值无效。 +如:0x13表示低音3(mi) + beats:音长(节拍数),单位1/16拍。 +如:16(0x10)对应1拍,32(0x20)对应2拍,8(0x08)对应半拍...... 。 +函数返回值:enumBeepOK:调用成功 + enumBeepBusy:忙(上一音未按设定发完,或因蜂鸣器正在发音) + enumBeepFail:调用失败(音调参数tone不对,或音高编码scale不对) + (见Beep.h中定义BeepActName) + (3)SetMusic(unsigned char beatsPM, unsigned char tone, unsigned char *pt, unsigned int datasize, unsigned char display):设定或改变要播放音乐和播放参数。 +函数参数: + beatsPM:节拍率,即每分钟节拍数,值范围10~255拍/分钟,如果参数值为enumModeInvalid将不改变原beatsPM; + tone:指定音调, 有效值:0xFA、0xFB、0xFC、0xFD、0xFE、0xFF、0xF9分别对应音乐A、B、C、D、E、F、G调,参数值为enumModeInvalid或其它值将不改变原tone + *pt :指向要播放的音乐编码的首地址 。*pt 和 datasize 只有有一个参数 = enumModeInvalid,将不改变 *pt 和 datasize + datasize:要播放的音乐编码的长度(字节数) 。*pt 和 datasize 只有有一个参数 = enumModeInvalid,将不改变 *pt 和 datasize + display:Seg7和Led是否用来显示播放音乐信息,取值: + enumMscNull —— 不用 + enumMscDrvSeg7 —— 用7段数码管Seg7(显示信息) + enumMscDrvLed —— 用Led指示灯(打拍) enumMscDrvSeg7andLed —— 用Seg7 和 Led + 参数值为enumModeInvalid或其它值将不改变原display +音乐编码规则: +1,常规音乐简谱发音编码(成对出现,不可分开,中间不能插入其它编码和控制字) + 基本格式:音高(1字节),节拍数(1字节),音高,节拍,...... + 其中“音高”部分: +0x11 — 0x17 :对应低音 do、re、mi、fa、so、la、si、 0x21 — 0x27 :对应中音 do、re、mi、fa、so、la、si + 0x31 — 0x37 :对应高音 do、re、mi、fa、so、la、si + 其中“节拍数”部分: +0x01-0xFF:单位1/16拍。也即十六进制中,高4位表示整拍数,低4位表示分拍数(1/16) + 如:发音2拍: 0x20 + 发音半拍: 0x08 + 发音1拍半:0x18 + 2,音乐编码中可以插入以下控制字,用于设定音乐播放参数等(前6个也可以通过函数,用程序设定和实现): + enumMscNull : 不用 + enumMscDrvSeg7 : 用7段数码管Seg7(显示信息) + enumMscDrvLed : 用Led指示灯(打拍) + enumMscDrvSeg7andLed : 用Seg7 和 Led + enumMscSetBeatsPM : 设置节拍率, 后面再跟 节拍率(1字节) + enumMscSetTone : 设置音调, 后面再跟 音调(1字节) +0xFA 或 0xFB 或 0xFC 或 0xFD 或 0xFE 或 0xFF 或 0xF9 +分别对应音乐:A调 或B调……… + enumMscRepeatBegin : 设置音乐播放重复开始处。重复一次(暂不支持多次),暂不能嵌套(嵌套无效或可能导致不可预期结果) + enumMscRepeatEnd : 设置音乐播放重复结束处 + + (4)SetPlayerMode(unsigned char play_ctrl) :音乐播放控制函数。 + 函数参数: + play_ctrl:enumModePlay : ”播放“ + enumModePause : ”暂停“ + enumModeStop :”停止/结束“ + (其它参数无效) +所有操作在当前”音“播放完成后生效; + (5)char GetPlayerMode(void): 获取当前播放状态 + 函数返回值:(play_ctrl值) + enumModePlay : 播放状态 + enumModePause : 暂停状态 + enumModeStop : 停止/结束 +(其它功能应用型函数可根据需要设置和增加) + + +编写:徐成(电话18008400450) 2021年3月5日设计,2021年9月5日更新 +*/ + +#ifndef _music_H_ +#define _music_H_ + +extern void MusicPlayerInit(); +extern char PlayTone(unsigned char tone, unsigned char beatsPM ,unsigned char scale, unsigned char beats); + // tone: 音调。F9,FA,FB,FC,FD,FE,FF分别对应G\A\B\C\D\E\F调,其它值无效 + // beatsPM:节凑,单位:每分钟节拍数 + // scale: 音高。0x00——休止符,高4位:1——低8度音 2——中8度音 3——高8度音,低3位:1-7简谱音。其它无效 + // beats: 音长(节拍数),单位1/16拍。16(0x10)对应1拍,32(0x20)对应2拍,8(0x08)对应半拍...... +extern void SetMusic(unsigned char beatsPM, unsigned char tone, unsigned char *pt, unsigned int datasize, unsigned char display); + //可设置或改变:全部、或部分播放参数(节拍率、音调、显示方式、音乐原数据) + //其中节拍率、音调、显示方式 也可以在音乐编码中设置 +extern void SetPlayerMode(unsigned char play_ctrl); + //操作播放:enumModePlay 或 enumModePause 或 enumModeStop,分别设置音乐”播放“、”暂停“、”停止/结束“,所有操作在当前”音“播放完成后生效; +extern char GetPlayerMode(void); //获取当前播放状态 + +enum PlayerMode {enumModeInvalid=0, //播放模式非法 + enumModePlay, //播放 + enumModePause, //暂停(可恢复续放) + enumModeStop}; //停止(结束) +enum MusicKeyword {enumMscNull=0xF0, //播放音乐时,不用7段数码管、LED指示灯(显示音乐播放相关信息) + enumMscDrvSeg7, //播放音乐时, 用7段数码管 + enumMscDrvLed, //播放音乐时, 用 LED指示灯 + enumMscDrvSeg7andLed, //播放音乐时, 用7段数码管、LED指示灯 + enumMscSetBeatsPM, //音乐编码中关键字: 设置 音乐节拍 + enumMscSetTone, //音乐编码中关键字: 设置 音调 + enumMscRepeatBegin, //音乐编码中关键字: 设置 重复开始 + enumMscRepeatEnd}; //音乐编码中关键字: 设置 重复结束 + +#endif \ No newline at end of file diff --git a/key/inc/sys.H b/key/inc/sys.H new file mode 100644 index 0000000..c03d3d8 --- /dev/null +++ b/key/inc/sys.H @@ -0,0 +1,63 @@ +/******************************* sys Ver3.6 说明 ************************************************ + (1) sys.c构成STC程序基本架构。提供: + a, 系统初始化MySTC_Init(),系统调度函数MySTC_OS(),加载用户回调函数SetEventCallBack() + b, 若干可设置和触发回调函数的事件; + enumEventSys1mS : 1mS定时到 + enumEventSys10mS : 10mS定时到 + enumEventSys100mS : 100mS定时到 + enumEventSys1S : 1S定时到 + enumEventKey : 按键事件 + enumEventNav : 导航按键事件“ + enumEventHall : hall传感器事件 + enumEventVib : 振动传感器事件 + enumEventXADC : 扩展接口上新的AD值事件 + enumEventUart1Rxd : 串口1上收到一个符合格式定义的数据包事件。串口1:USB上与PC机通信 + enumEventUart2Rxd : 串口2上收到一个符合格式定义的数据包事件。串口2:485上UART、EXT上UART、或485上ModBus协议(2022年5月2日新增) + enumEventIrRxd : 红外收到一个数据包事件 + c, 获取系统运行性能评价参数 + + (2) MySTC_Init():sys初始化函数,必须执行一次。 + (3) MySTC_OS(): sys调度函数,应在while(1)循环中。 + (4) SetEventCallBack(char event, void *(user_callback)):加载"事件"用户回调函数. + (5) SysPerF GetSysPerformance(void) :获取系统运行性能评估参数 + 函数参数:无 + 函数返回值:结构 struct SysPerF。定义如下: + typedef struct //系统性能评估参数,每秒更新一次 + { unsigned long MainLoops; //SysPerformance.MainLoops 每秒主循环次数(应大于1000以上) + unsigned char PollingMisses; //SysPerformance.PollingMisses 每秒轮询丢失次数(理想值为0。如果有非0情况,说明用户程序或算法存在问题) + } SysPerF; + + (6) 补充说明: + sys.c 基本调度时间为1mS,非抢占式,要求用户程序片段,其单次循环执行时间累加起来应小于1mS。 + +编写:徐成(电话18008400450) 2021年2月26日设计,2022年5月2日更新 +*/ + +#ifndef _sys_h_ +#define _sys_h_ + +typedef struct //系统性能评估参数,每秒更新一次 + { unsigned long MainLoops; //SysPerformance.MainLoops 每秒主循环次数(应大于1000以上) + unsigned char PollingMisses; //SysPerformance.PollingMisses 每秒轮询丢失次数(理想值为0。如果有非0情况,说明用户程序或算法存在问题) + } struct_SysPerF; + +extern void MySTC_Init(); //sys初始化函数 +extern void MySTC_OS(); //sys调度函数,应在while(1)循环中 +extern void SetEventCallBack(char event, void *(user_callback)); //加载"事件"用户回调函数. +extern struct_SysPerF GetSysPerformance(void); + +enum event{enumEventSys1mS, //系统1mS事件 + enumEventSys10mS, //系统10mS事件 + enumEventSys100mS, //系统100mS事件 + enumEventSys1S, //系统1S事件 + enumEventKey, //按键事件 + enumEventHall, //hall传感器事件 + enumEventVib, //振动传感器事件 + enumEventNav, //导航按键事件“ + enumEventXADC, //扩展接口上新的AD值事件 + enumEventUart1Rxd, //串口1上收到一个符合格式定义的事件 + enumEventUart2Rxd, //串口2上收到一个符合格式定义("数据包格式"、或"ModBus协议+数据包格式")的事件。 (2022年5月2日新增) + enumEventIrRxd //红外Ir上收到一个数据包 + }; + +#endif \ No newline at end of file diff --git a/key/inc/uart1.h b/key/inc/uart1.h new file mode 100644 index 0000000..ef39ba0 --- /dev/null +++ b/key/inc/uart1.h @@ -0,0 +1,58 @@ +/**********************************Uart1串行通信模块 V2.0 说明 ************************************************************************ +Uart1模块提供Uart1模块初始化函数、3个应用函数,1个事件(enumEventRxd): +(1) Uart1Init(unsigned long band):Uart1模块初始化函数。 + 函数参数:unsigned long band定义串口1的通信波特率(单位:bps)(8个数据位、1个停止位,无奇偶校验位) + 函数返回值:无 + +(2) void SetUart1Rxd(char *RxdPt, unsigned int Nmax, char *matchhead, unsigned int matchheadsize); + 设置串口1接收参数:数据包存放位置、大小,包头匹配字符、匹配字符个数。收到符合条件的数据包时将产生enumEventRxd事件。 + 函数参数: char *RxdPt:指定接收数据包存放区(首地址) + unsigned int Nmax:接收数据包大小(字节数),最大65535。当收到的数据大于Nmax后,将被丢弃 (2022年5月2日更改) + char *matchhead: 需要匹配的数据包头(首地址) + unsigned int matchheadsize:需要匹配的字节数 + 补充说明: + Nmax=1:为单字节接收,即收到一个字节就产生enumUart1EventRxd事件(如果定义了匹配,还需满足匹配条件); + 0 < matchheadsize < Nmax:要求接收数据中连续matchheadsize个字节与*matchhead处数据完全匹配,才在收到Nmax数据时产生enumEventRxd事件; + matchheadsize = Nmax:设定接收数据包完全匹配 + matchheadsize=0 或 matchheadsize > Nmax:将不做匹配,接收到任意Nmax数据时产生enumEventRxd事件; + 在enumEventRxd事件发出后,用户回调函数返回才接收下一个数据包 (2022年5月2日更改) + 函数返回值:无 + + (3) char Uart1Print(void *pt, unsigned int num):发送数据包,非阻塞函数(即函数不等到所设定任务全部完成才返回),该函数从被调用到返回大约1uS左右时间。 + 函数参数: void *pt :指定发送数据包位置 + unsigned int num:发送数据包大小; + 函数返回值:enumTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumTxFailure:调用失败(主要原因是:串口正忙(上一数据包未发完) + 补充说明:串口上发送1个字节数据大约需要时间0.1mS~10mS(视所设定的波特率),对计算机来说,如果发送多个字节是一个很要时间才能完成的事。类似于 + 前面用蜂鸣器演奏音乐,对这类事件与程序"异步"的问题,编程时不仅要注意程序逻辑性、还有注意程序时效性。(这个问题其实总是要注意、必须要注意的) + + (4) char GetUart1TxStatus(void): 获取Uart1发送状态 + 函数返回值:enumUart1TxFree:串口1发送空闲 + enumUart1TxBusy,串口1发送正忙 + + (5) Uart1接收事件:enumEventUart1Rxd。表示收到了一个符合指定要求(数据包头匹配、数据包大小一致)的数据包。 + 补充说明:串口(1和2)上收到的两个数据包之时间间隔要求不小于1mS(原因:系统内部调度方法限制) + +补充说明: + (1) 串口1、串口2波特率可独立设置,互不影响. + (2) 串口1、串口2、红外通信可同时工作,互不影响 + (3) 串口1、串口2用法基本上完全一致,红外通信用法也基本相同。不同地方是: + a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作); + b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数; + c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。 + + +编写:徐成(电话18008400450) 2021年3月28日设计 2021年11月8日更新 +*/ + + +#ifndef _uart1_H_ +#define _uart1_H_ + +extern void Uart1Init(unsigned long band); //串口初始化,参数:波特率 +extern void SetUart1Rxd(void *RxdPt, unsigned int Nmax, void *matchhead, unsigned int matchheadsize); //设置接收条件:数据包存放位置、大小,包头匹配字符、匹配字符个数。符合条件的包将产生enumEventRxd事件 +extern char Uart1Print(void *pt, unsigned int num); //发送数据包。非阻塞函数。数据包位置、大小。返回值enumTxOK调用成功,enumTxFailure失败(串口忙,上一数据包未发完) +extern char GetUart1TxStatus(void); //获取串口1发送状态,enumUart1TxFree:串口1发送空闲, enumUart1TxBusy,串口1发送正忙 +enum Uart1ActName {enumUart1TxFree=0,enumUart1TxBusy,enumUart1TxOK,enumUart1TxFailure}; + +#endif \ No newline at end of file diff --git a/key/inc/uart2.h b/key/inc/uart2.h new file mode 100644 index 0000000..0d68121 --- /dev/null +++ b/key/inc/uart2.h @@ -0,0 +1,65 @@ +/********************************** Uart2串行通信模块 V2.0 说明 *************************************************************** +Uart2模块提供Uart2模块初始化函数、3个应用函数,1个事件(enumUart2EventRxd): +(1) Uart2Init(unsigned long band,unsigned char Uart2mode):Uart2模块初始化函数。 + 函数参数:unsigned long band:定义串口2的通信波特率(单位:bps)(固定8个数据位、1个停止位,无奇偶校验位) + unsigned char Uart2mode:定义串口2位置 + 取值:Uart2UsedforEXT —— 串口2在EXT扩展插座上(TTL标准串口) + Uart2Usedfor485 —— 串口2用于485通信(半双工。发送数据包时不能接收数据) + Uart2Usedfor485ModBus —— 串口2用于485上,ModBus协议收发 (2022年5月2日新增) +(2) void SetUart2Rxd(char *RxdPt, unsigned int Nmax, char *matchhead, unsigned int matchheadsize); + 设置串口2接收参数:数据包存放位置、大小,包头匹配字符、匹配字符个数。收到符合条件的数据包时将产生enumEventRxd事件。 + 函数参数: char *RxdPt:指定接收数据包存放区(首地址) + unsigned int Nmax:接收数据包大小(字节数),最大65535。当收到的数据大于Nmax后,将被丢弃 (2022年5月2日更改) + char *matchhead: 需要匹配的数据包头(首地址) + unsigned int matchheadsize:需要匹配的字节数 + 补充说明: + Nmax=1:为单字节接收,即收到一个字节就产生enumEventUart2Rxd事件(如果定义了匹配,还需满足匹配条件); + 0 < matchheadsize < Nmax:要求接收数据中连续matchheadsize个字节与*matchhead处数据完全匹配,才在收到Nmax数据时产生enumEventRxd事件; + matchheadsize = Nmax:设定接收数据包完全匹配 + matchheadsize=0 或 matchheadsize > Nmax:将不做匹配,接收到任意Nmax数据时产生enumEventRxd事件; + 在enumEventRxd事件发出后,用户回调函数返回才接收下一个数据包 (2022年5月2日更改) +(3) char Uart2Print(void *pt, unsigned int num):发送数据包,非阻塞函数(即函数不等到所设定任务全部完成才返回),该函数从被调用到返回大约1uS左右时间。 + 函数参数: void *pt :指定发送数据包位置 + unsigned int num:发送数据包大小; + 函数返回值:enumTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。 + enumTxFailure:调用失败(主要原因是:串口正忙(上一数据包未发完) + 补充说明:串口上发送1个字节数据大约需要时间0.1mS~10mS(视所设定的波特率),对计算机来说,如果发送多个字节是一个很要时间才能完成的事。 + 类似于前面用蜂鸣器演奏音乐,对这类事件与程序"异步"的问题,编程时不仅要注意程序逻辑性、还有注意程序时效性。(这个问题其实总是要注意、必须要注意的) +(4) char GetUart2TxStatus(void): 获取Uart2发送状态 + 函数返回值:enumUart2TxFree:串口2发送空闲 + enumUart2TxBusy,串口2发送正忙 +(5) Uart2接收事件:enumUart2EventRxd。表示收到了一个符合指定要求(数据包头匹配、数据包大小一致)的数据包。 + 当串口2工作于: Uart2UsedforEXT 或 Uart2Usedfor485 方式时, + Uart2接收事件为:同串口1性质一致,即:数据包头匹配、数据包大小一致 + 当串口2工作于: Uart2Usedfor485ModBus 方式时, (2022年5月2日新增) + Uart2接收事件为:收到一个ModBus数据帧(数据包内字节间间隔<4字节收发时间),且帧内包头内容与设定内容匹配 + 但:1,数据帧内未进行CRC校验。建议用户在回调函数中,为了验证数据包正确性,应对数据包进行CRC校验 + 2,未返回ModBus数据帧有效字节数。用户可从收到的指令类型(第2字节)及对应帧内数据(一般第5、6字节)判断帧字节数 + 补充说明:串口(1和2)上收到的两个数据包之时间间隔要求不小于1mS(原因:系统内部调度方法限制) + +补充说明: + (1) 串口1、串口2波特率可独立设置,互不影响. + (2) 串口1、串口2、红外通信可同时工作,互不影响 + (3) 串口1、串口2(除开ModBus)用法基本上完全一致,红外通信用法也基本相同。不同地方是: + a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作); + b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数; + c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。 + (4)2022年5月2日新增串口2在485接口上支持ModBus协议数据帧监测功能,使"STC-B学习板"方便实现ModBus协议的节点等功能 (2022年5月2日新增) + +编写:徐成(电话18008400450) 2021年3月28日设计 2022年5月2日更新 +*/ + + +#ifndef _uart2_H_ +#define _uart2_H_ + +extern void Uart2Init(unsigned long band,unsigned char Uart2mode); //串口2初始化,参数:波特率、串口2位置 +enum Uart2PortName {Uart2UsedforEXT,Uart2Usedfor485,Uart2Usedfor485ModBus}; // Uart2UsedforEXT —— 串口2在EXT扩展插座上(TTL标准串口) + // Uart2Usedfor485 —— 串口2用于485通信(半双工。发送数据包时不能接收数据) + // Uart2Usedfor485ModBus —— 串口2用于485上,ModBus协议收发 +extern void SetUart2Rxd(void *RxdPt, unsigned int Nmax, void *matchhead, unsigned int matchheadsize); //设置接收条件:数据包存放位置、大小,包头匹配字符、匹配字符个数。符合条件的包将产生enumUart2EventRxd事件 +extern char Uart2Print(void *pt, unsigned int num); //发送数据包。非阻塞函数。数据包位置、大小。返回值enumUart2TxOK调用成功,enumUart2TxFailure失败(串口忙,上一数据包未发完) +extern char GetUart2TxStatus(void); //获取串口2发送状态,enumUart2TxFree:串口2发送空闲, enumUart2TxBusy,串口2发送正忙 +enum Uart2ActName {enumUart2TxFree=0,enumUart2TxBusy,enumUart2TxOK,enumUart2TxFailure}; + +#endif \ No newline at end of file diff --git a/key/key.uvopt b/key/key.uvopt new file mode 100644 index 0000000..85f6bba --- /dev/null +++ b/key/key.uvopt @@ -0,0 +1,197 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x0 + MCS-51 + + 35000000 + + 1 + 1 + 1 + 0 + 0 + + + 0 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group 1 + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + .\source\main.c + main.c + 0 + 0 + + + 1 + 2 + 4 + 0 + 0 + 0 + .\source\STCBSP_V3.6.LIB + STCBSP_V3.6.LIB + 0 + 0 + + + +
diff --git a/key/key.uvproj b/key/key.uvproj new file mode 100644 index 0000000..e7d8e5e --- /dev/null +++ b/key/key.uvproj @@ -0,0 +1,395 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x0 + MCS-51 + 0 + + + STC15F2K60S2 Series + STC + IRAM(0-0xFF) XRAM(0-0x6FF) IROM(0-0xEFF8) CLOCK(35000000) MODP2 + + "LIB\STARTUP.A51" ("Standard 8051 Startup Code") + + 62472 + STC15F2K60S2.H + + + + + + + + + + + 0 + 0 + + + + STC\ + STC\ + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + key + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 0 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + 65535 + + + S8051.DLL + + DP51.DLL + -pDP8051 + S8051.DLL + + TP51.DLL + -p51 + + + + 0 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + + + + + + 0 + + + + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0xffff + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0xeff9 + + + 0 + 0x0 + 0x100 + + + 0 + 0x0 + 0x700 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 1 + 0 + 1 + 3 + 8 + 2 + 1 + 1 + 0 + 0 + + + + + .\inc + + + + 0 + 1 + 0 + 0 + + + + + + + + + 0 + 0 + 1 + 0 + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Source Group 1 + + + main.c + 1 + .\source\main.c + + + STCBSP_V3.6.LIB + 4 + .\source\STCBSP_V3.6.LIB + + + + + + + +
diff --git a/key/source/STCBSP_V3.6.LIB b/key/source/STCBSP_V3.6.LIB new file mode 100644 index 0000000..bf42f13 Binary files /dev/null and b/key/source/STCBSP_V3.6.LIB differ diff --git a/key/source/main.c b/key/source/main.c new file mode 100644 index 0000000..f33f65f --- /dev/null +++ b/key/source/main.c @@ -0,0 +1,81 @@ +// This project is used for demonstrating digital tubes of BSP library. +#include "STC15F2K60S2.H" +#include "displayer.h" +#include "key.H" +#include "sys.H" + +code unsigned long SysClock = 11059200; //蹇呴』銆傚畾涔夌郴缁熷伐浣滄椂閽熼鐜(Hz)锛岀敤鎴峰繀椤讳慨鏀规垚涓庡疄闄呭伐浣滈鐜囷紙涓嬭浇鏃堕夋嫨鐨勶級涓鑷 +#ifdef _displayer_H_ //鏄剧ず妯″潡閫夌敤鏃跺繀椤汇傦紙鏁扮爜绠℃樉绀鸿瘧鐮佽〃锛岀敤鎴跺彲淇敼銆佸鍔犵瓑锛 +code char decode_table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x08, 0x40, 0x01, 0x41, 0x48, + /* 搴忓彿: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ + /* 鏄剧ず: 0 1 2 3 4 5 6 7 8 9 (鏃) 涓- 涓- 涓- 涓婁腑- 涓笅- */ + 0x3f | 0x80, 0x06 | 0x80, 0x5b | 0x80, 0x4f | 0x80, 0x66 | 0x80, 0x6d | 0x80, 0x7d | 0x80, 0x07 | 0x80, 0x7f | 0x80, 0x6f | 0x80}; +/* 甯﹀皬鏁扮偣 0 1 2 3 4 5 6 7 8 9 */ +#endif + +char changeBit(char x, char n, char y) +{ + char temp = x; + temp &= ~(1 << n); + temp |= (y << n); + return temp; +} + +void display_key() +{ + static char status[8]={10,10,10,10,10,10,10,10}; + static char led = 0x0; + char key1 = GetKeyAct(enumKey1), key2 = GetKeyAct(enumKey2), key3 = GetKeyAct(enumKey3); + switch (key1) + { + case enumKeyPress: + status[5] = 1; + led=changeBit(led, 0, 1); + break; + case enumKeyRelease: + status[5] = 10; + led=changeBit(led, 0, 0); + break; + } + switch (key2) + { + case enumKeyPress: + status[6] = 2; + led=changeBit(led, 1, 1); + break; + case enumKeyRelease: + status[6] = 10; + led=changeBit(led, 1, 0); + break; + } + switch (key3) + { + case enumKeyPress: + status[7] = 3; + led=changeBit(led, 2, 1); + break; + case enumKeyRelease: + status[7] = 10; + led=changeBit(led, 2, 0); + break; + } + status[0]=led/10; + status[1]=led%10; + Seg7Print(status[0], status[1], status[2], status[3], status[4], status[5], status[6], status[7]); + LedPrint(led); +} + +void main() +{ + DisplayerInit(); + KeyInit(); + SetDisplayerArea(0, 7); + SetEventCallBack(enumEventKey, display_key); + MySTC_Init(); + LedPrint(0xff); + Seg7Print(10, 10, 10, 10, 10, 10, 10, 10); + while (1) + { + MySTC_OS(); + } +}