SH79F168串口中断是否一定得写

[复制链接]
2343|10
手机看帖
扫描二维码
随时随地手机跟帖
tjx727|  楼主 | 2009-12-3 14:11 | 显示全部楼层 |阅读模式
#include<SH79F168.H>
#include"LTC6802.H"
//内部晶振 16.6MHz
const  uint8 ascii_num[]="0123456789";
volatile uint16 i;
void init_port(void);
void init_timer0(void);
void init_uart(void);
void send_char_com( uint8 ch);
void send_string_com( uint8 *str);
void UART_disp( uint16 voltage);
void init_pwm(void);
void  main()
{
       Fsys_Fosc_1();//16.6MHz

       init_port();
       init_timer0();
       init_uart();
       init_pwm();


       //LED1_ON();
       //LED2_ON();
      send_string_com("welcome!the singlechip is turn on!");
      send_char_com(10);
      while(1);
}

/**********************************************/
void init_port()
{
       P0CR = 0xFF;
       P0PCR= 0x00;
       P0 = 0x00;

       P1CR = 0xFF;
       P1PCR=0x00;
       P1 = 0x00;

       P2CR = 0xFF;
       P2PCR=0x00;
       P2 = 0x00;

       P3CR = 0xFF;
       P3PCR=0x00;
       P3 = 0x00;  
}
/*************************************************/
/*********************串口部分********************/
void init_uart()
{
       P3CR &= 0xF9 ; //这个需要将端口设置为输入,不然有可能会产生乱码
       TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
       TH1 = 0x94 ;   //Baud:9600 fosc=16.6MHz
       TL1 = 0x94 ;
       SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr
        PCON = 0x80 ; //SMOD=1;
      IEN0 |= 0x90 ;   //Enable Serial Interrupt,EA=1,ES=1;
      TR1 = 1 ;     // timer 1 run
      TI = 0;  
}
//向串口发送一个字符
void send_char_com( uint8 ch)
{
      SBUF = ch;
      while (!TI);
      TI = 0 ;
}
   
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( uint8 *str)
{
       uint8 k= 0 ;
       do { send_char_com(*(str + k)); k++; }
       while (*(str + k)!='\0');
}

//接受串口发送过来的数据,并再次发给串口
void RX_ISR()  interrupt 4
{
       uint8 Channel;
       if(RI&&ES)
      {
            Channel = SBUF ;
            send_string_com("Channel: ");
            send_char_com(Channel);
            RI=0;
      }
}  
/**************************************************/
void init_timer0()
{

      TMOD=0x00;//选择定时器0 工作方式0
      TF0=0;
      TL0=0x00;
      TH0=0x00;
      EA=1;
      ET0=1;
      TR0=1;
}
void timer0_ISR()  interrupt 1
{
      i++;
     LED1_ON();
     if(i<1013)
     {
         LED2_ON();
      }
     else if(i>=1013&&i<2026)
    {
        LED2_OFF();
    }
    else if(i>=2026)
    {
        i=0;  
    }
   TF0=0;
}
望熟悉中颖的达人帮我分析,上面程序中LED1_ON(),LED2_ON()是点亮两个LED灯的程序,send_string_com("welcome!the singlechip is turn on!")为发送一个字符串到串口的函数。void RX_ISR()  interrupt 4 串行中断函数主要完成接受PC串口发过来的数据,并再次由单片机发送给PC。
程序中不加串口的函数,运行的结果时LED1一直亮着,LED2能够0.5S钟亮灭一次。加上串口的函数却结果变得不正常了。
我要是在while大循环前面写上send_string_com("welcome!the singlechip is turn on!")或者send_char_com(10)其中的一个函数,并且程序中将串行的中断函数void RX_ISR()  interrupt 4屏蔽,那么定时器0工作不正常,两个LED灯闪一下就灭了,不再亮起来。但是串口发送字符的功能能够实现。出现上面的情况的时候有两种方法可以使定时器0变得工作正常。
方法一,将屏蔽的中断函数恢复,定时器0就工作正常了,LED灯正常工作,串口也工作正常。
方法二,将void send_char_com( uint8 ch)
{
SBUF = ch;
while (!TI);
TI = 0 ;
} 中的SBUF=ch;屏蔽,定时器0也工作正常了,LED灯正常工作。当然这个时候串口工作就不正常了。
我的问题是,在中颖的串行中断是否一定不管实际中需不需要,必须得写,不然会有不确定的问题出现。
tjx727|  楼主 | 2009-12-3 16:35 | 显示全部楼层
在这个程序中,我将定时器0的中断函数屏蔽掉,也不会正常得到所要的串口数据,但是不屏蔽掉这个定
时器0中断的函数就能够得到正确的结果。是不是中颖单片机的只要初始化后,有可能产生中断的,就一
定要将中断函数写出来,不然就会出现不可预料的错误。
强烈希望各位前辈解答小鸟的疑惑,谢谢!

#include<SH79F168.H>
#include"LTC6802.H"

volatile uint16 i;

