返回列表 发新帖本帖赏金 50.00元(功能说明)

[技术支持] 【HC89S003P套件试用】点灯与串口打印

[复制链接]
1698|2
 楼主 | 2019-3-24 01:38 | 显示全部楼层 |阅读模式
本帖最后由 yinwuqing110 于 2019-3-24 01:59 编辑

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

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

  22. void printf_str(char *str)
  23. {
  24.   while(*str!='\0')
  25.      {
  26.        SBUF = *str++;                       //发送8位串口数据
  27.        while(!(SCON & 0x02));
  28.        SCON &=~ 0x02;                    //清除发送中断标志位
  29.      }
  30. }

  31. int main(void)
  32. {
  33. /************************************系统初始化****************************************/
  34.         WDTCCR = 0x00;                       //关闭看门狗
  35.         CLKSWR = 0x51;                        //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
  36.         CLKDIV = 0x01;                         //Fosc 1分频得到Fcpu,Fcpu=16MHz
  37. /**********************************UART配置初始化**************************************/
  38.        P2M1 = P2M1&0xF0|0x08;          //P22设置为推挽输出
  39.        P0M3 = P0M3&0xF0|0x09;          //P06设置为开漏输出              
  40.        P0M3 = P0M3&0x0F|0x80;          //P07设置为推挽输出
  41.        P0M2 = P0M2&0xF0|0x06;          //P04设置为带上拉输入(施密特)
  42.       TXD_MAP = 0x07;                      //TXD映射P07
  43.        RXD_MAP = 0x04;                     //RXD映射P04    ++            
  44.       T4CON = 0x06;                          //T4工作模式:UART1波特率发生器
  45.         
  46.         //波特率计算
  47.         //波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
  48.         //          = 1/16 * ((16000000 / 1) / 104)
  49.         //          = 9615.38(误差0.16%)

  50.         //波特率9600
  51.         //反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
  52.         //              = (65536 - (16000000 * (1 / 16) / 9600))
  53.         //              = (65536 - 104.167)
  54.         //              = FF98
  55.         
  56.        TH4       = 0xFF;
  57.         TL4      = 0x98;                  //波特率9600
  58.         SCON2 = 0x02;                  //8位UART,波特率可变
  59.         SCON   = 0x10;                  //允许串行接收
  60.         IE        |=0X10;                  //使能串口中断
  61.         EA        =1;                       //使能总中断
  62.   
  63.         while(1)
  64.         {
  65.                  printf_str("感谢21IC,此次验证串口收发与点灯\n");
  66.                  P0_6 =~ P0_6;                         //P06取反
  67.                  Delay_ms(550);
  68.                  P2_2 =~ P2_2;                         //P22取反
  69.             {
  70.                 IE &=~ 0x10;                           //失能UART1中断
  71.                 if(value=='I')
  72.                 {
  73.                        printf_str("永远支持上海芯圣!\n");
  74.                        value='N';
  75.                 }
  76.                else
  77.                 ;
  78.                 IE |= 0x10;                //UART1中断使能
  79.                 SCON |= 0x10;           //UART1接收使能
  80.              }        
  81.          }
  82. }
  83. /***************************************************************************************
  84.   * @说明                UART1中断服务函数
  85.   * @参数                无
  86.   * @返回值             无
  87.   * @注                   无
  88. ***************************************************************************************/
  89. void UART1_Rpt(void) interrupt UART1_VECTOR
  90. {
  91.     if(SCON & 0x01)            //判断接收中断标志位
  92.     {
  93.        value = SBUF;            //转存8位串口接收数据
  94.        SCON &=~ 0x10;       //失能UART1接收
  95.        SCON &=~ 0x01;       //清除接收中断标志位
  96.     }
复制代码
下载ok的图示如下:


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

打赏榜单

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

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

谢谢关顾!
扫描二维码,随时随地手机跟帖
返回列表 发新帖 本帖赏金 50.00元(功能说明)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

快速回复 返回顶部 返回列表