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

📄 serial.c

📁 基于WINBOND单片机W78E516B的最小系统源代码.通过UART具有BOOTLOAD功能.开发环境为KEIL C51.
💻 C
字号:
#include "config.h"
#include <stdio.h>
#include "io.h"
#include "global.h"
#include "event.h"
#include "78e516.h"


U8 lrc;

/*
函数    设定波特率
        波特率 = 震荡频率(18.432M)/(32*(65536-[RCAP2H,RCAP2L]))
*/
void SetBaudRate(U8 baudrate)
{
    U16 code baudtbl[] = {-60,-30,-15,-10,-5};

    THL2 = RCAP2 = baudtbl[baudrate];
}

/*
函数    往串口发送一个字符
输入    value   要发送的字符
*/
void put_buf(U8 value)
{
    // 等待缓冲区有空间
    while (((TxWrite + 1) & 0x0f) == TxRead)
    {
    }
    TxBuffer[TxWrite] = value;
    TxWrite = (TxWrite + 1) & 0x0f;
    lrc = lrc ^ value;
    if (TxEmpty == 1)
    {
        TxEmpty = 0;
        TI = 1;
    }
//    TxEmpty = 0;
//    SBUF = value;
//    lrc = lrc ^ value;
//    while(TxEmpty == 0);
}

/*
函数    串口通讯的处理程序
*/
U8 CheckSerial(void)
{
    U8 i,checkl;

    if (RxBusy == 0) return(0xff);
    // 接收到通讯数据包
    if (RxCount == 0)
    {
        RxBusy = 0;
        return(0xff);
    }
    if (RxCount == 1)
    {
        RxBusy = 0;
        RxCount = 0;
        return(RxBuffer[0]);
    }
    if (RxBuffer[0] == 3)
    {
        checkl = 0;
        for (i=0; i<RxCount; i++)
        {
            checkl = checkl ^ RxBuffer[i];
        }
        if (checkl == 0)
        {
            // 接收到正确的数据包
            switch(RxBuffer[1])
            {
                case '0':       // 设定波特率
                    put_buf(2);
                    put_buf(0);
                    SetBaudRate(RxBuffer[2]);
                    break;
                case '4':       // 通讯测试
                    checkl = 0x01;
                    for (i=0; i<8; i++)
                    {
                        if (RxBuffer[6+i] != checkl) break;
                        checkl *= 2;
                    }
                    if (checkl == 0)
                    {
                        RxBuffer[0] = 3;
                        RxBuffer[1] = '4';
                        checkl = 0x80;
                        for (i=0; i<8; i++)
                        {
                            RxBuffer[6+i] = checkl;
                            checkl /= 2;
                        }
                        lrc = 0;
                        for (i=0; i<14; i++)
                        {
                            put_buf(RxBuffer[i]);
                        }
                        put_buf(lrc);
                    }
                    break;
                case 0x3f:
                    put_buf(2);
                    put_buf(0);
                    while(TxEmpty == 0);
                    EnterISP();
                    break;
            }
        }
    }
    RxCount = 0;
    RxBusy = 0;
    return(0xff);
}

⌨️ 快捷键说明

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