zhjzzh 发表于 2009-12-26 11:58:13

关于STC12单片机问题

大家好,在这里想问一个关于STC12系类单片机的问题
在下面的程序中,串口中断只响应一次,以后再发送数据串口都不响应,为什么
使用单片机为STC12C5A60S2
如果不加while循环,中断正常,加while循环,串口中断只响应一次,请赐教。
#include "stc12c5a60s2.h"
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uintunsigned int
#define sintsigned int

#define dogreset() WDT_CONTR=0x3c   //设置看门狗溢出时间约1秒
#define reload_count 0x0dc          //11.0592MHz1T模式 9600bpsSMOD=0

uchar idata fm1,fm2,fm3,fm4,fm5,fm6,fm7,fm8,fm9,fm10,fm11,fm12,fm13,fm14,fm15,fm16;

sbit rs485=P3^2;
uchar j;
uchar idata b_fs;

/**********风速采集端口声明****************/
sbit fs1=P0^0;
sbit fs2=P0^1;
sbit fs3=P0^2;
sbit fs4=P0^3;
sbit fs5=P0^4;
sbit fs6=P0^5;
sbit fs7=P0^6;
sbit fs8=P0^7;
sbit fs9=P2^7;
sbit fs10=P2^6;
sbit fs11=P2^5;
sbit fs12=P2^4;
sbit fs13=P2^3;
sbit fs14=P2^2;
sbit fs15=P2^1;
sbit fs16=P2^0;

/**************串口1初始化*******************/
void uart1_init(void)
{
SCON=0x50;               //串口工作在方式1,接收使能
BRT=reload_count;                   //装载数据,波特率19200
AUXR=0x15;               //使用1T模式,BRTR=1启动波特率发生器,S1BRS=1串口1选择独立波特率发生器作为波特率发生器
                           //Bard=Fosc/(256-reload_count)/32/12 ,使用1T模式
AUXR1=0x80;            //释放该行命令,则串行口从P3口切换到p1口
//PS=1;         //串口中断优先级高
ES=1;                  //允许串口中断
IPH|=0x10;      //PSH=1,串口中断优先级最高
EA=1;       
}

void txd1_byte(uchar i)       //向串口1发送一个字节的数据
{
ES=0;
TI=0;
SBUF=i;
dogreset();
while(TI==0);
TI=0;
ES=1;
}

/**************串口接收中断*********************/
void uart_routine(void) interrupt 4
{
uchar txdata;
uchar k;
dogreset();
if(RI==1)
{
   RI=0;
   txdata=SBUF;
   if(txdata==0xf1)       
   {
   rs485=1;   
       _nop_();
       txd1_byte(0xe1);   
        for(k=0;k<16;k++)
       {
          txd1_byte(b_fs);       
        _nop_();_nop_();_nop_();_nop_();
           // delay_nus(1);
       }
       rs485=0;
        }
}
else
    TI=0;
       
}

/*************定时器0和1初始化**************************/
void t0_t1_init(void)
{

TMOD=0x01;//定时器0工作在方式1,定时器1工作在方式2(8位自动重装)
AUXR&=~0x80;//T0x12位清0,传统8051模式,12分频
TH0=0x4c;
TL0=0x00;          //T0定时50ms,用于读取各端口的风速脉冲值
ET0=1;   //T0溢出中断使能
TR0=1;          //T0运行允许

}

/************t0中断,读取风速脉冲并计算出风速值********************/
void T0_routine(void) interrupt 1
{

TH0=0x4c;
TL0=0x00;        //重装定时器,50ms中断一次
j++;
dogreset();
if(j==20)       
{
   b_fs=(fm1*10)/5;   
   fm1=0;
   b_fs=(fm2*10)/5;
   fm2=0;
   b_fs=(fm3*10)/5;
   fm3=0;
   b_fs=(fm4*10)/5;
   fm4=0;
   b_fs=(fm5*10)/5;
   fm5=0;
   b_fs=(fm6*10)/5;
   fm6=0;
   b_fs=(fm7*10)/5;
   fm7=0;
   b_fs=(fm8*10)/5;
   fm8=0;
   b_fs=(fm9*10)/5;
   fm9=0;
   b_fs=(fm10*10)/5;
   fm10=0;
   b_fs=(fm11*10)/5;
   fm11=0;
   b_fs=(fm12*10)/5;
   fm12=0;
   b_fs=(fm13*10)/5;
   fm13=0;
   b_fs=(fm14*10)/5;
   fm14=0;
   b_fs=(fm15*10)/5;
   fm15=0;
   b_fs=(fm16*10)/5;
   fm16=0;
   j=0;

}

}
/****************************/


