STC15F104W开发入门及模拟串口程序

Saturday, 31. March 2018 09:42AM - beautifulzzzz

前言

最近找到一款51内核的SOP8封装的8脚单片机STC15F10x与大家分享!

1、基本介绍

下面是其一个典型应用——红外收发器实现:

是不是觉得麻雀虽小,五脏俱全呀,再看一下其架构图:


下面是其部分型号的外设列表和采购价格图(需要特别注意的是下面几款都是不带串口、CCP、PCA、PWM、AD的!因此,如果你想要用串口,就需要采用模拟的方法实现了。不过,好在宏晶官网提供了DEMO。):


2、DEMO&烧写

STC15和之前烧写STC51单片机一样,需要用STC-ISP,通过USB转TTL(RX接芯片的P31,TX接芯片的P30),选择好芯片等信息,点击下载,之后上电...

从官网下载最新的STC-ISP工具:stc-isp-15xx-v6.86L,务必要下载完全版!!!

在该工具的后面的范例程序中可以找到各种DEMO的C语言和汇编双版本.

3、编程

在STC-TOOL.pdf的第13章 编译器(汇编器)/ISP编程器(烧录)/仿真器说明中,介绍了用keil可以开发。由于STC15单片机型号较新,keil中目标单片机还没有,可以用Intel 80/87C58作为目标单片机。

此外,可以在STC官网下载打包好的驱动和DEMO:STC15系列库函数与例程测试版V1.0,2014-5-29

4、STC15F104W半双工串口DEMO

