目录
- 库函数
-
- compare.c
- compare.h
- STC15Fxxxx.H
- 测试程序
-
- main.c
STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0
库函数
比较器的库函数只在官方例程中发现,没有与其他库函数放在一起,作者也没有对其进行测试,请谨慎使用。
compare.c
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果您想在程序中使用此代码,请注明使用
宏晶技术的数据和程序 */ /*---------------------------------------------------------------------*/ #include "compare.h" //======================================================================== // 函数:void CMP_Inilize(CMP_InitDefine *CMPx) // 描述: 比较器初始化程序. // 参数: CMPx: 请参考结构参数compare.h里的定义. // 返回: 成功返回0, 空操作返回1,错误返回2. // 版本: V1.0, 2012-10-22 //======================================================================== void CMP_Inilize(CMP_InitDefine *CMPx) { CMPCR1 = 0; CMPCR2 = CMPx->CMP_OutDelayDuty & 0x3f; //比较延迟周期数的结果变化, 0~63 if(CMPx->CMP_EN == ENABLE) CMPCR1 |= CMPEN; //允许比较器 ENABLE,DISABLE if(CMPx->CMP_RiseInterruptEn == ENABLE) CMPCR1 |= PIE; //允许上升沿中断 ENABLE,DISABLE if(CMPx->CMP_FallInterruptEn == ENABLE) CMPCR1 |= NIE; //允许下降边中断 ENABLE,DISABLE if(CMPx->CMP_P_Select == CMP_P_ADCIS) CMPCR1 |= PIS; //比较器输入正极性选择, CMP_P_P55: 选择内部P5.5做正输入, CMP_P_ADCIS: 由ADCIS[2:0]所选择的ADC输入端做正输入. if(CMPx->CMP_N_Select == CMP_N_P54) CMPCR1 |= NIS; //比较器输入负极性选择, CMP_N_BGv: 选择内部BandGap电压BGv做负输入, CMP_N_P54: 选择外部P5.4做输入. if(CMPx->CMP_OutptP12_En == ENABLE) CMPCR1 |= CMPOE; //允许比较结果输出到P1.2, ENABLE,DISABLE if(CMPx->CMP_InvCMPO == ENABLE) CMPCR2 |= INVCMPO; //比较器输出取反, ENABLE,DISABLE if(CMPx->CMP_100nsFilter == DISABLE) CMPCR2 |= DISFLT; //内部0.1uF滤波, ENABLE,DISABLE // u8 CMP_Polity; //中断优先级, PolityLow,PolityHigh } /********************* 比较器中断函数************************/ void CMP_int (void) interrupt CMP_VECTOR { P13 = ~P13; if((CMPCR1 & CMPRES) > 0) P14 = ~P14; else P15 = ~P15; CMPCR1 &= ~CMPIF; //清除中断标志 }
compare.h
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */
/*---------------------------------------------------------------------*/
#ifndef __COMPARE_H
#define __COMPARE_H
#include "config.h"
//CMPCR1
#define CMPEN 0x80 //1: 允许比较器, 0: 禁止,关闭比较器电源
#define CMPIF 0x40 //比较器中断标志, 包括上升沿或下降沿中断, 软件清0
#define PIE 0x20 //1: 比较结果由0变1, 产生上升沿中断
#define NIE 0x10 //1: 比较结果由1变0, 产生下降沿中断
#define PIS 0x08 //输入正极性选择, 0: 选择内部P5.5做正输入, 1: 由ADCIS[2:0]所选择的ADC输入端做正输入.
#define NIS 0x04 //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入.
#define CMPOE 0x02 //1: 允许比较结果输出到P1.2, 0: 禁止.
#define CMPRES 0x01 //比较结果, 1: CMP+电平高于CMP-, 0: CMP+电平低于CMP-, 只读
//CMPCR2
#define INVCMPO 0x80 //1: 比较器输出取反, 0: 不取反
#define DISFLT 0x40 //1: 关闭0.1uF滤波, 0: 允许
#define LCDTY 0x00 //0~63, 比较结果变化延时周期数
#define CMP_P_P55 0
#define CMP_P_ADCIS 1
#define CMP_N_P54 1
#define CMP_N_BGv 0
typedef struct
{
u8 CMP_EN; //比较器允许或禁止, ENABLE,DISABLE
u8 CMP_Interrupt; //比较器中断允许或禁止, ENABLE,DISABLE
u8 CMP_RiseInterruptEn; //比较器上升沿中断允许或禁止, ENABLE,DISABLE
u8 CMP_FallInterruptEn; //比较器下降沿中断允许或禁止, ENABLE,DISABLE
u8 CMP_P_Select; //比较器输入正极性选择, CMP_P_P55: 选择内部P5.5做正输入, CMP_P_ADCIS: 由ADCIS[2:0]所选择的ADC输入端做正输入.
u8 CMP_N_Select; //比较器输入负极性选择, CMP_N_BGv: 选择内部BandGap电压BGv做负输入, CMP_N_P54: 选择外部P5.4做输入.
u8 CMP_OutptP12_En; //允许比较结果输出到P1.2, ENABLE,DISABLE
u8 CMP_Polity; //中断优先级, PolityLow,PolityHigh
u8 CMP_InvCMPO; //比较器输出取反, ENABLE,DISABLE
u8 CMP_100nsFilter; //内部0.1uF滤波, ENABLE,DISABLE
u8 CMP_OutDelayDuty; //0~63, 比较结果变化延时周期数
} CMP_InitDefine;
void CMP_Inilize(CMP_InitDefine *CMPx);
#endif
STC15Fxxxx.H
该头文件版本补充了比较器的寄存器。
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ #ifndef _STC15Fxxxx_H #define _STC15Fxxxx_H #include <intrins.h> /* BYTE Registers */ sfr P0 = 0x80; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr S4CON = 0x84; sfr S4BUF = 0x85; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr AUXR = 0x8E; sfr WAKE_CLKO = 0x8F; sfr INT_CLKO = 0x8F; sfr AUXR2 = 0x8F; sfr RL_TL0 = 0x8A; sfr RL_TL1 = 0x8B; sfr RL_TH0 = 0x8C; sfr RL_TH1 = 0x8D; sfr P1 = 0x90; sfr P1M1 = 0x91; //P1M1.n,P1M0.n =00--->Standard, 01--->push-pull 实际上1T的都一样 sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain sfr P0M1 = 0x93; //P0M1.n,P0M0.n =00--->Standard, 01--->push-pull sfr P0M0 = 0x94; // =10--->pure input, 11--->open drain sfr P2M1 = 0x95; //P2M1.n,P2M0.n =00--->Standard, 01--->push-pull sfr P2M0 = 0x96; // =10--->pure input, 11--->open drain sfr CLK_DIV = 0x97; sfr PCON2 = 0x97; sfr SCON = 0x98; sfr SBUF = 0x99; sfr S2CON = 0x9A; // sfr S2BUF = 0x9B; // sfr P1ASF = 0x9D; //只写,模拟输入(AD或LVD)选择 sfr P2 = 0xA0; sfr BUS_SPEED = 0xA1; sfr AUXR1 = 0xA2; sfr P_SW1 = 0xA2; sfr IE = 0xA8; sfr SADDR = 0xA9; sfr WKTCL = 0xAA; //唤醒定时器低字节 sfr WKTCH = 0xAB; //唤醒定时器高字节 sfr S3CON = 0xAC; sfr S3BUF = 0xAD; sfr IE2 = 0xAF; //STC12C5A60S2系列 sfr P3 = 0xB0; sfr P3M1 = 0xB1; //P3M1.n,P3M0.n =00--->Standard, 01--->push-pull sfr P3M0 = 0xB2; // =10--->pure input, 11--->open drain sfr P4M1 = 0xB3; //P4M1.n,P4M0.n =00--->Standard, 01--->push-pull sfr P4M0 = 0xB4; // =10--->pure input, 11--->open drain sfr IP2 = 0xB5; //STC12C5A60S2系列 sfr IPH2 = 0xB6; //STC12C5A60S2系列 sfr IPH = 0xB7; sfr IP = 0xB8; sfr SADEN = 0xB9; sfr P_SW2 = 0xBA; sfr ADC_CONTR = 0xBC; //带AD系列 sfr ADC_RES = 0xBD; //带AD系列 sfr ADC_RESL = 0xBE; //带AD系列 sfr P4 = 0xC0; sfr WDT_CONTR = 0xC1; sfr IAP_DATA = 0xC2; sfr IAP_ADDRH = 0xC3; sfr IAP_ADDRL = 0xC4; sfr IAP_CMD = 0xC5; sfr IAP_TRIG = 0xC6; sfr IAP_CONTR = 0xC7; sfr ISP_DATA = 0xC2; sfr ISP_ADDRH = 0xC3; sfr ISP_ADDRL = 0xC4; sfr ISP_CMD = 0xC5; sfr ISP_TRIG = 0xC6; sfr ISP_CONTR = 0xC7; sfr P5 = 0xC8; // sfr P5M1 = 0xC9; // P5M1.n,P5M0.n =00--->Standard, 01--->push-pull sfr P5M0 = 0xCA; // =10--->pure input, 11--->open drain sfr P6M1 = 0xCB; // P5M1.n,P5M0.n =00--->Standard, 01--->push-pull sfr P6M0 = 0xCC; // =10--->pure input, 11--->open drain sfr SPSTAT = 0xCD; // sfr SPCTL = 0xCE; // sfr SPDAT = 0xCF; // sfr PSW = 0xD0; sfr T4T3M = 0xD1; sfr T4H = 0xD2; sfr T4L = 0xD3; sfr T3H = 0xD4; sfr T3L = 0xD5; sfr T2H = 0xD6; sfr T2L = 0xD7; sfr TH4 = 0xD2; sfr TL4 = 0xD3; sfr TH3 = 0xD4; sfr TL3 = 0xD5; sfr TH2 = 0xD6; sfr TL2 = 0xD7; sfr RL_T4H = 0xD2; sfr RL_T4L = 0xD3; sfr RL_T3H = 0xD4; sfr RL_T3L = 0xD5; sfr RL_T2H = 0xD6; sfr RL_T2L = 0xD7; sfr CCON = 0xD8; // sfr CMOD = 0xD9; // sfr CCAPM0 = 0xDA; //PCA模块0的工作模式寄存器。 sfr CCAPM1 = 0xDB; //PCA模块1的工作模式寄存器。 sfr CCAPM2 = 0xDC; //PCA模块2的工作模式寄存器。 sfr ACC = 0xE0; sfr P7M1 = 0xE1; sfr P7M0 = 0xE2; sfr CMPCR1 = 0xE6; sfr CMPCR2 = 0xE7; sfr P6 = 0xE8; sfr CL = 0xE9; // sfr CCAP0L = 0xEA; //PCA模块0的捕捉/比较寄存器低8位。 sfr CCAP1L = 0xEB; //PCA模块1的捕捉/比较寄存器低8位。 sfr CCAP2L = 0xEC; //PCA模块2的捕捉/比较寄存器低8位。 sfr B = 0xF0; sfr PCA_PWM0 = 0xF2; //PCA模块0 PWM寄存器。 sfr PCA_PWM1 = 0xF3; //PCA模块1 PWM寄存器。 sfr PCA_PWM2 = 0xF4; //PCA模块2 PWM寄存器。 sfr P7 = 0xF8; sfr CH = 0xF9; sfr CCAP0H = 0xFA; //PCA模块0的捕捉/比较寄存器高8位。 sfr CCAP1H = 0xFB; //PCA模块1的捕捉/比较寄存器高8位。 sfr CCAP2H = 0xFC; //PCA模块2的捕捉/比较寄存器高8位。 /* BIT Registers */ /* PSW */ 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 F1 = PSW^1; sbit P = PSW^0; /* TCON */ sbit TF1 = TCON^7; //定时器1溢出中断标志位 sbit TR1 = TCON^6; //定时器1运行控制位 sbit TF0 = TCON^5; //定时器0溢出中断标志位 sbit TR0 = TCON^4; //定时器0运行控制位 sbit IE1 = TCON^3; //外中断1标志位 sbit IT1 = TCON^2; //外中断1信号方式控制位,1:下降沿中断,0:上升下降均中断。 sbit IE0 = TCON^1; //外中断0标志位 sbit IT0 = TCON^0; //外中断0信号方式控制位,1:下降沿中断,0:上升下降均中断。 /* P0 */ 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; /* P1 */ 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; sbit RXD2 = P1^0; sbit TXD2 = P1^1; sbit CCP1 = P1^0; sbit CCP0 = P1^1; sbit SPI_SS = P1^2; sbit SPI_MOSI = P1^3; sbit SPI_MISO = P1^4; sbit SPI_SCLK = P1^5; /* P2 */ 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; /* P3 */ 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; sbit RXD = P3^0; sbit TXD = P3^1; sbit INT0 = P3^2; sbit INT1 = P3^3; sbit T0 = P3^4; sbit T1 = P3^5; sbit WR = P3^6; sbit RD = P3^7; sbit CCP2 = P3^7; sbit CLKOUT0 = P3^5; sbit CLKOUT1 = P3^4; /* P4 */ 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; /* P5 */ 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; /* SCON */ sbit SM0 = SCON^7; //SM0/FE SM0 SM1 = 00 ~ 11: 方式0~3 sbit SM1 = SCON^6; // sbit SM2 = SCON^5; //多机通讯 sbit REN = SCON^4; //接收允许 sbit TB8 = SCON^3; //发送数据第8位 sbit RB8 = SCON^2; //接收数据第8位 sbit TI = SCON^1; //发送中断标志位 sbit RI = SCON^0; //接收中断标志位 /* IE */ sbit EA = IE^7; //中断允许总控制位 sbit ELVD = IE^6; //低压监测中断允许位 sbit EADC = IE^5; //ADC 中断 允许位 sbit ES = IE^4; //串行中断 允许控制位 sbit ET1 = IE^3; //定时中断1允许控制位 sbit EX1 = IE^2; //外部中断1允许控制位 sbit ET0 = IE^1; //定时中断0允许控制位 sbit EX0 = IE^0; //外部中断0允许控制位 /* IP */ /* sbit PPCA = IP^7; //PCA 中断 优先级设定位 sbit PLVD = IP^6; //低压中断 优先级设定位 sbit PADC = IP^5; //ADC 中断 优先级设定位 sbit PS = IP^4; //串行中断0优先级设定位 sbit PT1 = IP^3; //定时中断1优先级设定位 sbit PX1 = IP^2; //外部中断1优先级设定位 sbit PT0 = IP^1; //定时中断0优先级设定位 sbit PX0 = IP^0; //外部中断0优先级设定位 */ sbit ACC0 = ACC^0; sbit ACC1 = ACC^1; sbit ACC2 = ACC^2; sbit ACC3 = ACC^3; sbit ACC4 = ACC^4; sbit ACC5 = ACC^5; sbit ACC6 = ACC^6; sbit ACC7 = ACC^7; sbit B0 = B^0; sbit B1 = B^1; sbit B2 = B^2; sbit B3 = B^3; sbit B4 = B^4; sbit B5 = B^5; sbit B6 = B^6; sbit B7 = B^7; // 7 6 5 4 3 2 1 0 Reset Value //sfr IE2 = 0xAF; - - - - - - ESPI ES2 0000,0000B //Auxiliary Interrupt #define SPI_INT_ENABLE() IE2 |= 2 //允许SPI中断 #define SPI_INT_DISABLE() IE2 &= ~2 //允许SPI中断 #define UART2_INT_ENABLE() IE2 |= 1 //允许串口2中断 #define UART2_INT_DISABLE() IE2 &= ~1 //允许串口2中断 // 7 6 5 4 3 2 1 0 Reset Value //sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000 //-------- sbit PPCA = IP^7; //PCA 模块中断优先级 sbit PLVD = IP^6; //低压监测中断优先级 sbit PADC = IP^5; //ADC 中断优先级 sbit PS = IP^4; //串行中断0优先级设定位 sbit PT1 = IP^3; //定时中断1优先级设定位 sbit PX1 = IP^2; //外部中断1优先级设定位 sbit PT0 = IP^1; //定时中断0优先级设定位 sbit PX0 = IP^0; //外部中断0优先级设定位 // 7 6 5 4 3 2 1 0 Reset Value //sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000 //sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00 //sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00 #define PPCAH 0x80 #define 标签:
wt710角位变送器