void main(void)
{

P0M0=0x00;
P0M1=0x00;          
P1M0=0xe1;
P1M1=0xe1;    //p1.0开漏,用于AD采样, p1.5 p1.6 p1.7设为开漏,用于连接3V气压芯片
P2M0=0x00;
P2M1=0x00;          
P3M0=0x00;
P3M1=0x00;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
P1ASF=0x01;                //将所有P1.0口设置为模拟功能,选取相应的channel通道作为模拟输入通道
AUXR1&=~0x04;      //令ADRJ=0,转换后高8位在ADC_RES寄存器中,低2位再ADC_RESL寄存器中
uart1_init();
//dogreset();
t0_t1_init();
EA=1;

while(1)
{
   dogreset();
       
   //txd1_byte(0xe1);
   //fs_gather();          //采集风速脉冲
   if(fs1==!fs1)
    fm1++;
   if(fs2==!fs2)
    fm2++;
   if(fs3==!fs3)
    fm3++;
   if(fs4==!fs4)
    fm4++;
   if(fs5==!fs5)
    fm5++;
   if(fs6==!fs6)
    fm6++;
   if(fs7==!fs7)
    fm7++;
   if(fs8==!fs8)
    fm8++;
   if(fs9==!fs9)
    fm9++;
   if(fs10==!fs10)
    fm10++;
   if(fs11==!fs11)
    fm11++;
   if(fs12==!fs12)
    fm12++;
   if(fs13==!fs13)
    fm13++;
   if(fs14==!fs14)
    fm14++;
   if(fs15==!fs15)
    fm15++;
   if(fs16==!fs16)
    fm16++;          

}
}#include "stc12c5a60s2.h"
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uintunsigned int
#define sintsigned int

#define dogreset() WDT_CONTR=0x3c   //设置看门狗溢出时间约1秒
#define reload_count 0x0dc          //11.0592MHz1T模式 9600bpsSMOD=0

uchar idata fm1,fm2,fm3,fm4,fm5,fm6,fm7,fm8,fm9,fm10,fm11,fm12,fm13,fm14,fm15,fm16;

sbit rs485=P3^2;
uchar j;
uchar idata b_fs;

/**********风速采集端口声明****************/
sbit fs1=P0^0;
sbit fs2=P0^1;
sbit fs3=P0^2;
sbit fs4=P0^3;
sbit fs5=P0^4;
sbit fs6=P0^5;
sbit fs7=P0^6;
sbit fs8=P0^7;
sbit fs9=P2^7;
sbit fs10=P2^6;
sbit fs11=P2^5;
sbit fs12=P2^4;
sbit fs13=P2^3;
sbit fs14=P2^2;
sbit fs15=P2^1;
sbit fs16=P2^0;

/**************串口1初始化*******************/
void uart1_init(void)
{
SCON=0x50;               //串口工作在方式1,接收使能
BRT=reload_count;                   //装载数据,波特率19200
AUXR=0x15;               //使用1T模式,BRTR=1启动波特率发生器,S1BRS=1串口1选择独立波特率发生器作为波特率发生器
                           //Bard=Fosc/(256-reload_count)/32/12 ,使用1T模式
AUXR1=0x80;            //释放该行命令,则串行口从P3口切换到p1口
//PS=1;         //串口中断优先级高
ES=1;                  //允许串口中断
IPH|=0x10;      //PSH=1,串口中断优先级最高
EA=1;       
}

void txd1_byte(uchar i)       //向串口1发送一个字节的数据
{
ES=0;
TI=0;
SBUF=i;
dogreset();
while(TI==0);
TI=0;
ES=1;
}

