📄 wcp1.c
字号:
//参考程序B : WCP1.c 此程序可完成CP1比较器的比较功能,比较器基准信号来自于VREF引脚,比较器响应后将产中断, 在主程序中设定P4=0FH,.在中断程序中对P4求反,同时发光二极管的状态也会改变.比较器1上升沿中断服务程序 ,鸣笛二次,比较器1下降沿中断服务程序 ,鸣笛一次.
#include <c8051f020.h>
#include <intrins.h>
sbit BELL = P3^5;
void PORT_Init (void);
void CPT1_Init (void);
void CPT1_ISR (void);
void CPT1B_ISR (void);
void sleep_ms(unsigned int count);
void main (void) {
WDTCN = 0xde;
WDTCN = 0xad; //禁止看门狗定时器
P4=0x0f;
PORT_Init ();
CPT1_Init ();
EA=1;
while (1)
{
}
}
void CPT1_Init (void)// 比较器1初始化
{
EIE1 |=0xC0; //比较器CP1下降沿/上升沿中断允许位置1,允许CP1RIF标志位/CP1FIF标志位的中断请求.
CPT1CN =0x8F; //CP1允许,CP1正/负回差设定为10mv
REF0CN |= 0x01; //用基准电压作为比较信号基准,CP1N接VREF
}
void PORT_Init (void) // 通用I/O口及交叉开关初始化
{
XBR2 = 0x40;
XBR1 =0x01; //将CP1输出端引到P0.1脚
XBR0 =0x80; //将CP0输出端引到P0.0脚
P74OUT |= 0x03; //P4为推挽输出
}
void CPT1_ISR (void) interrupt 12 //比较器1下降沿中断服务程序
{ //鸣笛一次
CPT1CN &=~ 0x30;
P4 = ~P4; //发光二极管的状态改变
BELL=0;
sleep_ms(100);
BELL=1;
}
void CPT1B_ISR (void) interrupt 13 //比较器1上升沿中断服务程序
{ //鸣笛二次
CPT1CN &=~ 0x30;
P4 = ~P4; //发光二极管的状态改变
BELL=0; //鸣笛
sleep_ms(100);
BELL=1;
sleep_ms(100);
BELL=0; //鸣笛
sleep_ms(100);
BELL=1;
}
void sleep_ms(unsigned int count)
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -