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

【HC89S003P套件试用】点灯与串口打印

[复制链接]
3186|2
手机看帖
扫描二维码
随时随地手机跟帖
yinwuqing110|  楼主 | 2019-3-24 01:38 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:41 编辑

    感谢21ic,感谢上海芯圣,简单的编写了一下程序,让我生活更加充实,受益匪浅。     最近工作比较忙,也只能挤出点时间学习学习之前的51单片机知识,还好有网友的帮忙,论坛的资源丰富,让我很快的找回了在学校的**。看了HC89S001P的datasheet,最后看的指令表全是在学校学的汇编指令,现在温习一下,感觉还是蛮不错的。
    在这次实验中,我测试了一下串口的收发打印,以及使用了我在学校自主独立完成的最小单片机系统板,其实也只用了两个指示灯作为GPIO外设,后续有时间的话再编写一下基于DS18B20的温度传感器的数据采集上报等其它外设实验。
    代码如下:
#define ALLOCATE_EXTERN
#include <string.h>
#include "HC89S003P.h"

/***************************************************************************************
  * @实现效果   收到字符1,返回Hello Word,收到字符2返回Hello 21IC。
  * @操作步骤   接上TXD,RXD短路帽,然后通过上位机软件发送5个8位数据
  * @注意事项   波特率9600,8位数据,无校验位               
***************************************************************************************/
unsigned char value;
/**************************************************************************************
  * @说明          延时函数
  * @参数          fui_i : 延时时间
  * @返回值      无
  * @注             Fcpu = 16MHz,fui_i = 1时,延时时间约为1Ms
  *************************************************************************************/
void Delay_ms(unsigned int fui_i)
{
        unsigned int fui_j;
        for(;fui_i > 0;fui_i --)
        for(fui_j = 1596;fui_j > 0;fui_j --);
}

void printf_str(char *str)
{
  while(*str!='\0')
     {
       SBUF = *str++;                       //发送8位串口数据
       while(!(SCON & 0x02));
       SCON &=~ 0x02;                    //清除发送中断标志位
     }
}

int main(void)
{
/************************************系统初始化****************************************/
        WDTCCR = 0x00;                       //关闭看门狗
        CLKSWR = 0x51;                        //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
        CLKDIV = 0x01;                         //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************UART配置初始化**************************************/
       P2M1 = P2M1&0xF0|0x08;          //P22设置为推挽输出
       P0M3 = P0M3&0xF0|0x09;          //P06设置为开漏输出              
       P0M3 = P0M3&0x0F|0x80;          //P07设置为推挽输出
       P0M2 = P0M2&0xF0|0x06;          //P04设置为带上拉输入(施密特)
      TXD_MAP = 0x07;                      //TXD映射P07
       RXD_MAP = 0x04;                     //RXD映射P04    ++            
      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)
        {
                 printf_str("感谢21IC,此次验证串口收发与点灯\n");
                 P0_6 =~ P0_6;                         //P06取反
                 Delay_ms(550);
                 P2_2 =~ P2_2;                         //P22取反
            {
                IE &=~ 0x10;                           //失能UART1中断
                if(value=='I')
                {
                       printf_str("***支持上海芯圣!\n");
                       value='N';
                }
               else
                ;
                IE |= 0x10;                //UART1中断使能
                SCON |= 0x10;           //UART1接收使能
             }        
         }
}
/***************************************************************************************
  * @说明                UART1中断服务函数
  * @参数                无
  * @返回值             无
  * @注                   无
***************************************************************************************/
void UART1_Rpt(void) interrupt UART1_VECTOR
{
    if(SCON & 0x01)            //判断接收中断标志位
    {
       value = SBUF;            //转存8位串口接收数据
       SCON &=~ 0x10;       //失能UART1接收
       SCON &=~ 0x01;       //清除接收中断标志位
    }
下载ok的图示如下:
下载ok.png

录制了一段小视频,伙伴们加油,学无止境,温故而知新哦!
  https://v.youku.com/v_show/id_XNDEwODczNzI0NA==.html?spm=a2h3j.8428770.3416059.1


使用特权

评论回复

打赏榜单

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

xyz549040622| | 2019-3-24 08:11 | 显示全部楼层
居然还有视频,赞一个!

使用特权

评论回复
yinwuqing110|  楼主 | 2019-3-25 09:17 | 显示全部楼层
xyz549040622 发表于 2019-3-24 08:11
居然还有视频,赞一个!

谢谢关顾!

使用特权

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

本版积分规则

94

主题

1003

帖子

6

粉丝