打印
[国产单片机]

stc89c52_脉冲计数_中断

[复制链接]
1325|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ml0943|  楼主 | 2012-12-25 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ml0943 于 2012-12-26 10:22 编辑

stc89c52_脉冲计数_中断
函数是将脉冲方波信号接到INT1(在这个中断函数中实现方波计数,有一个方波LED0亮),T0定时100MS处理一次方波数目,然后通过串口发送
现在问题是:LED0灯闪亮,说明接收到了脉冲信号计数,但是LED1不亮,说明没有实现中断数据处理,不知道哪里有问题,程序编译通过了,没有错误


#include<reg52.h>
typedef unsigned char BYTE;
typedef unsigned long LWORD;
//sbit portbit=P1^0; //在P1.0引脚生成50HZ的方波,接到INT1引脚上
sbit LED0=P0^0;
sbit LED1=P0^1;
bit flag;
LWORD pulsecount;
BYTE timecount;
BYTE sp[10];
float speed;
float x;
void SendByte(unsigned char *sent);//串口发送函数声明
void delay(LWORD sms);
//void pulse(void);     //产生方波信号在引脚p1.0
void Init(void);

void main (void)
{
Init();
//pulse();
while(1)
{
  if(flag==1)
  {
   flag=0;
   x=4194.304*(pulsecount+1);  //算出频率为x
   speed= 3.38*x;            //  speed=x*3.14*215/200
     
   sp[1]= 0x0B;           //报文类别
   sp[2]= ((int)(speed)&0x00f0)>>4; //整数的低位
   sp[3]= (int)(speed)&0x000f;    //整数的高位
      sp[4]= (unsigned short)((speed-(int)speed)*10);  //小数的十分??
   sp[5]= 0x00;         //补充信息
   sp[6]=0x01;
   SendByte(&sp[0]);
   LED1=0;
   pulsecount=0;
   timecount=0;
   LED1=1;
  }
  else
  {
   sp[1]=0x0B;           //报文类别
   sp[2]=00;
   sp[3]=0;   
   sp[4]=0;
   sp[5]=0;         //补充信息
   sp[6]=0x01;
   SendByte(&sp[0]);
   
  }
}
}
void Init(void)       //初始化函数
{                                
IE=0x96;      //开中断,EA=1,ES=1,ET0=1,EX1=1
// IP=0x12;                      //中断优先级ET0>ES>EX0>EX1>ET1>ET2
IT1=1;      //INT1是下降沿触发方式

SCON=0x50;          // SCON: 模式 1, 8-bit UART
    TMOD=0x21;               // TMOD: timer1,8bit_reload,作为比特率发生器;timer 0, mode 1, 16-bit
    TH1=0xFD;               // TH1:  重装值FD,12MHZ,波特率9600   
TH0=0xC3;       //timer0是50ms
TL0=0x50;   
TR0=1;               

LED0=1;
LED1=1;
pulsecount=1;
timecount=1;
flag=0;
}

void T0_ISR(void) interrupt 1
{
timecount++;
if(timecount==2)    //定时100ms处理一次数据
{
  timecount=0;
  flag=1;
}
}
void INT1_ISR(void) interrupt 2
{
  LED0=0;
  pulsecount++;      //脉冲计数
  delay(10);
  LED0=1;
}
void SendByte(BYTE *sent)   //发送函数
{
LWORD i;
BYTE SE[10];
for(i=0;i<10;i++)
{
  SE=*(sent++);
}
for(i=0;i<10;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--);
}


相关帖子

沙发
uet_cache| | 2012-12-26 09:36 | 只看该作者
你的程序有好多问题。T0定时器中断函数没有重装载值。LED1由0到1执行时间只有两条执令时间,即使运行,时间会很短,肉眼可能分不出来。另外,你的SENDBYTE函数很多问题。SE是地址SE[i]才是数据,你看你的SE=*(sent++) 这样明显不正确吧。更别说SUBF=SE了。总之SENDBYTE函数太多问题。

使用特权

评论回复
板凳
ml0943|  楼主 | 2012-12-26 10:10 | 只看该作者
对对T0没有重装值,但是这个SENDBYTE函数我用过的,可以发送数组,
void T0_ISR(void) interrupt 1
{
        TH0=0xC3;         //timer0重装50ms
        TL0=0x50;
        timecount++;
        if(timecount==2)           //定时100ms处理一次数据
        {
                timecount=0;
                flag=1;
                pulse_num=pulsecount;
                pulsecount=0;
        }
}

使用特权

评论回复
地板
uet_cache| | 2012-12-26 10:53 | 只看该作者
你可以再温习一下C语言中的指针部分内容。如果你以前有用到或是对的,那估计,你没细看,或者误打误撞。。

使用特权

评论回复
5
ml0943|  楼主 | 2012-12-26 11:28 | 只看该作者
uet_cache 发表于 2012-12-26 10:53
你可以再温习一下C语言中的指针部分内容。如果你以前有用到或是对的,那估计,你没细看,或者误打误撞。。 ...

好的,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:就算是一个believe,中间也藏有一个lie。

2

主题

35

帖子

0

粉丝