void init_port(void);
void init_timer0(void);
void init_uart(void);
void send_char_com( uint8 ch);
void send_string_com( uint8 *str, uint16 strlen);

void  main()
{
        Fsys_Fosc_1();//16.6MHz
       
        init_port();
        init_timer0();
        init_uart();
       
        LED1_ON();
       
        send_char_com('B');
        send_string_com("1234567890",10);
        while(1)
        {

               
        }
}

void init_port()
{
        P0CR = 0xFF;
        P0 = 0x00;
        P1CR = 0xFF;
        P1 = 0x00;
        P2CR = 0xFF;
        P2 = 0x00;
        P3CR = 0xFF;
        P3 = 0x00;               
}
/*************************************************/
/*********************串口部分********************/
void init_uart()
{
        P3CR &= 0xF9 ;        //这个需要将端口设置为输入,不然有可能会产生乱码
        TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
        TH1 = 0x94 ;   //Baud:9600 fosc=16.6MHz
        TL1 = 0x94 ;
        SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr
        PCON = 0x80 ; //SMOD=1;
        IEN0 |= 0x90 ;   //Enable Serial Interrupt,EA=1,ES=1;
        TR1 = 1 ;     // timer 1 run
        //TI = 1;        
}

//向串口发送一个字符
void send_char_com( uint8 ch)
{
        SBUF = ch;
        while (!TI);
        TI = 0 ;
}

          
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
        unsigned int k= 0 ;
        do { send_char_com(*(str + k)); k++; }
        while (k < strlen);
}

//接受串口发送过来的数据,并再次发给串口
void RX_ISR()  interrupt 4
{
        if(RI&&ES)
        {
                send_char_com(SBUF);                
                RI=0;
        }
}

/**************************************************/

void init_timer0()
{
       
        TMOD=0x00;//选择定时器0 工作方式0
        TF0=0;
        TL0=0x00;
        TH0=0x00;
        EA=1;
        ET0=1;
        TR0=1;
}

/*void timer0_ISR()  interrupt 1
{
        i++;
        if(i<1013)
        {
                LED2_ON();       
        }
        else if(i>=1013&&i<2026)
        {
                LED2_OFF();       
        }
        else if(i>=2026)
        {
                i=0;       
        }
        TF0=0;       
}                 */

使用特权

评论回复
tjx727|  楼主 | 2009-12-3 16:36 | 显示全部楼层
我现在去看看其他单片机会不会有这种现象出现

使用特权

评论回复
tjx727|  楼主 | 2009-12-6 13:29 | 显示全部楼层
都这么几天了,怎么没有人回答我的问题啊,请问下你们遇到过同样的情况吗?

使用特权

评论回复
warm_ice| | 2009-12-7 10:59 | 显示全部楼层
串口中断不用的话当然可以不写,不会有任何问题.
另外,您的代码较长,请仔细检查一下是否有问题,谢谢!

使用特权

评论回复
tjx727|  楼主 | 2009-12-7 16:54 | 显示全部楼层
我认为我的代码应该没有问题,检查了很久,并且实现的功能是两个简单的相对独立的功能,却出现了屏蔽一个功能的中断就会对另一个功能产生影响.麻烦哪位高手有时间指点指点下,谢谢!

使用特权

评论回复
warm_ice| | 2009-12-8 11:31 | 显示全部楼层
我认为我的代码应该没有问题,检查了很久,并且实现的功能是两个简单的相对独立的功能,却出现了屏蔽一个功能的中断就会对另一个功能产生影响.麻烦哪位高手有时间指点指点下,谢谢! ...
tjx727 发表于 2009-12-7 16:54

您的程序太长了点,看完真累.呵呵.

检查了一下,觉得应该是你打开了中断,但未写中断服务程序,这样的话,当中断产生后,会跳到相应的中断入口地址,但您的程序中未处理该中断,即该中断入口地址相当于NOP指令,这样,顺序执行就会进入下一个中断服务程序中,造成程序错误.

使用特权

评论回复
tjx727|  楼主 | 2009-12-8 23:49 | 显示全部楼层
也就是要是会产生中断的话就一定要将对应的中断服务程序写上去是吗?好像我用的其他的单片机不会有这样的问题一样,是这样吗,还是这个单片机比较特殊,硬件是这么设置的?呵呵,谢谢,太麻烦您了!新手,见识不多,请别见怪。

使用特权

评论回复
tjx727|  楼主 | 2009-12-17 20:29 | 显示全部楼层
快沉了,自己顶下

使用特权

评论回复
warm_ice| | 2009-12-18 09:30 | 显示全部楼层
快沉了,自己顶下
tjx727 发表于 2009-12-17 20:29

问题没解决么?怎么又顶起来了?

使用特权

评论回复
tjx727|  楼主 | 2009-12-18 20:05 | 显示全部楼层
那算解决了吧

使用特权

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

本版积分规则

个人签名:我们在追忆中展望­ 在展望中  调整着向前的步伐 个人新浪微博:http://t.sina.com.cn/tjx727­

30

主题

322

帖子

0

粉丝