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

📄 cmp.c

📁 C8051F0401单片机功能齐全
💻 C
字号:
///////比较器0调试程序,带中断处理和比较器状态crossbar输出//////////
///////比较器0输出为P0.0口,比较器1输出为P0.1口,比较器2输出为P0.2口///////////
///////比较器0输入口为P2.6(+),和P2.7(-)///////////////////////////////////////
//////cmp.c////////////////
#include "lcd.h"
uchar temppage;
bit isnewdata;
bit isComp0Rise;
bit isComp0Fall;
void funtion_on_cp0_R();
void function_on_cp0_F();
void comp0_ini();
void comp1_ini();
void comp2_ini();
void comp0_ini(){
	SFRPAGE=0x01;
	CPT0MD=0x33;//响应时间为4us,上升沿和下降沿均中断使能
	CPT0CN=0x8f;//正负回滞均为20mv
	SFRPAGE = 0x0F;
	P2MDIN&=0x3f;//将比较器输入口配置为模拟输入
	XBR0|=0x80;//CP0E=1,将比较器0输出管脚配置到P口上。
	EIE1|=0x10;//比较器0中断开启。
}
void funtion_on_cp0_R(){//CP0上升沿处理程序
}
void function_on_cp0_F(){//CP0下降沿处理程序
}
void comp1_ini(){//比较器1初始化
	SFRPAGE=0x02;
	CPT1MD=0x33;
	CPT1CN=0x8f;
	SFRPAGE = 0x0F;
	P2MDIN&=0xf3;
	XBR1|=0x01;//将比较器1输出管脚配置到P口上。
	EIE1|=0x20;//比较器1中断开启。
}
void comp2_ini(){//比较器2初始化
	SFRPAGE=0x03;
	CPT1MD=0x33;
	CPT1CN=0x8f;
	SFRPAGE = 0x0F;
	P2MDIN&=0xcf;
	XBR3|=0x08;//将比较器2输出管脚配置到P口上。
	EIE1|=0x40;//比较器2中断开启。
}
void config (void) {
//看门狗禁止
    WDTCN = 0x07;	
    WDTCN = 0xDE;   
    WDTCN = 0xAD;
    SFRPAGE = 0x0F;
    XBR0 = 0x00;	
    XBR1 = 0x00;	
    XBR2 = 0x40;	//交叉开关使能,使得P0-P3口能输出
    XBR3 = 0x00;    
    SFRPAGE = 0x0F;
    P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
    P1MDOUT = 0x00; 
    P2MDOUT = 0x00; 
    P3MDOUT = 0x00; 
    P4MDOUT = 0x00; //P4口为开漏,若为推挽式则无法读取LCD数据
    P5MDOUT = 0x07; 
    P6MDOUT = 0x00; 
    P7MDOUT = 0x00; 
    P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
    P2MDIN = 0xFF;  
    P3MDIN = 0xFF; 
    SFRPAGE = 0x0F;
    CLKSEL = 0x00;  
    OSCXCN = 0x00;	
    OSCICN = 0x84;	
    //采用内部晶振,为24.5MHZ8分频
}  
void main(){
	xdata ulong systime0,systime1;
	config();
	dispini();
	SFRPGCN=0x00;//将SFRPGEN清零,禁止中断时对SFRPAGE自动入栈
	
	/*
	因为程序中出现3个以上中断,而SFRPAGE堆栈只有3字节,为防止堆栈溢出,采用软件控制SFRPAGE
	*/
	
	comp0_ini();//比较器0初始化程序
	comp1_ini();//比较器1初始化程序
	comp2_ini();//比较器2初始化程序
	EA=1;
	systime0=0;
	systime1=0;
	while(1){
		if(isComp0Rise){
			isComp0Rise=0;
			funtion_on_cp0_R();
			showline("Comp0 rise occur",0);
			systime0=0;
			}
		else{//相当于延时程序,对"Comp0 rise occur"显示延时
			systime0++;
			if(systime0>=20000L){
				systime0=0L;
				showline("Comp0 no rise ",0);
				}
		}
		if(isComp0Fall){
			isComp0Fall=0;
			function_on_cp0_F();
			showline("Comp0 fall occur",1);
			systime1=0;
			}
		else{//相当于延时程序,对"Comp0 fall occur"显示延时
			systime1++;
			if(systime1>=20000L){
				systime1=0L;
				showline("Comp0 no fall ",1);
				}
			}
	}
}
void CP0_ISR() interrupt 10{//比较器0中断
/*比较器中断标志位须在比较器状态发生跳变才会置1*/
	temppage=SFRPAGE;//软件保护SFRPAGE
	SFRPAGE=0x01;
	if(CP0RIF){
		isComp0Rise=1;
		CP0RIF=0;
		}
	if(CP0FIF){
		isComp0Fall=1;
		CP0FIF=0;
		}
	SFRPAGE=temppage;
}
void CP1_ISR() interrupt 11{//比较器1中断
	temppage=SFRPAGE;
	SFRPAGE=0x02;
	if(CP1RIF){
		CP1RIF=0;
		}
	if(CP1FIF){
		CP1FIF=0;
		}
	SFRPAGE=temppage;
}
void CP2_ISR() interrupt 12{//比较器2中断
	temppage=SFRPAGE;
	SFRPAGE=0x03;
	if(CP2RIF){
		CP2RIF=0;
		}
	if(CP0FIF){
		CP2FIF=0;
		}
	SFRPAGE=temppage;
}
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -