适用CCP捕获功能,不用while循环等待
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit tx = P1^0;
sbit rx = P1^1;
unsigned char flag = 0;
unsigned int distans = 0;
void CCP_Init(){
CMOD=0x01;
CCON=0x00;
CL = 0;
CH = 0;
CCAPM0 = 0x01; //打开捕获中断
}
void Timer0Init(void) //2毫秒@12MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x40; //Initial timer value
TH0 = 0xA2; //Initial timer value
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
void Timer0() interrupt 1{
static unsigned int i = 0;
i++;
if(i == 200){
flag = 1;
i = 0;
}
}
void Delay12us() //@12MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void sent(){
unsigned char i = 0;
for(i = 0; i < 8; i++){
tx = 1;
Delay12us();
tx = 0;
Delay12us();
}
CR = 1;
CCAPM0 |= 0x10; //设置下降沿捕获
}
void PCA_Int() interrupt 7
{
if(CCF0){
distans = (CCAP0H << 8) + CCAP0L;
distans = (unsigned long)distans * 17 / 1000 ;
}else if(CF){
distans = 999;
}
CF = 0;
CCF0=0; //捕获/比较中断标志位清零
CR = 0;
CCAPM0 &= 0xEF;
CL = 0;
CH = 0;
}
void main(){
Timer0Init();
CCP_Init();
while(1){
if(flag == 1){
flag = 0;
sent();
}
//显示函数
//......
}
}