STC8H DMA 串口1全双工中断方式收发通讯C语言


/*************  功能说明    **************

本例程基于STC8H8K64U为主控芯片的实验箱9进行编写测试,STC8H系列带DMA模块的芯片可通用参考.

串口1全双工中断方式收发通讯程序。

通过PC向MCU发送数据, MCU将收到的数据自动存入DMA空间.

当DMA空间存满设置大小的内容后,通过串口1的DMA自动发送功能把存储空间的数据原样返回.

用定时器做波特率发生器,建议使用1T模式(除非低波特率用12T),并选择可被波特率整除的时钟频率,以提高精度。

下载时, 选择时钟 22.1184MHz (用户可自行修改频率).

******************************************/

#include "STC8H.h"
#include "stdio.h"
#include "intrins.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc       22118400L   //定义主时钟(精确计算115200波特率)
#define Baudrate1       115200L

bit        DmaTxFlag;
bit        DmaRxFlag;

u16 Cnt;    //接发数

u8 xdata DmaBuffer[10];

void UART1_config(u8 brt);   // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void DMA_Config(void);
void UART1_DMA_Transmit(u16 Size);
void UART1_DMA_Receive(u16 Size);
void Delayms(void);        //@22.1184MHz
        
void UartPutc(unsigned char dat)
{
        SBUF = dat;
        while(TI == 0);
        TI = 0;
}

char putchar(char c)
{
        UartPutc(c);
        return c;
}

//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void main(void)
{
        u16 i;
        
        Cnt=9;
        
    P_SW2 |= 0x80;  //扩展寄存器(XFR)访问使能

    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x01;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;

        for(i=0; i<255; i++)
        {
                DmaBuffer = 0x30;
        }

        UART1_config(1);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
        printf("STC8H UART1 DMA Test Programme!\r\n");  //UART1发送一个字符串
        DMA_Config();
        
        EA = 1; //允许总中断

        DmaTxFlag = 0;
        DmaRxFlag = 0;

        while (1)
        {
                if(P32==0)
                {
                        for(i=50;i>0;i--){Delayms();}
                        if(P32==0)
                        {
                                while(~P32)
          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值