方波脉冲计数,用INT1计数,T0定时器每1s处理一次方波数目,计算出频率,并通过串口将数目发送出去。
问题:LED1闪亮,并且串口调试助手接收到(06 0B 00 00 01 00 09),说明响应了T0中断,但是LED0没有亮,根据接收到的数据(06 0B 00 00 01 00 09),说明没有响应外部中断1,没有对方波计数。
#include<reg52.h>
typedef unsigned char BYTE;
typedef unsigned long LWORD;
sbit LED0=P0^0;
sbit LED1=P0^1;
bit flag;
LWORD pulsecount;
LWORD pulse_num;
BYTE timecount;
BYTE sp[10];
float speed;
float x;
void SendByte(unsigned char *sent);//串口发送函数声明
void delay(LWORD sms);
void another_delay(LWORD sms);
void Init(void);
void main (void)
{
Init();
while(1);
}
void Init(void) //初始化函数
{
IE=0x86; //开中断,EA=1,,ET0=1,EX1=1
//IP=0x0A; //中断优先级ET0>ET1>EX0>EX1>ES>ET2
IT1=1; //INT1是
PCON=0x00; //SMOD=0;
SCON=0x52; // SCON: 模式 1, 8-bit UART. TI=1
TMOD=0x21; // TMOD: timer1,8bit_reload,作为比特率发生器;timer 0, mode 1, 16-bit
TH1=0xFD; // TH1: 重装值FD,11.0592MHZ,波特率9600
TR1=1; //TIMER1 RUN
//TH0=0xC3; //timer0是50ms
//TL0=0x50;
TH0=(65536-50000)/256; //timer0是50ms
TL0=(65536-50000)%256;
TR0=1; //开启定时器0
LED0=1;
LED1=1;
pulsecount=1;
timecount=1;
flag=0;
}
void T0_ISR(void) interrupt 1
{
//TH0=0xC3; //timer0重装50ms
//TL0=0x50;
TH0=(65536-50000)/256; //timer0是50ms
TL0=(65536-50000)%256;
timecount++;
if(timecount==20) //定时1s处理一次数据
{
timecount=0;
flag=1;
pulse_num=pulsecount;
pulsecount=0;
if(flag==1)
{
flag=0;
x=0.1319468892*(pulse_num+1); //算出频率为x
speed= x; // speed=(pulsenum+1)/200*840*3.1415926/100 m/s
sp[0]=0x06; //包头
sp[1]= 0x0B; //报文类别
sp[2]= ((unsigned int)(speed)&0x00f0)>>4; //整数的低位
sp[3]= (unsigned int)(speed)&0x000f; //整数的高位
sp[4]= (unsigned short)((speed-(int)speed)*10); //小数的十分位
sp[5]= 0x00; //补充信息
sp[6]=0x09; //包尾
SendByte(&sp[0]);
LED1=0;
pulsecount=0;
timecount=0;
another_delay(10);
LED1=~LED1;
}
else
{
sp[0]=0x06; //包头
sp[1]=0x0B; //报文类别
sp[2]=00;
sp[3]=0;
sp[4]=0;
sp[5]=0; //补充信息
sp[6]=0x09; //包尾
SendByte(&sp[0]);
}
}
}
void INT1_ISR(void) interrupt 2
{
LED0=0;
pulsecount++; //脉冲计数
LED0=1;
}
void SendByte(BYTE *sent) //发送函数
{
LWORD i;
BYTE SE[7];
for(i=0;i<7;i++)
{
SE
=*(sent++);
}
for(i=0;i<7;i++)
{
SBUF=SE;
while(!TI); //等待8 bit的数据全部存储到SBUF中,然后TI=1
TI=0;
}
}
void delay(LWORD sms)
{
LWORD x,y;
for(x=sms;x>0;x--)
for(y=110;y>0;y--);
}
void another_delay(LWORD sms)
{
LWORD x,y;
for(x=sms;x>0;x--)
for(y=110;y>0;y--);
}
[ 本帖最后由 ml0943 于 2012-12-29 13:57 编辑 ]
此帖出自小平头技术问答
一周热门 更多>