打印
[STC单片机]

官方提供的程序,中断不能进入

[复制链接]
3230|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
爱上柠檬|  楼主 | 2013-12-14 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
/* 如果要在**中应用此代码,请在**中注明使用了宏晶科技的资料及程序   */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz

#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 6000000L          //系统频率
#define BAUD 9600             //串口波特率

#define NONE_PARITY     0       //无校验
#define ODD_PARITY      1       //奇校验
#define EVEN_PARITY     2       //偶校验
#define MARK_PARITY     3       //标记校验
#define SPACE_PARITY    4       //空白校验

#define PARITYBIT EVEN_PARITY   //定义校验位

sfr AUXR  = 0x8e;               //辅助寄存器

sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7

sbit P22 = P2^2;

bit busy;

void SendData(BYTE dat);
void SendString(char *s);

void main()
{
    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
   
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//  P_SW1 = ACC;  
//  
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
//  ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
//  P_SW1 = ACC;  

#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;                //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;                //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;                //9位可变波特率,校验位初始为0
#endif

    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/BAUD))>>8;
    TR1 = 1;                    //定时器1开始启动
    ES = 1;                     //使能串口中断
    EA = 1;

    SendString("TC15F2K60S2\r\nUart Test !\r\n");
    while(1);
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;                 //清除RI位
        P0 = SBUF;              //P0显示串口数据
        P22 = RB8;              //P2.2显示校验位
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
    if (P)                      //根据P来设置校验位
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 0;                //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 1;                //设置校验位为1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 1;                //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 0;                //设置校验位为0
#endif
    }
    busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}
本人从管方下载了这个程序,发现不能进入中断,上电只能发一个字节,不知道什么原因,那位大侠赐教一下

相关帖子

沙发
autopccopy| | 2013-12-14 20:52 | 只看该作者
你要提供是使用了什么芯片,STC15F系列部分A版本的芯片有BUG,不能中断。这个可以见官方的说明和数据手册。

如果是STC15F2K60S2 则不应该有这个问题。
(1)

使用特权

评论回复
板凳
爱上柠檬|  楼主 | 2013-12-14 21:10 | 只看该作者
STC 15F408AD,该看的资料都看了,找不到原因,工作过程,就是程序通过烧录口烧入以后,上电单片机,就可以通过这个烧录接口,发送数据,或者接收pc机得数据

使用特权

评论回复
地板
爱上柠檬|  楼主 | 2013-12-14 21:12 | 只看该作者
如果通过查询,方式,发送接收,都没有问题

使用特权

评论回复
5
NE5532| | 2013-12-14 22:21 | 只看该作者
我怎么没看到你开总中断呢?

使用特权

评论回复
6
jack.king| | 2013-12-20 12:50 | 只看该作者
我也遇到同样的问题
   并且我这个程序已经能够在12系列上面用过很很久的
程序如下:

void PCA_isr(void) interrupt 7 using 3  //ÓÃÆË×½×ö¶¨Ê±
{
   CCF0 = 0;
   if(time_step >= 9)//0.1
   {
                 P0_4 = ~P0_4;
     time_step = 0x00;//LED_FLAG = ~LED_FLAG;
        //         Sample_Flag = 1;
                // if(LOCK_TIME > 0)LOCK_TIME--;
        //         if(FLASH_LED >= 4){LED_FLAG = ~LED_FLAG;FLASH_LED = 0X00;}else{FLASH_LED++;}
    // if(Count_down_time > 0)Count_down_time--;
                 if(Beep_Time > 0){Beep_Time--;}
   }
   else{time_step++;}
/////////////////////////////////////10MS
//////////////////////////////////////
  CH = 0x00; CL = 0x00; //±ØÐëÒª¼Ó£¡
  CCAP0L = 0x10;CCAP0H = 0x27;//10ms//12
        //  CCAP0L = 0x00;CCAP0H = 0x24;//10ms//11.0592
}
void Init_Time(void)
{
         CLK_DIV |= 0x22;//4·ÖƵ
ACC = P_SW1;
ACC &= ~(0X10|0X20);
P_SW1 = ACC;
        P1M1 = 0xff;P1M0 = 0x00;
  TMOD = 0x15;//counter
  TL0 = 0x00;TH0 = 0x00;
  TL1 = TIME10MS%0x100;
  TH1 = TIME10MS/0x100;        //10ms
  TR0 = 1;
  ET0 = 1;
  TR1 = 1;
  ET1 = 1;
  EA = 1;
  CCON = 0;//Initial PCA control resigister
  CL   = 0; CH = 0;////rest pca
  CMOD = 0x00;
  CCAP0L = 0x10;CCAP0H = 0x27;//10ms//12
//          CCAP0L = 0x00;CCAP0H = 0x24;//10ms//11.0592
  CCAPM0 = 0x49; CR = 1;//PCA time start run
  //P4SW |= 0x70;//p4.4_4.5_4.6 Io
  //P1M1  = 0x01;P1M0 =  0x00;//p1:0in type
  //P2M1 = 0x7f;P2M0 = 0x00;//P2ÊäÈëÐźÅ
        P1M1 = 0xff;P1M0 = 0x00;//0£¬1£¬2£¬ÎªÊäÈë¿Ú
  P1ASF = 0x3f;//adc0,adc1,adc2,adc3,adc4,adc5,analog
// AUXR1 = AUXR1 | 0x04;        IP |= 0x80;IPH |= 0x80;//12ϵÁÐÉèÖÃÈç´Ë

}

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