/**************串口接收中断*********************/
void uart_routine(void) interrupt 4
{
uchar txdata;
uchar k;
dogreset();
if(RI==1)
{
   RI=0;
   txdata=SBUF;
   if(txdata==0xf1)       
   {
   rs485=1;   
       _nop_();
       txd1_byte(0xe1);   
        for(k=0;k<16;k++)
       {
          txd1_byte(b_fs);       
        _nop_();_nop_();_nop_();_nop_();
           // delay_nus(1);
       }
       rs485=0;
        }
}
else
    TI=0;
       
}

/*************定时器0和1初始化**************************/
void t0_t1_init(void)
{

TMOD=0x01;//定时器0工作在方式1,定时器1工作在方式2(8位自动重装)
AUXR&=~0x80;//T0x12位清0,传统8051模式,12分频
TH0=0x4c;
TL0=0x00;          //T0定时50ms,用于读取各端口的风速脉冲值
ET0=1;   //T0溢出中断使能
TR0=1;          //T0运行允许

}

/************t0中断,读取风速脉冲并计算出风速值********************/
void T0_routine(void) interrupt 1
{

TH0=0x4c;
TL0=0x00;        //重装定时器,50ms中断一次
j++;
dogreset();
if(j==20)       
{
   b_fs=(fm1*10)/5;   
   fm1=0;
   b_fs=(fm2*10)/5;
   fm2=0;
   b_fs=(fm3*10)/5;
   fm3=0;
   b_fs=(fm4*10)/5;
   fm4=0;
   b_fs=(fm5*10)/5;
   fm5=0;
   b_fs=(fm6*10)/5;
   fm6=0;
   b_fs=(fm7*10)/5;
   fm7=0;
   b_fs=(fm8*10)/5;
   fm8=0;
   b_fs=(fm9*10)/5;
   fm9=0;
   b_fs=(fm10*10)/5;
   fm10=0;
   b_fs=(fm11*10)/5;
   fm11=0;
   b_fs=(fm12*10)/5;
   fm12=0;
   b_fs=(fm13*10)/5;
   fm13=0;
   b_fs=(fm14*10)/5;
   fm14=0;
   b_fs=(fm15*10)/5;
   fm15=0;
   b_fs=(fm16*10)/5;
   fm16=0;
   j=0;

}

}
/****************************/


void main(void)
{

P0M0=0x00;
P0M1=0x00;          
P1M0=0xe1;
P1M1=0xe1;    //p1.0开漏,用于AD采样, p1.5 p1.6 p1.7设为开漏,用于连接3V气压芯片
P2M0=0x00;
P2M1=0x00;          
P3M0=0x00;
P3M1=0x00;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
P1ASF=0x01;                //将所有P1.0口设置为模拟功能,选取相应的channel通道作为模拟输入通道
AUXR1&=~0x04;      //令ADRJ=0,转换后高8位在ADC_RES寄存器中,低2位再ADC_RESL寄存器中
uart1_init();
//dogreset();
t0_t1_init();
EA=1;

while(1)
{
   dogreset();
       
   //txd1_byte(0xe1);
   //fs_gather();          //采集风速脉冲
   if(fs1==!fs1)
    fm1++;
   if(fs2==!fs2)
    fm2++;
   if(fs3==!fs3)
    fm3++;
   if(fs4==!fs4)
    fm4++;
   if(fs5==!fs5)
    fm5++;
   if(fs6==!fs6)
    fm6++;
   if(fs7==!fs7)
    fm7++;
   if(fs8==!fs8)
    fm8++;
   if(fs9==!fs9)
    fm9++;
   if(fs10==!fs10)
    fm10++;
   if(fs11==!fs11)
    fm11++;
   if(fs12==!fs12)
    fm12++;
   if(fs13==!fs13)
    fm13++;
   if(fs14==!fs14)
    fm14++;
   if(fs15==!fs15)
    fm15++;
   if(fs16==!fs16)
    fm16++;          

}
}#include "stc12c5a60s2.h"
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uintunsigned int
#define sintsigned int

