/* 當P5.5引腳電壓高于1.24V時,LED1不亮
當引腳電壓低于1.24V時,LED1閃爍
亮,LED2滅。*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sfr P5=0xC8;//xxxx,1111 端口5
sfr T2H=0xD6;//0000,0000 T2高字節
sfr T2L=0xD7;//0000,0000 T2低字節
sfr IE2=0xAF;//0000,0000 中斷控制寄存器2
/******比較器定義*******/
sfrCMPCR1=0XE6;
sfrCMPCR2=0XE7;
#defineCMPEN 0X80//比較器使能位
#defineCMPIF 0X40//中斷標志位,要人工清0
#definePIE 0X20//上升沿,即由低變高,只要有一個為高,CMPIF就變為1產生中斷
#defineNIE 0X10//下降沿,即由高變低,只要有一個為高,CMPIF就變為1產生中斷
#definePIS 0X08//比較器正端選擇,0為P5.5為正極
#defineNIS 0X04//比較器負端選擇,1為P5.4為負極,否則以單片機內部參考電壓1.24V為負端
#defineCMPOE 0X02//比較輸出結果控制位,0為正常輸出,1為從P1.2端輸出
#defineCMPRES 0X01//比較器結果標志位,當為1時,說明正端>參考負端,最終要看它是否為0
#defineINVCMPO 0X80//為1時取反從P1.2輸出,否則正常輸出
#defineDISFLT 0X40//比較器濾波輸出,為1時不濾波,為0時0.1秒濾波輸出
#defineLCDTY 0X3F//比較器輸抖動控制,最后5位
/******比較器定義*******/
sbit LED=P1^3;//LED輸出引腳
sbit LED1=P1^5;//LED輸出引腳
void delay(uchar z)
{
uchar x,y;
for(x=0;x<255;x++)
for(y=z;y>0;y--);
}
void main()
{
uint j=0;
CMPCR1=0;//將CMPCR1寄存器清0
CMPCR2=0;//將CMPCR2寄存器清0
CMPCR1&=~PIS;//將P5.5作為正端輸入,即第4位為0
CMPCR1&=~NIS;//選擇單片機內部電壓為基準1.24V
CMPCR1&=~CMPOE;//禁止輸出比較器結果
CMPCR2&=~INVCMPO;//比較器結果正常輸出到P1.2,不用取反
CMPCR2&=~DISFLT;//0.1秒濾波輸出
CMPCR2&=~LCDTY;//將結果不去抖直接輸出來
CMPCR2|=(DISFLT&0X10);//比較器結果在經過16個時鐘周期后輸出
CMPCR1|=PIE;//使能上升沿中斷,下降沿為NIE,上升沿PIE
CMPCR1|=CMPEN;//使能比較器
EA=1;//允許中斷
while(1)
{
if((CMPCR1&0X01)==0)//如果比較器結果為低即為0,則執行
{
for(j=0;j<30000;j++)
LED=!LED;//為高的時候第1個燈閃爍
delay(255);
}
else
{
LED=1;//為高的時候第1個燈閃爍
}
}
}
/*********************************/
/*******比較器中斷服務子程序******/
/*********************************/
void cpm_int() interrupt 21
{
CMPCR1&=~CMPIF;//清除中斷標志位,即CMPCR1&1011 1111
}
|