C8051F330串口UART0示例程序

发布者:csZhou最新更新时间:2016-01-13 来源: eefocus关键字:C8051F330  串口  UART0 手机看文章 扫描二维码
随时随地手机看文章

//****************************************************************************
// 功能:C8051F330串口UART0示例程序
//****************************************************************************
//使用F330,串口为P0.4(TX0),P0.5(RX0);
//-----------------------------------------------------------------------------
// UART0.c
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 所包含的头文件
//------------------------------------------------------------------------
#include
//#include

//-----------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------
// 系统工作频率
#define SYSCLK 24500000
// 串口工作波特率
#define BAUDRATE 9600

//-----------------------------------------------------------------------------
// 功能函数
//-----------------------------------------------------------------------------
void SYSCLK_Init(void);
void PORT_Init(void);
void UART0_Init(void);
void Uart0_Transmit(unsigned char tmp);
void sendstr(unsigned char*tmp);
unsigned char temp ;
void delay_1ms()
{
    unsigned int j ;
    for(j=3060;j>0;j--);
}
void delay_ms(unsigned int i)
{
    for(;i>0;i--)delay_1ms();
}
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------

void main(void)
{
    PCA0MD&=~0x40 ;
    // 禁止看门狗
    PORT_Init();
    // 初始化端口I/O
    SYSCLK_Init();
    // 初始化系统时钟
    UART0_Init();
    // 串口初始化
    EA=1 ;
    ES0=1 ;
    while(1)
    {
        delay_ms(1000);
        sendstr("Welcome to July's Hut! ");
        //Uart0_Transmit(0x00);
    }
}

//-----------------------------------------------------------------------------
// 端口初始化
//-----------------------------------------------------------------------------
//
// 配置交叉开关和通用IO
//
// P0.4 - UART TX0
// P0.5 - UART RX0

void PORT_Init(void)
{
    P0MDOUT|=0x10 ;
    // 使能 UTX 为推挽输出
    XBR0=0x01 ;
    // 使能 UART0 占用 P0.4(TXD) 和 P0.5(RXD)
    XBR1=0x40 ;
    //使能交叉开关
}

//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init(void)
{
    OSCICN|=0x03 ;
    // 配置内部振荡器的的最大频率
    RSTSRC=0x04 ;
    // 使能始终丢失检测寄存器
}

//-----------------------------------------------------------------------------
// 串口UART0初始化
//-----------------------------------------------------------------------------
void UART0_Init(void)
{
    SCON0=0x10 ;
    if(SYSCLK/BAUDRATE/2/256<1)
    {
        TH1=-(SYSCLK/BAUDRATE/2);
        CKCON&=~0x0B ;
        CKCON|=0x08 ;
    }
    else if(SYSCLK/BAUDRATE/2/256<4)
    {
        TH1=-(SYSCLK/BAUDRATE/2/4);
        CKCON&=~0x0B ;
        CKCON|=0x09 ;
    }
    else if(SYSCLK/BAUDRATE/2/256<12)
    {
        TH1=-(SYSCLK/BAUDRATE/2/12);
        CKCON&=~0x0B ;
    }
    else
    {
        TH1=-(SYSCLK/BAUDRATE/2/48);
        CKCON&=~0x0B ;
        CKCON|=0x02 ;
    }
   
    TL1=TH1 ;
    TMOD&=~0xf0 ;
    TMOD|=0x20 ;
    TR1=1 ;
    // TI0 = 1;
}
//-----------------------------------------------------------
// 串口UART0中断
//-----------------------------------------------------------
//中断向量0x0023
void UATR0_ISR(void)interrupt 4
{
    //Rx、Tx共用中断
    //接收中断
    if(!TI0)
    {
        RI0=0 ;
        temp=SBUF0 ;
        Uart0_Transmit(temp);
    }
    //发送中断
    else TI0=0 ;
}
//-----------------------------------------------------------
// 串口UART0发送
//-----------------------------------------------------------
void Uart0_Transmit(unsigned char tmp)
{
    ES0=0 ;
    //关UART0中断
    EA=0 ;
    //关全局中断
    SBUF0=tmp ;
    while(TI0==0);
    //TI0=0 ;
    ES0=1 ;
    //开UART0中断
    EA=1 ;
    //开全局中断
   
}
//-----------------------------------------------------------
// 发送字符串
//-----------------------------------------------------------
void sendstr(unsigned char*tmp)
{
    while(*tmp)
    {
        Uart0_Transmit(*tmp++);
    }
}

关键字:C8051F330  串口  UART0 引用地址:C8051F330串口UART0示例程序