#define dogreset() WDT_CONTR=0x3c   //设置看门狗溢出时间约1秒
#define reload_count 0x0dc          //11.0592MHz1T模式 9600bpsSMOD=0

uchar idata fm1,fm2,fm3,fm4,fm5,fm6,fm7,fm8,fm9,fm10,fm11,fm12,fm13,fm14,fm15,fm16;

sbit rs485=P3^2;
uchar j;
uchar idata b_fs;

/**********风速采集端口声明****************/
sbit fs1=P0^0;
sbit fs2=P0^1;
sbit fs3=P0^2;
sbit fs4=P0^3;
sbit fs5=P0^4;
sbit fs6=P0^5;
sbit fs7=P0^6;
sbit fs8=P0^7;
sbit fs9=P2^7;
sbit fs10=P2^6;
sbit fs11=P2^5;
sbit fs12=P2^4;
sbit fs13=P2^3;
sbit fs14=P2^2;
sbit fs15=P2^1;
sbit fs16=P2^0;

/**************串口1初始化*******************/
void uart1_init(void)
{
SCON=0x50;               //串口工作在方式1,接收使能
BRT=reload_count;                   //装载数据,波特率19200
AUXR=0x15;               //使用1T模式,BRTR=1启动波特率发生器,S1BRS=1串口1选择独立波特率发生器作为波特率发生器
                           //Bard=Fosc/(256-reload_count)/32/12 ,使用1T模式
AUXR1=0x80;            //释放该行命令,则串行口从P3口切换到p1口
//PS=1;         //串口中断优先级高
ES=1;                  //允许串口中断
IPH|=0x10;      //PSH=1,串口中断优先级最高
EA=1;       
}

void txd1_byte(uchar i)       //向串口1发送一个字节的数据
{
ES=0;
TI=0;
SBUF=i;
dogreset();
while(TI==0);
TI=0;
ES=1;
}

/**************串口接收中断*********************/
void uart_routine(void) interrupt 4
{
uchar txdata;
uchar k;
dogreset();
if(RI==1)
{
   RI=0;
   txdata=SBUF;
   if(txdata==0xf1)       
   {
   rs485=1;   
       _nop_();
       txd1_byte(0xe1);   
        for(k=0;k<16;k++)
       {
          txd1_byte(b_fs);       
        _nop_();_nop_();_nop_();_nop_();
           // delay_nus(1);
       }
       rs485=0;
        }
}
else
    TI=0;
       
}

/*************定时器0和1初始化**************************/
void t0_t1_init(void)
{

TMOD=0x01;//定时器0工作在方式1,定时器1工作在方式2(8位自动重装)
AUXR&=~0x80;//T0x12位清0,传统8051模式,12分频
TH0=0x4c;
TL0=0x00;          //T0定时50ms,用于读取各端口的风速脉冲值
ET0=1;   //T0溢出中断使能
TR0=1;          //T0运行允许

}

/************t0中断,读取风速脉冲并计算出风速值********************/
void T0_routine(void) interrupt 1
{

TH0=0x4c;
TL0=0x00;        //重装定时器,50ms中断一次
j++;
dogreset();
if(j==20)       
{
   b_fs=(fm1*10)/5;   
   fm1=0;
   b_fs=(fm2*10)/5;
   fm2=0;
   b_fs=(fm3*10)/5;
   fm3=0;
   b_fs=(fm4*10)/5;
   fm4=0;
   b_fs=(fm5*10)/5;
   fm5=0;
   b_fs=(fm6*10)/5;
   fm6=0;
   b_fs=(fm7*10)/5;
   fm7=0;
   b_fs=(fm8*10)/5;
   fm8=0;
   b_fs=(fm9*10)/5;
   fm9=0;
   b_fs=(fm10*10)/5;
   fm10=0;
   b_fs=(fm11*10)/5;
   fm11=0;
   b_fs=(fm12*10)/5;
   fm12=0;
   b_fs=(fm13*10)/5;
   fm13=0;
   b_fs=(fm14*10)/5;
   fm14=0;
   b_fs=(fm15*10)/5;
   fm15=0;
   b_fs=(fm16*10)/5;
   fm16=0;
   j=0;

}

}
/****************************/


