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

您所在的位置:网站首页 stc芯片怎么烧写 [15单片机] STC15F104W开发入门及模拟串口程序

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

2023-11-26 13:12| 来源: 网络整理| 查看: 265

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.1776MHZ 600 ~ 115200 bps @ 22.1184MHZ 600 ~ 76800 bps @ 18.4320MHZ 300 ~ 57600 bps @ 11.0592MHZ 150 ~ 19200 bps @ 5.5296MHZ ******************************************/ #include #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; //定义模拟串口发送IO u8 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 function if (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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3