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

📄 sci.c

📁 工 程 名:DG128串行查询(SCIpooling) 硬件连接:MCU的串行口与PC机的串行口相连 。 程序描述:利用查询方式把收到的数据发送回去。波特率为9600,使用SCI0口
💻 C
字号:
//[SCI.c]串行通信----------------------------------------------------------*
//本文件包含:                                                              *
//    (1)SCIInit:串行口初始化                                              *
//    (2)SCISend1:串行发送1个字节                                          *
//    (3)SCISendN:串行发送n字节                                            *
//    (4)SCIRe1:串行接收1字节                                              *
//    (5)SCIReN:串行接收n字节                                              *
//硬件连接:                                                                *
//    MCU的SCI0模块接口与PC方的串行口相连                                  *
//-------------------------------------------------------------------------*

//头文件
#include "SCI.h"    //串行通信头文件

//SCIInit:DG128串行口0初始化函数-------------------------------------------*
//功  能:                                                                  *
//    开SCI0关SCI1,关串口中断,对串行口进行初始化,默认为允许SCI,正常码输出  *
//    ,8位数据,无校验等,允许发送器允许接收器.查询方式收发,波特率为9600     *
//    (设fBUS=19.6608Mhz)                                                 *
//参  数:无                                                                *
//返  回:无                                                                *
//说  明:                                                                  *
//    (1)若初始化SCI1,只需SCI0->SCI1                                       *
//    (2)该初始化函数与芯片有关                                            *
//-------------------------------------------------------------------------*
void SCIInit(void)
{
    INT8U t;
    //定义波特率Bt=9600,SCI0BD=fBUS/(16*Bt)
    SCI0BDL = 0x80;    //须先给低8位赋值
    SCI0BDH = 0x00;    //再给高8位赋值
    SCI0CR1 = 0x00;    //设置允许SCI,正常码输出,8位数据,无校验
    t = SCI0DRL;       //读数据寄存器(清0)
    t = SCI0SR1;       //读状态寄存器(清0)
    SCI0CR2 = 0x0C;    //允许SCI0接收和发送 查询方式
}

//SCISend1:串行发送1个字节-------------------------------------------------*
//功  能:串行发送1个字节                                                   *
//参  数:o=要发送的数据                                                    *
//返  回:无                                                                *
//-------------------------------------------------------------------------*
void SCISend1(INT8U o)
{
    //判断ReStatusR的第SendTestBit位是否为1,是1可以发送
    while (1)
        if ((ReSendStatusR & (1<<SendTestBit)) != 0)
        { 
            ReSendDataR = o;
            break;
        }
}

//SCISendN:串行发送N个字节-------------------------------------------------*
//功  能:发送数组中的N个字节数据                                           *
//参  数:n=待发送的数据字节数,ch=存放待发送数据的数组首地址                *
//返  回:无                                                                *
//内部调用函数:SCISend1                                                    *
//-------------------------------------------------------------------------*
void SCISendN(INT8U n,INT8U ch[])
{
    INT8U i;
    for (i=0; i<n; i++)
        SCISend1(ch[i]);
}

//SCIRe1:串行收一个字节数据------------------------------------------------*
//功  能:从串行口接收1个字节的数据                                         *
//参  数:p=标志指针                                                        *
//返  回:接收到的数据(若接收失败,返回0xff)                                *
//说  明:参数*p带回接收标志=0收到数据,=1未收到数据                         *
//-------------------------------------------------------------------------*
INT8U SCIRe1(INT8U *p)
{
    INT16U k;
    INT8U i;
    //ReStatusR第ReTestBit位为1表示可接收数据
    for (k=0; k<0xfbbb; k++)
        if ((ReSendStatusR & (1<<ReTestBit)) != 0)
	    {
	        i = ReSendDataR;
	        *p = 0x00; 
	        break;
	    }
	//接收失败    
    if (k >= 0xfbbb)
    {
        i=0xff;
	    *p=0x01;
    }
    return i;    //返回接收到的数据
}

//SCIReN:HC08串行接收N个字节-----------------------------------------------*
//功  能:接收N个字节数据,并存放在ch数组中                                  *
//参  数:n=待接收的数据字节数,ch=存放待接收数据的数组首地址                *
//返  回:接收标志=0收到数据,=1未收到数据                                   *
//内部调用函数:SCIRe1                                                      *
//-------------------------------------------------------------------------*
INT8U SCIReN(INT8U n,INT8U ch[])
{
    INT8U m;
    INT8U fp;
    m = 0;
    //接收n个数据
    while (m<n)
    {
	    ch[m] = SCIRe1(&fp);
	    if (fp == 1) return 1;    //只要有1个字节数据没接收到就返回报错
	    m++;
    }
    return 0;
}

⌨️ 快捷键说明

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