void main(void)
{

P0M0=0x00;
P0M1=0x00;          
P1M0=0xe1;
P1M1=0xe1;    //p1.0开漏,用于AD采样, p1.5 p1.6 p1.7设为开漏,用于连接3V气压芯片
P2M0=0x00;
P2M1=0x00;          
P3M0=0x00;
P3M1=0x00;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
P1ASF=0x01;                //将所有P1.0口设置为模拟功能,选取相应的channel通道作为模拟输入通道
AUXR1&=~0x04;      //令ADRJ=0,转换后高8位在ADC_RES寄存器中,低2位再ADC_RESL寄存器中
uart1_init();
//dogreset();
t0_t1_init();
EA=1;

while(1)
{
   dogreset();
       
   //txd1_byte(0xe1);
   //fs_gather();          //采集风速脉冲
   if(fs1==!fs1)
    fm1++;
   if(fs2==!fs2)
    fm2++;
   if(fs3==!fs3)
    fm3++;
   if(fs4==!fs4)
    fm4++;
   if(fs5==!fs5)
    fm5++;
   if(fs6==!fs6)
    fm6++;
   if(fs7==!fs7)
    fm7++;
   if(fs8==!fs8)
    fm8++;
   if(fs9==!fs9)
    fm9++;
   if(fs10==!fs10)
    fm10++;
   if(fs11==!fs11)
    fm11++;
   if(fs12==!fs12)
    fm12++;
   if(fs13==!fs13)
    fm13++;
   if(fs14==!fs14)
    fm14++;
   if(fs15==!fs15)
    fm15++;
   if(fs16==!fs16)
    fm16++;          

}
}#include "stc12c5a60s2.h"
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uintunsigned int
#define sintsigned int

#define dogreset() WDT_CONTR=0x3c   //设置看门狗溢出时间约1秒
#define reload_count 0x0dc          //11.0592MHz1T模式 9600bpsSMOD=0

uchar idata fm1,fm2,fm3,fm4,fm5,fm6,fm7,fm8,fm9,fm10,fm11,fm12,fm13,fm14,fm15,fm16;

sbit rs485=P3^2;
uchar j;
uchar idata b_fs;

/**********风速采集端口声明****************/
sbit fs1=P0^0;
sbit fs2=P0^1;
sbit fs3=P0^2;
sbit fs4=P0^3;
sbit fs5=P0^4;
sbit fs6=P0^5;
sbit fs7=P0^6;
sbit fs8=P0^7;
sbit fs9=P2^7;
sbit fs10=P2^6;
sbit fs11=P2^5;
sbit fs12=P2^4;
sbit fs13=P2^3;
sbit fs14=P2^2;
sbit fs15=P2^1;
sbit fs16=P2^0;

/**************串口1初始化*******************/
void uart1_init(void)
{
SCON=0x50;               //串口工作在方式1,接收使能
BRT=reload_count;                   //装载数据,波特率19200
AUXR=0x15;               //使用1T模式,BRTR=1启动波特率发生器,S1BRS=1串口1选择独立波特率发生器作为波特率发生器
                           //Bard=Fosc/(256-reload_count)/32/12 ,使用1T模式
AUXR1=0x80;            //释放该行命令,则串行口从P3口切换到p1口
//PS=1;         //串口中断优先级高
ES=1;                  //允许串口中断
IPH|=0x10;      //PSH=1,串口中断优先级最高
EA=1;       
}

void txd1_byte(uchar i)       //向串口1发送一个字节的数据
{
ES=0;
TI=0;
SBUF=i;
dogreset();
while(TI==0);
TI=0;
ES=1;
}

/**************串口接收中断*********************/
void uart_routine(void) interrupt 4
{
uchar txdata;
uchar k;
dogreset();
if(RI==1)
{
   RI=0;
   txdata=SBUF;
   if(txdata==0xf1)       
   {
   rs485=1;   
       _nop_();
       txd1_byte(0xe1);   
        for(k=0;k<16;k++)
       {
          txd1_byte(b_fs);       
        _nop_();_nop_();_nop_();_nop_();
           // delay_nus(1);
       }
       rs485=0;
        }
}
else
    TI=0;
       
}