/*************  功能说明    **************
使用STC15系列的Timer2做的模拟串口. P3.0接收, P3.1发送, 半双工.
假定测试芯片的工作频率为11059200HZ. 时钟为5.5296MHZ ~ 35MHZ.
波特率高,则时钟也要选高, 优先使用 22.1184MHZ, 11.0592MHZ.
测试方法: 上位机发送数据, MCU收到数据后原样返回.
串口固定设置: 1位起始位, 8位数据位, 1位停止位,  波特率在范围如下.
1200 ~ 115200 bps @ 33.1776MHZ600 ~ 115200 bps @ 22.1184MHZ600 ~  76800 bps @ 18.4320MHZ300 ~  57600 bps @ 11.0592MHZ150 ~  19200 bps @  5.5296MHZ******************************************/#include    <reg52.h>#define MAIN_Fosc       11059200UL  //定义主时钟
#define UART3_Baudrate  9600UL    //定义波特率
#define RX_Lenth        32          //接收长度#define UART3_BitTime   (MAIN_Fosc / UART3_Baudrate)typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;sfr IE2  = 0xAF;
sfr AUXR = 0x8E;
sfr INT_CLKO = 0x8F;
sfr T2H  = 0xD6;
sfr T2L  = 0xD7;sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;u8  Tx3_read;           //发送读指针
u8  Rx3_write;          //接收写指针
u8  idata   buf3[RX_Lenth]; //接收缓冲u16 RxTimeOut;
bit B_RxOk;     //接收结束标志//===================== 模拟串口相关===========================
sbit P_RX3 = P3^0;  //定义模拟串口接收IO
sbit P_TX3 = P3^1;  //定义模拟串口发送IOu8  Tx3_DAT;        // 发送移位变量, 用户不可见
u8  Rx3_DAT;        // 接收移位变量, 用户不可见
u8  Tx3_BitCnt;     // 发送数据的位计数器, 用户不可见
u8  Rx3_BitCnt;     // 接收数据的位计数器, 用户不可见
u8  Rx3_BUF;        // 接收到的字节, 用户读取
u8  Tx3_BUF;        // 要发送的字节, 用户写入
bit Rx3_Ring;       // 正在接收标志, 低层程序使用, 用户程序不可见
bit Tx3_Ting;       // 正在发送标志, 用户置1请求发送, 底层发送完成清0
bit RX3_End;        // 接收到一个字节, 用户查询 并清0
//=============================================================void    UART_Init(void);void main(void){P0M0 = P0M1 = P1M0 = P1M1 = P2M0 = P2M1 = P3M0 = P3M1 = 0x00;P4M0 = P4M1 = P5M0 = P5M1 = P6M0 = P6M1 = P7M0 = P7M1 = 0x00;UART_Init();    //PCA初始化EA = 1;while (1){       //user's functionif (RX3_End){        // 检测是否收到一个字节RX3_End = 0;    // 清除标志buf3[Rx3_write] = Rx3_BUF;  // 写入缓冲if(++Rx3_write >= RX_Lenth) Rx3_write = 0;  // 指向下一个位置,  溢出检测RxTimeOut = 1000;   //装载超时时间}if(RxTimeOut != 0){      // 超时时间是否非0?if(--RxTimeOut == 0){    // (超时时间  - 1) == 0?B_RxOk = 1;AUXR &=  ~(1<<4);   //Timer2 停止运行INT_CLKO &= ~(1 << 6);  //禁止INT4中断T2H = (65536 - UART3_BitTime) / 256;    //数据位T2L = (65536 - UART3_BitTime) % 256;    //数据位AUXR |=  (1<<4);    //Timer2 开始运行}}if(B_RxOk){      // 检测是否接收OK?if (!Tx3_Ting){      // 检测是否发送空闲if (Tx3_read != Rx3_write){  // 检测是否收到过字符Tx3_BUF = buf3[Tx3_read];   // 从缓冲读一个字符发送Tx3_Ting = 1;               // 设置发送标志if(++Tx3_read >= RX_Lenth)  Tx3_read = 0;   // 指向下一个位置,  溢出检测}else{B_RxOk = 0;AUXR &=  ~(1<<4);       //Timer2 停止运行INT_CLKO |=  (1 << 6);  //允许INT4中断}}}}
}// 描述: UART初始化程序.
void UART_Init(void){Tx3_read  = 0;Rx3_write = 0;Tx3_Ting  = 0;Rx3_Ring  = 0;RX3_End   = 0;Tx3_BitCnt = 0;RxTimeOut = 0;B_RxOk = 0;AUXR &=  ~(1<<4);       // Timer2 停止运行T2H = (65536 - UART3_BitTime) / 256;    // 数据位T2L = (65536 - UART3_BitTime) % 256;    // 数据位INT_CLKO |=  (1 << 6);  // 允许INT4中断IE2  |=  (1<<2);        // 允许Timer2中断AUXR |=  (1<<2);        // 1T
}// 描述: Timer2中断处理程序.
void timer2_int (void) interrupt 12{if(Rx3_Ring){        //已收到起始位if (--Rx3_BitCnt == 0){      //接收完一帧数据Rx3_Ring = 0;           //停止接收Rx3_BUF = Rx3_DAT;      //存储数据到缓冲区RX3_End = 1;AUXR &=  ~(1<<4);   //Timer2 停止运行INT_CLKO |=  (1 << 6);  //允许INT4中断}else{Rx3_DAT >>= 1;                  //把接收的单b数据 暂存到 RxShiftReg(接收缓冲)if(P_RX3) Rx3_DAT |= 0x80;      //shift RX data to RX buffer}}if(Tx3_Ting){                    // 不发送, 退出if(Tx3_BitCnt == 0){         //发送计数器为0 表明单字节发送还没开始P_TX3 = 0;              //发送开始位Tx3_DAT = Tx3_BUF;      //把缓冲的数据放到发送的buffTx3_BitCnt = 9;         //发送数据位数 (8数据位+1停止位)}else{                        //发送计数器为非0 正在发送数据if (--Tx3_BitCnt == 0){  //发送计数器减为0 表明单字节发送结束P_TX3 = 1;          //送停止位数据Tx3_Ting = 0;       //发送停止}else{Tx3_DAT >>= 1;      //把最低位送到 CY(益处标志位)P_TX3 = CY;         //发送一个bit数据}}}
}/********************* INT4中断函数 *************************/
void Ext_INT4 (void) interrupt 16{AUXR &=  ~(1<<4);   //Timer2 停止运行T2H = (65536 - (UART3_BitTime / 2 + UART3_BitTime)) / 256;  //起始位 + 半个数据位T2L = (65536 - (UART3_BitTime / 2 + UART3_BitTime)) % 256;  //起始位 + 半个数据位AUXR |=  (1<<4);    //Timer2 开始运行Rx3_Ring = 1;       //标志已收到起始位Rx3_BitCnt = 9;     //初始化接收的数据位数(8个数据位+1个停止位)INT_CLKO &= ~(1 << 6);  //禁止INT4中断T2H = (65536 - UART3_BitTime) / 256;    //数据位T2L = (65536 - UART3_BitTime) % 256;    //数据位
}

链接

  • 宏晶官网:http://www.stcmcu.com/
  • STC15.PDF:https://gitee.com/openhwapi/IC/raw/master/STC15/DOC/STC15.pdf
  • STC-TOOL.pdf:http://www.stcmcudata.com/STC-TOOL.pdf

@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975

[15单片机] STC15F104W开发入门及模拟串口程序相关推荐

  1. 单片机IO口模拟串口程序(发送+接收

    单片机IO口模拟串口程序(发送+接收)[转] qcmc 发表于 - 2011-6-23 0:42:00 前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些 ...

  2. iPhone开发入门(1)—-程序员眼中的iPhone

    http://blog.csdn.net/itudou_2010/article/details/5492272 iPhone开发入门(1)--程序员眼中的iPhone 博主:易飞扬 原文链接 : h ...

  3. iPhone开发入门(1)----程序员眼中的iPhone

    自去年 iPhone 面世以来,开创了移动设备内容服务的一种新的模式--程序商店(App Store).它极大地降低了移动设备应用程序开发的成本,即使普通人也能进入这个市场.就像在PC上开发应用程序一 ...

  4. 串口发送程序linux,单片机IO口模拟串口程序(发送+接收

    前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些现有的资料,基本上完成了.现在将完整的测试程序,以及其中一些需要总结的部分贴出来. 程序硬件平台:11. ...

  5. 基于android的串口开发板,210开发板Android系统串口程序

    最近由于项目需要,花了两天时间在Android平台下编写了一个串口助手软件.硬件平台是友善之臂的tiny210开发板.起初的想法是首先基于Linux驱动做一些修改,然后自行编写HAL层代码,最后编写A ...

  6. STC15F104W使用定时器0模拟串口

    #include <reg51.h> #include <intrins.h>//定义波特率常量 //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T: ...

  7. Android开发入门教程--Android应用程序结构分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.新建HelloWorld项目: 1.打开Eclipse,点击"File"->"New& ...

  8. u8 api开发报类型不匹配错误_小程序云开发入门学习,小程序支付功能常见错误汇总及解决方案...

    近期有比较多的同学反映,使用云开发调取微信支付时,老是提示订单不存在.今天就把这几天大家遇到的问题统一汇总到这里. 一,订单不存在的错误 如下图所示的错误. 通常看到这个错误时,最好去看下上面看下,有 ...

  9. 小程序云开发入门——问卷测评小程序实战(5)

    利用云开发改进题库 1.将题库转成对应的json模式后导入数据库 不要忘记改权限哦~ 2.新建xiti页面 先做一个代码的搬运工,布局和样式照搬过来 <!--pages/xiti/xiti.wx ...

最新文章

  1. python3 数学常量
  2. kotlin int最大值_Kotlin程序查找三个数字中的最大值
  3. jquery-只对新用户弹一次窗
  4. css实现3行2列居中高度自适应布局
  5. 洛谷2661 信息传递 三倍经验?
  6. Leetcode每日一题:52.N-Queens II(N皇后Ⅱ)
  7. ScrollView详解
  8. Selector提取数据1:XPath选择器
  9. 遗传算法c语言代码实验报告,遗传算法的c语言程序
  10. 百度识图.........
  11. 手机无线如何共享给台式计算机,台式电脑怎样共享网络给手机
  12. jpg格式图片怎么缩小?如何压缩jpg图片?
  13. 【微信小程序】微信小程序--倒放音频的实现
  14. SpringBoot集成elasticsearch使用
  15. 7小时Unity3D游戏开发培训教程
  16. AOE网络关键路径求解的通俗理解
  17. 中医四季养生法 冬季补肾汤
  18. Java == equals() hashCoed()的区别
  19. 字节后台三面高难度面经
  20. Arduino重磅更新!IDE 2.0来了

热门文章

  1. DM8168 DVR_RDK配置
  2. 私募证券基金动态-11月报
  3. 数据库模式 内模式 概念模式(模式)外模式
  4. 启动光盘制作教程(整合自己的光盘)
  5. 【异地组网】蒲公英x1保姆级教程
  6. Unity GUID
  7. win10配置python环境变量
  8. 42个激活函数的全面总结
  9. “无人经济”场景日渐丰富,但仍需考虑更多问题!
  10. php 读 cookies,正确解读PHP读取Cookies的方法_PHP教程