⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comint.c.bak

📁 压缩包中包括多个常用的汇编
💻 BAK
字号:
/****************************************************************************/
/*                                                                          */
/*                Copyright (c) 2005, 老树工作室                            */
/*                     All rights reserved.                                 */
/*                                                                          */
/*      http://www.saintone.net      Email:hxm0902@163.com                  */
/*      QQ:112431149                 Tel:010-62966630                       */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* 文件名:ext1int.c                                                        */
/* 版  本:Version 1.0                                                      */
/* 描  述:串行口中断演示代码                                               */
/*                                                                          */
/* 作  者:spot                                                             */
/* 函  数:                                                                 */
/*         ext1_int_proc                                                    */
/*         system_init                                                      */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-07-10     Creat Inital version. (Version 1.0)        */
/****************************************************************************/

#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>

#define MAX_RINTL        8           /* 串口接收缓冲区长度   */
typedef unsigned char u_char;
typedef unsigned int  u_int;
u_char  data  pint_buf[MAX_RINTL];   /* 串口接收缓冲区       */
u_char  data  pint_read;             /* 串口缓冲区读指针     */
u_char  data  pint_write;            /* 串口缓冲区写指针     */
u_char  data  psend_int;             /* 串口发送允许标志     */

char str_test[25]  = "MCS51 COM INTERRUPT:";
char str_hello[10] = "HELLO";
char str_world[10] = "WORLD";

/* 串口中断服务程序,使用第3组寄存器 */
void com_int_proc(void) interrupt 4 using 3
{
    u_char temp;
    u_char temp1;

    if (TI == 1)                /* 是发送中断       */
    {
        TI = 0;
        psend_int = 1;          /* 可以发送         */
    }

    if (RI == 1)                /* 是接收中断       */
    {
        RI = 0;                 /* 清串口接收中断   */
        temp1 = SBUF;
        temp  = pint_write + 1; /* 判断是否可以写入 */
        if (temp == MAX_RINTL)
        {
            temp=0;
        }

        if (temp != pint_read)
        {
            pint_buf[pint_write] = temp1; /* 读取数据 */
            pint_write = temp;
        }
    }
}

/* 串口发送一个字节 */
void com_send_command(char onebyte)
{
    psend_int = 0;
    SBUF = onebyte;
    while (psend_int != 1);
}

/* 串口接收数据处理 */
void com_command_receive(void)
{
    u_char var1,var2;
    u_char i;

    var2 = pint_read;
    if (var2 != pint_write)
    {
        var1=pint_buf[var2];
        var2=var2+1;

        if (var2 >= MAX_RINTL)
            var2=0;

        pint_read=var2;

        if (var1 == 0x0A)    /* 收到0x0A */
        {
            for (i=0; i<strlen(str_hello); i++)
            {
                com_send_command(str_hello[i]); /* 发送字符串HELLO */
            }
            com_send_command(0x0D);
            return;
        }
        if (var1 ==0x0D)     /* 收到0x0D */
        {
            for (i=0; i<strlen(str_world); i++)
            {
                com_send_command(str_world[i]); /* 发送字符串WORLD */
            }
            com_send_command(0x0D);
            return;
        }
    }
}
void system_init()
{
    u_char loop;

    EA = 0;         /* CPU关中断      */
    pint_read  = 0; /* 串口缓冲读指针 */
    pint_write = 0; /* 串口缓冲写指针 */

    SCON = 0x48;
    PCON = 0x80;
    TMOD = 0x20;
    TCON = 0x50;
    TH1  = 0xFD;    /* 波特率为19200  */
    TL1  = 0xFD;
    TR1  = 1;       /* 定时器1启动计数*/
    ES   = 1;       /* 串口开中断     */
    PS   = 0;       /* 串口低优先级   */
    REN  = 1;       /* 串口接收允许   */
    EA   = 1;       /* 开CPU中断      */

    loop = SBUF;    /* 清串口缓冲区   */
    for (loop=0; loop<MAX_RINTL; loop++)
    {
        pint_buf[loop] = 0;
    }
}

main()
{
    u_char i = 0;

    system_init();

    for (i=0; i<strlen(str_test); i++)
    {
        com_send_command(str_test[i]); /* 发送字符串 */
    }
    com_send_command(0x0D);
    
    while(1)
    {
        com_command_receive();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -