关于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
-----------------------------------------------------------------------
不好意思,按键错误,发的太多了,见谅,请看第二个#include "stc12c5a60s2.h"上面的就行了。 不是程序问题,是我的硬件问题,唉,白忙了半天。
页:
[1]