/* 当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
}
|