/*************定时器0和1初始化**************************/
void t0_t1_init(void)
{

TMOD=0x01;//定时器0工作在方式1,定时器1工作在方式2(8位自动重装)
AUXR&=~0x80;//T0x12位清0,传统8051模式,12分频
TH0=0x4c;
TL0=0x00;          //T0定时50ms,用于读取各端口的风速脉冲值
ET0=1;   //T0溢出中断使能
TR0=1;          //T0运行允许

}

/************t0中断,读取风速脉冲并计算出风速值********************/
void T0_routine(void) interrupt 1
{

TH0=0x4c;
TL0=0x00;        //重装定时器,50ms中断一次
j++;
dogreset();
if(j==20)       
{
   b_fs=(fm1*10)/5;   
   fm1=0;
   b_fs=(fm2*10)/5;
   fm2=0;
   b_fs=(fm3*10)/5;
   fm3=0;
   b_fs=(fm4*10)/5;
   fm4=0;
   b_fs=(fm5*10)/5;
   fm5=0;
   b_fs=(fm6*10)/5;
   fm6=0;
   b_fs=(fm7*10)/5;
   fm7=0;
   b_fs=(fm8*10)/5;
   fm8=0;
   b_fs=(fm9*10)/5;
   fm9=0;
   b_fs=(fm10*10)/5;
   fm10=0;
   b_fs=(fm11*10)/5;
   fm11=0;
   b_fs=(fm12*10)/5;
   fm12=0;
   b_fs=(fm13*10)/5;
   fm13=0;
   b_fs=(fm14*10)/5;
   fm14=0;
   b_fs=(fm15*10)/5;
   fm15=0;
   b_fs=(fm16*10)/5;
   fm16=0;
   j=0;

}

}
/****************************/


void main(void)
{

P0M0=0x00;
P0M1=0x00;          
P1M0=0xe1;
P1M1=0xe1;    //p1.0开漏,用于AD采样, p1.5 p1.6 p1.7设为开漏,用于连接3V气压芯片
P2M0=0x00;
P2M1=0x00;          
P3M0=0x00;
P3M1=0x00;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
P1ASF=0x01;                //将所有P1.0口设置为模拟功能,选取相应的channel通道作为模拟输入通道
AUXR1&=~0x04;      //令ADRJ=0,转换后高8位在ADC_RES寄存器中,低2位再ADC_RESL寄存器中
uart1_init();
//dogreset();
t0_t1_init();
EA=1;

while(1)
{
   dogreset();
       
   //txd1_byte(0xe1);
   //fs_gather();          //采集风速脉冲
   if(fs1==!fs1)
    fm1++;
   if(fs2==!fs2)
    fm2++;
   if(fs3==!fs3)
    fm3++;
   if(fs4==!fs4)
    fm4++;
   if(fs5==!fs5)
    fm5++;
   if(fs6==!fs6)
    fm6++;
   if(fs7==!fs7)
    fm7++;
   if(fs8==!fs8)
    fm8++;
   if(fs9==!fs9)
    fm9++;
   if(fs10==!fs10)
    fm10++;
   if(fs11==!fs11)
    fm11++;
   if(fs12==!fs12)
    fm12++;
   if(fs13==!fs13)
    fm13++;
   if(fs14==!fs14)
    fm14++;
   if(fs15==!fs15)
    fm15++;
   if(fs16==!fs16)
    fm16++;          

}
}

zhjzzh 发表于 2009-12-26 12:01:04

回复【楼主位】zhjzzh
-----------------------------------------------------------------------

不好意思,按键错误,发的太多了,见谅,请看第二个#include "stc12c5a60s2.h"上面的就行了。

zhjzzh 发表于 2009-12-26 12:08:03

不是程序问题,是我的硬件问题,唉,白忙了半天。
页: [1]
查看完整版本: 关于STC12单片机问题