串口通信++++多线程简单实例

来源:互联网 发布:java面试宝典2017 编辑:程序博客网 时间:2024/05/01 07:35

/*RS-232串口*/

#include "reg52.h"

typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit s2 = P2^1;
sbit en = P2^5;

uint8 arg;
uint8 counter =0;

void init(void)
                 
{
               
    TMOD=0x20;    //定时器1的工作方式2
    TL1=0xfd;   //装载计数初值
    TH1=0xfd;   
    SCON=0x50;    //采用串口工作方式1,无奇偶校验
    PCON=0x00;     //串口波特率不加倍
   
    TMOD |= 0x01;//初始化定时器0
    TL0 = 0X3C;
    TH0 = 0X0B0;
   
    EA = 1;     //开总中断,开串口中断
    ES = 1;
    ET0 = 1;
    TR1=1;      //启动定时器1
    TR0 = 1;
}


/************************单片机接收PC机发来的指令让数码管循环显示0-F******************/
receive_byte(uint8 *dat)
{
    *dat = SBUF;
    while (!RI);
    RI = 0;
    //SBUF = *dat;
    //while(!TI);
    //TI = 0;

}

serial_server(void) interrupt 4
{
    EA = 0;
    receive_byte(&arg);
    P0 = arg;
    EA = 1;
}


/************************单片机接每隔2s向PC机发送一串字符******************/

code unsigned char send_txt[]={"Serial Interface Test OK!/n"};

void test_serial(void)
{
    int i;
    EA=0;//关一下

    for(i=0;i<sizeof(send_txt);i++)
    {
        SBUF=send_txt[i];
        while(TI==0);
        TI=0;
    }
    EA=1;//再打开
}

//中断源编号为4,即串口中断

void timer0_server(void) interrupt 1
{
       

    EA=0;//清除中断标志,硬件置位,软件清零
    RI=0;
       
    counter++;

    if(20 == counter)
    {   
        test_serial();
        counter = 0;
    }
    TL0 = 0X3C;
    TH0 = 0X0B0;
 
    EA=1;//开中断,等待下一次中断的到来
             
}

main()
{
    en = 1;
    s2 = 0;
    init();
    while(1);       
}

原创粉丝点击