当前位置: 代码迷 >> 单片机 >> 单片机中怎么让计数中断和串口中断同时使用
  详细解决方案

单片机中怎么让计数中断和串口中断同时使用

热度:95   发布时间:2016-04-28 14:59:00.0
单片机中如何让计数中断和串口中断同时使用
本帖最后由 woshi_ziyu 于 2014-04-21 08:51:15 编辑
计数器部份:
定时器初始化
	TMOD=V_TMOD; 
TH0=V_TH0; 
TL0=V_TL0; 
TR0=1; 
ET0=1; 
EA=1;   


void timer0(void) interrupt 1 using 2 {}

串口:
	TMOD |= 0x20;			// 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
//IE = 0x0; // 禁止任何中断  
IE |= 0x90 ; //Enable Serial Interrupt


//串口接收中断函数
void serial () interrupt 4 using 3

这样写为啥不能同时工作, 查据说不行,那如何写
用的是STC89C52
------解决方案--------------------
串口初始化

void init_serialcomm(void) {     
SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr     
TMOD 
------解决方案--------------------
= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload      
PCON 
------解决方案--------------------
= 0x80;       //SMOD=1;       
TH1   = 0xF4;       //Baud:4800  fosc="11".0592MHz      
IE   
------解决方案--------------------
= 0x90;       //Enable Serial Interrupt      
TR1   = 1;          // timer 1 run     // TI="1";  }


计数器中断

       TMOD=0x1;       //T0,工作方式1

       TH0=0xb1; //20ms定时

       TL0=0xe0;

       TR0=1;        //开启T0定时器

       ET0=1;         //允许T0定时器中断

       EA=1;           //开启总中断允许

       P2=Tab[0];P0_0=0;P0_1=0;//显示00


------解决方案--------------------
"中断嵌套" 分部分嵌套, 和全嵌套

"部分嵌套" 就是中断如 (定时)中 打开 本中断以外 的 其他中断(串口j).

全嵌套 就是中断中 可以打开本中断. 这是硬件速度不够的现象,

所以全嵌套 是很少用的.
------解决方案--------------------

/********************************************************************
* 名称 : UART0_INIT()
* 功能 : 初始化串口程序,晶振11.0592, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void UART0_INIT()
{
     TMOD 
------解决方案--------------------
= 0x20;  
     SCON = 0x50;
     PCON = 0x00;
     TH1  = 0xFd;
     TL1  = TH1;
     TR1  = 1;
     ES   = 1;        //开串口中断
     EA   = 1;        //开总中断              
}
/********************************************************************
* 名称 : TIMER0_INIT()
* 功能 : 初始化T0函数.
* 输入 : 无
* 输出 : 无
***********************************************************************/
void TIMER0_INIT()
{
    TMOD 
------解决方案--------------------
= 0x05;
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void main()
{
    TMOD =0x00;
     UART0_INIT();
     TIMER0_INIT();
     //add your code here!
}

本人使用一直都没有问题啊!
  相关解决方案