上一篇:基于单片机的函数发生器的设计与实现
下一篇:C8051F(330)精确延时程序(24.5M)

推荐阅读最新更新时间:2024-03-16 14:43

STM32单片机串口DMA解析
讨论三个问题:1、什么叫串口DMA 请求;2、串口简要复习;3、串口DMA发送流程。 1、什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容: DMA全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理来自于一个或者多个外设对存储器的访问请求。还有一个仲裁器来协调各个DMA请求的优先权。 作用:为CPU减负
[单片机]
STM32单片机<font color='red'>串口</font>DMA解析
51单片机串口通讯详解
串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。 由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。 1.串口配置 51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。 (1)状态控制寄存器 SCON SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCO
[单片机]
51单片机<font color='red'>串口</font>通讯详解
MSP430笔记3——串口发送数据
通用串行通信接口 UART模式 串口调试助手: 串口号;波特率 ;校验位(无校验); 数据位(8);停止位(1)(后三位默认即可) USCI——Ax模块:UART、SPI模式 USCI——Bx模块 UART模式: 在异步模式中,USCI_Ax模块通过两个外部引脚,UCAxRXD(发送数据线)和UCAxTXD(接受数据线)(记得共地),把MSP430和一个外部系统连接起来。 当UCSYNC位被清零时就选择了UART模式 设置波特率 UCAxCTL0,USCI_Ax寄存器 UACxBR0,USCI_Ax波特率控制寄存器 定时器模式选择 计数模式 四种 向上 连续:即使时间固定值 加减:定时周期为2倍 工作模式 两种
[单片机]
MSP430笔记3——<font color='red'>串口</font>发送数据
stm32 程序二次加载:串口
使用串口二次加载程序即:不需要拆机就能够对产品进行升级,通过Bootloader就可以完成这项工作。该BootLoader的主要功能就是接受串口发送过来的应用程序并存放在固定的内存地址上,程序指针跳转到该地址上,程序就加载成功。 1、STM32在线升级 (IAP) IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。 1.1、IAP编写流程: 由Bootloader负责检测SD卡中是否有固件更新所需的BIN文件,或者通过SPI、CAN、以太网、串口等方式获取BIN文件。 如果获取到所需要的BIN文件,则开始复制文件更新固件,更新结束
[单片机]
MSP430f249读取DS1302时钟显示在1602和串口
单片机源程序如下: #include msp430.h #include cry1602.h #include cry1602.c #include DS1302.c unsigned char counter=0; unsigned char second=0; unsigned char minute=0; unsigned char hour=0; //signed char miao=10; struct sTime bufTime; //time buffer /*write 1 bcd byte on screen,(x,y)-position on screen, bcd-BCD byte
[单片机]
MSP430f249读取DS1302时钟显示在1602和<font color='red'>串口</font>
用ST16C2552实现DSP高速串行通讯扩展
1 引言 随着大规模集成电路工艺技术的迅速发展,DSP已经越来越广泛地应用于工业场合。工业现场由于许多场合通讯双方相距较远,为了保证通讯成本和可靠性,必须采用串行方式进行通讯。目前TI公司DSP都只有一个UART口,比如TMS320LF2407,当同时需要与上位机和下面的被控对象进行通讯,或者同时连接几个上位机时,则需要对DSP进行串行通讯口扩展,而使用可编程的ST16C2552可以一次扩展两组相互独立的串口,满足各种条件下串行通讯的要求。 2 ST16C2552介绍 ST16C2552是Exar公司生产的通用异步通讯扩展器件,并与飞利浦公司的SC16C2552相兼容,可扩展2路独立的串行通讯,可编程设定通讯起始位、停止位和
[嵌入式]
关于串口通信中断和查询方式
网上找了不少串口方面的资料,国内的资料都没有提到如何用中断方式来实现串口数据发送。其实,采用中断方式实现串口数据发送和采用中断方式实现串口数据接收的过程差不多,都需要开放8259的IRQ3或IRQ级中断,并需要设定modem控制寄存器使OUT2输出低电平,设置中断允许寄存器开放发送和接收中断。 这里有一点需要注意,《The Art of assembly language programming》中提到,发送寄存器为空时串口会产生中断,但是只会产生一次,书中采用的解决办法是通过IO端口直接写入发送保持寄存器,此时发送完毕后串口便又会产生 发送保持寄存器为空 中断。(就是每次发送前都设置中断允许寄存器),从实际效果来看是可以
[单片机]
μC/OS—II的嵌入式串口通信模块设计
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。   1 μC/OS-I
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved