微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于STC单片机的中断问题

关于STC单片机的中断问题

时间:10-02 整理:3721RD 点击:
先说下问题,程序中我设置了两个中断,一为定时器0中断,二为串口中断。单片机上电后,程序运行正常,P37叫的电平变化也正常,当进入串口接收到0x11,P37的电平频率发生明显变化,当串口收到其他数值时,P37电平频率又正常,按道理这是不应该影响到的。现贴上部分程序,求指点迷津!

typedef unsigned char   BYTE;
typedef unsigned int    WORD;
typedef unsigned long        ULONG;
BYTE   UART_data;              //定义串口接收数据变量
BYTE   data_used[6];           //定义空数组,用于中断数据处理
BYTE   num;
ULONG  Water_AD,Water_VO,Ziwai,Voc,Average,Sum,Wum;
WORD   i,count;
WORD   WFlag=0,ZFlag=0,VFlag=0,flag=0;

#define   FOSC    11059200L              //定义晶振频率
#define   BAUD    9600                  //定义波特率
/*定义翻转引脚*/
sbit P37 = P3^7;               

/*延时函数声明*/
void Delay(WORD n);
void Delay_ms(WORD a);
/*******************************************************************************
* 函数名        : Timer0Interrupt
* 描述            : 串口中断处理函数
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void Timer0Interrupt() interrupt 1 using 1
{                        
    TL0 = (65536-10)%256;                    
    TH0 = (65536-10)/256;
    count++;
if(count=5)
{
    flag=1;
count=0;
}
}

/*******************************************************************************
* 函数名        : InitializeTimer0
* 描述            : 定时器初始化
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void InitializeTimer0()
{
    TMOD = 0x01;                    //定义Timer0为16位工作方式
    TL0 = (65536-10)%256;                    
    TH0 = (65536-10)/256;
                           
    ET0 = 1;                        //允许Timer0 中断
    EA  = 1;  
TR0 = 1;                       
    count = 0;
}
/*******************************************************************************
* 函数名        : InitializeADC
* 描述            : ADC初始化
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void InitializeADC()
{
    P1 = P1M0 = P1M1 = 0xff;        
    ADC_DATA = 0;                  
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                     
}
/*******************************************************************************
* 函数名        : ReadADCData
* 描述            : ADC初始化
* 输入参数  : ch     
* 返回参数  : ADC_DATA
*******************************************************************************/
BYTE ReadADCData(BYTE ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                                               //延时
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));                       //等待完整标志位
    ADC_CONTR &= ~ADC_FLAG;                                //关闭 ADC
   
return ADC_DATA;                                       
}
/*******************************************************************************
* 函数名        : InitializeUsart
* 描述            : 串口初始化
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void InitializeUsart()
{
    EA = 1;                                             //允许中断        
    ES = 1;
SCON = 0x5a;                                        //8 数据位,无校验位
    TMOD = 0x20;                    
    TH1 = TL1 = -(FOSC/12/32/BAUD);                     //设置波特率
    TR1 = 1;                                 
}
/*发送一个字节 */
void SendData(unsigned char dat)
{
    while (!TI);                    
    TI = 0;                        
    SBUF = dat;                     
}
/*******************************************************************************
* 函数名        : DataGet
* 描述            : 获取水分数值
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void DataGet()
{
    P37=1;
    _nop_();
    Water_AD=ReadADCData(1);
_nop_();
P37=0;
}
/*******************************************************************************
* 函数名        : Analyze
* 描述            : 水分数据处理函数
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void Analyze()
{
    Water_VO=Water_AD*50/256;
    if(Water_VO>0)
    {
for(i=0;i<10;i++)
{
    Sum+=Water_VO;
}      
Average=Sum/10;
SendData(Average);
Sum=0;
}
}
/*******************************************************************************
* 函数名        : main
* 描述            : 主函数
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void main()
{                    
InitializeTimer0();
InitializeADC();
InitializeUsart();
    while (1)
{
  if(flag)
  {
      flag=0;
  DataGet();
  }
  if(WFlag)
  {
      WFlag=0;
Analyze();
  }             
}
}
/*******************************************************************************
* 函数名        : UsartInterrupt
* 描述            : 串口中断处理函数
* 输入参数  : 无     
* 返回参数  : 无
*******************************************************************************/
void UsartInterrupt(void) interrupt 4  using 2
{
RI = 0;                                    //令接收中断标志位为0(软件清零)
UART_data = SBUF;                              //将接收到的数据送入变量 UART_data
if(UART_data==0x11)
{  
   WFlag=1;ZFlag=0;VFlag=0;         
}
    else if(UART_data==0x22)
    {  
   ZFlag=1;WFlag=0;VFlag=0;
}
    else if(UART_data==0x33)
    {  
   VFlag=1;WFlag=0;ZFlag=0;
}
}

为何没人回复啊?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top