发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[通用8051核FLASH系列]

【HC89S003P套件试用】串口测试

[复制链接]
963|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方QQ 于 2023-7-25 14:29 编辑

拿到开发板了,由于外地出差中,测IO等需要LED什么的,不好找到。于是想到测串口。
看了一下,大家都没有发测串口的呢。
于是找到了官方的开发包。
下载地址
http://www.holychip.cn/uploadfiles/release/democode/HC89S003F4%20Register%20Example%20V1.0.3.0.rar
里面有个例子
UART-UART1收发字节
于是想在这个例子基础上稍微改一下。
这个例子是从计算机接收5个字符后,作为一组一次性发送给计算机。
于是我觉得发什么,收什么不太可观。我给返回给计算机的添加一个字符“A”
/**
*   ************************************************************************************
*                                                                上海芯圣电子股份有限公司
*                                                                    www.holychip.cn
*        ************************************************************************************
*        @Examle Version                V1.0.3.0
*        [url=home.php?mod=space&uid=1102]@demo[/url]         Version                V1.0.3.0
*        [url=home.php?mod=space&uid=212281]@date[/url]                                2018.6.1
*        ************************************************************************************
*                                                                         模块性能介绍
*   1、UART1有4种工作方式,在四种方式中,任何将SBUF作为目标寄存器的写操作都会启动发送
*           方式0:同步半双工通讯
*           方式 1:8位UART,可变波特率,异步全双工
*           方式 2:9位UART,固定波特率,异步全双工
*           方式 3:9位UART,可变波特率,异步全双工
*        ************************************************************************************
*                                                                         应用注意事项
*        1、使用串口时,需要Fosc和Fcpu时钟一致,如时钟不一致,请勿操作发送冲突标志位(TXCOL),
*           否则会造成串口功能异常
*        ************************************************************************************
*                                                                         客户服务
*        感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
*        ****************************技术支持群:201030494***********************************
*   ************************************************************************************
**/

#define ALLOCATE_EXTERN
#include "HC89S003F4.h"

unsigned char guc_Uartflag = 0;                        //UART判断标志位
unsigned char guc_Uartcnt = 0;                    //UART计数使用
unsigned char guc_Uartbuf_a[5] = {0};        //用于存放接收收据
unsigned char guc_i;                                        //发送数据计数        

/***************************************************************************************
  * @实现效果        UART1接收到上位机发送的5个8位数据后,把接接收的5个数据再次发送给上位机
  * @操作步骤   接上TXD,RXD短路帽,然后通过上位机软件发送5个8位数据
  * @注意事项        波特率9600,8位数据,无校验位               
***************************************************************************************/
void main()
{
/************************************系统初始化****************************************/
        WDTCCR = 0x00;                                                //关闭看门狗
                                                //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
        CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************UART配置初始化**************************************/
        P2M0 = P2M0&0x0F|0x80;                                //P21设置为推挽输出
        P0M1 = P0M1&0x0F|0x20;                                //P03设置为上拉输入
        TXD_MAP = 0x21;                                                //TXD映射P21
        RXD_MAP = 0x03;                                                //RXD映射P03               
        T4CON = 0x06;                                                //T4工作模式:UART1波特率发生器
        
        //波特率计算
        //波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
        //       = 1/16 * ((16000000 / 1) / 104)
        //                 = 9615.38(误差0.16%)

        //波特率9600
        //反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
        //                   = (65536 - (16000000 * (1 / 16) / 9600))
        //                   = (65536 - 104.167)
        //         = FF98
        
  TH4 = 0xFF;
        TL4 = 0x98;                                                        //波特率9600
        SCON2 = 0x02;                                                //8位UART,波特率可变
        SCON = 0x10;                                                //允许串行接收
        IE |= 0X10;                                                        //使能串口中断
        EA = 1;                                                                //使能总中断
   
        while(1)
        {
                if(guc_Uartflag)
                {
                        IE &=~ 0x10;                                //失能UART1中断

                          SBUF = 'A';//发送8位串口数据
                                while(!(SCON & 0x02));
                                SCON &=~ 0x02;                        //清除发送中断标志位


                        for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
                        {
                                SBUF = guc_Uartbuf_a[guc_i];//发送8位串口数据
                                while(!(SCON & 0x02));
                                SCON &=~ 0x02;                        //清除发送中断标志位
                        }
                        IE |= 0x10;                                        //UART1中断使能
                        guc_Uartflag = 0;
                        guc_Uartcnt = 0;
                        SCON |= 0x10;                                //UART1接收使能
                }        
        }
}

/***************************************************************************************
  * @说明          UART1中断服务函数
  *        @参数        无
  * @返回值 无
  * @注                无
***************************************************************************************/
void UART1_Rpt(void) interrupt UART1_VECTOR
{
        if(SCON & 0x01)                                                //判断接收中断标志位
        {
                guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
                if(guc_Uartcnt >= 5)
                {
                        SCON &=~ 0x10;                                //失能UART1接收
                        guc_Uartflag = 1;
                }
                SCON &=~ 0x01;                                        //清除接收中断标志位
        }                                                                        
}


打赏榜单

芯圣电子官方QQ 打赏了 50.00 元 2019-04-08
理由:001p试用三等奖

沙发
小明的同学|  楼主 | 2019-3-21 23:05 | 只看该作者

烧录进去后。

接收回来的以A开头了。Answer,,,就是这个意思。后面准备重写这个例子,实现printf,或者发送字符串功能。

使用特权

评论回复
板凳
gaoyang9992006| | 2019-3-21 23:39 | 只看该作者
已实现发送字符串。已实现发送字符串。已实现发送字符串。

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

1425

帖子

2

粉丝