基于STC8H系列单片机的串口中断系统

基于STC8H系列单片机的串口中断系统

STC8H4K64TL单片机介绍

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H4K64TL单片机管脚图(48个引脚)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H4K64TL单片机串口仿真与串口通信

在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H4K64TL单片机管脚图(32个引脚)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H4K64TL单片机管脚图(20个引脚)

在这里插入图片描述在这里插入图片描述

STC8H系列单片机管脚说明

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H系列单片机I/O口

在这里插入图片描述在这里插入图片描述

STC8H系列单片机I/O口相关寄存器

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H系列单片机配置I/O口

在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H系列单片机I/O口结构图

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H系列单片机如何设置I/O口对外输出速度

在这里插入图片描述

STC8H系列单片机如何设置I/O口电流驱动能力

在这里插入图片描述

STC8H系列单片机如何降低I/O口对外辐射能力

在这里插入图片描述

STC8H系列单片机的串口中断系统介绍

在这里插入图片描述在这里插入图片描述

STC8H系列单片机的串口功能脚切换

在这里插入图片描述

STC8H系列单片机的串口相关寄存器

在这里插入图片描述

STC8H系列单片机的串口1相关寄存器

串口1控制寄存器(SCON)

在这里插入图片描述在这里插入图片描述

串口1数据寄存器(SBUF)

在这里插入图片描述

电源管理寄存器(PCON)

在这里插入图片描述

辅助寄存器1(AUXR)

在这里插入图片描述

串口1模式0波特率计算公式

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

串口1模式1波特率计算公式

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

串口1模式2波特率计算公式

在这里插入图片描述在这里插入图片描述

串口1模式3波特率计算公式

在这里插入图片描述在这里插入图片描述

串口1从机地址控制寄存器(SADDR SADEN)

在这里插入图片描述在这里插入图片描述

STC8H系列单片机的串口2相关寄存器

串口2控制寄存器(S2CON)

在这里插入图片描述在这里插入图片描述

串口2数据寄存器(S2BUF)

在这里插入图片描述

串口2模式0波特率计算公式

在这里插入图片描述在这里插入图片描述

串口2模式1波特率计算公式

在这里插入图片描述在这里插入图片描述

STC8H系列单片机的串口3相关寄存器

串口3控制寄存器(S3CON)

在这里插入图片描述在这里插入图片描述

串口3数据寄存器(S3BUF)

在这里插入图片描述

串口3模式0波特率计算公式

在这里插入图片描述在这里插入图片描述

串口3模式1波特率计算公式

在这里插入图片描述

STC8H系列单片机的串口4相关寄存器

串口4控制寄存器(S4CON)

在这里插入图片描述在这里插入图片描述

串口4数据寄存器(S4BUF)

在这里插入图片描述

串口4模式0波特率计算公式

在这里插入图片描述在这里插入图片描述

串口4模式1波特率计算公式

在这里插入图片描述

串口注意事项

在这里插入图片描述在这里插入图片描述

STC-ISP 串口波特率计数器工具

在这里插入图片描述在这里插入图片描述

STC-ISP 串口助手/USB-CDC

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC8H系列单片机的串口1使用定时器1的16位自动重装定时模式0作为波特率发生器范例程序

main.c

#include "STC8H.h"
#include "intrins.h"
#include "Uart1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
 void PortModeSet()//单片机端口模式设置函数
{
   
  P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
  P0M0 = 0x00;//设置P0.0~P0.3为准双向口
  P0M1 = 0x00;//设置P0.4~P0.7为准双向口
  P1M0 = 0x00;//设置P1.0~P1.3为准双向口
  P1M1 = 0x00;//设置P1.4~P1.7为准双向口
  P2M0 = 0x00;//设置P2.0~P2.3为准双向口
  P2M1 = 0x00;//设置P2.4~P2.7为准双向口
  P3M0 = 0x00;//设置P3.0~P3.3为准双向口
  P3M1 = 0x00;//设置P3.4~P3.7为准双向口
  P4M0 = 0x00;//设置P4.0~P4.3为准双向口
  P4M1 = 0x00;//设置P4.4~P4.7为准双向口
  P5M0 = 0x00;//设置P5.0~P5.3为准双向口
  P5M1 = 0x00;//设置P5.4~P5.7为准双向口
 }
 void main()
{
   
  PortModeSet();//单片机端口模式设置函数
  Uart1Init();//串口1初始化函数 
  Uart1SendString("Uart1 Test !\r\n");//串口1发送字符串函数
  while (1)
 {
   
   if (SendNumber !=  ReceiveNumber)//如果发送数量不等于接收数量
  {
   
    Uart1Send(CacheDataArray[SendNumber++]);//串口1发送数据函数
    SendNumber &= 0x0f;//只能发送16个数量
   }
  }
}

Uart1.c

#include "Uart1.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
  /****
  时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
  机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
  指令周期:单片机取出一条指令且执行完这条指令所需的时间
  以上三者间的关系:指令周期>机器周期>时钟周期
  一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
   1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
   2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
   3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
  二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
   2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
  (1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
  (2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
 (一)、以下是8051单片机定时器用12分频计算定时器初值:
     定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
 (二)、以下是8051单片机定时器不用分频计算定时器初值:
     定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
 (三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
     1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
     2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
 (四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
     1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率  转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率]  转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
     2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率  转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率]  转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
  ****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/ 
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
    定时方式            分频方式                      公式
方式1:16位定时器  12分频(即12T 默认值)   Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器   12分频(即12T 默认值)   Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器      1分频(即1T)       Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器       1分频(即1T)       Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
    定时方式            分频方式                      公式
方式1:16位定时器   12分频(即12T 默认值)  定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器    12分频(即12T 默认值)  定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器       1分频(即1T)      定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器        1分频(即1T)      定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
 void Uart1Init()//串口1初始化函数 
{
   
  AUXR = 0x40;//定时器1的1分频计时
  SCON = 0x50;//设置串口1工作模式为模式1 允许串口接收数据
  TMOD = 0x00;//设置晶振为11.0592MHz的定时器1的16位自动重装定时模式0
  TL1 = Baudrate;//设定定时器1低8位初值
  TH1 = Baudrate >> 8;//设定定时器1高8位初值
  TR1 = 1;//打开定时器1开关
  ES = 1;//打开串口中断允许位开关
  EA = 1;//打开定时器中断总开关
  ReceiveNumber = 0x00;//接收数量变量清0
  SendNumber = 0x00;//发送数量变量清0
  Busy = 0;//忙变量清0
 } 
 void Uart1Send(uchar Data)//串口1发送数据函数
{
   
  while (Busy);//当忙标志位变量等于1 一直停在此 不执行以下程序 否则跳出 执行以下函数
  Busy = 1;//标志位变量1
  SBUF = Data;//把变量Data含有的数据赋给串口缓存数据寄存器
 }
 void Uart1SendString(uchar *p)//串口1发送字符串函数
{
   
  while (*p)//当条件一直大于0 一直执行以下函数 否则跳出 不执行以下函数
 {
   
   Uart1Send(*p++);//串口1发送数据函数
  }
}
 void Uart1() interrupt 4//串口1中断函数
{
   
  if(TI)//判断发送数据标志位变量是否为1 为1表示已经发送完数据
 {
   
   TI = 0;//发送数据标志位变量清0
   Busy = 0;//忙标志位变量清0
  }
 if(RI)//判断接收数据标志位变量是否为1 为1表示已经接收完数据
{
   
  RI = 0;//接收数据标志位变量清0
  CacheDataArray[ReceiveNumber++] = SBUF;//把接收数据存储器存储的数据赋给缓存数据数组
  ReceiveNumber &= 0x0f;//只能接收16个数量
 }
}

Uart1.h

#ifndef  _UART1_H
#define  _UART1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define Frequency 11059200UL//声明频率变量
#define Baudrate  (65536 - (Frequency / 115200 + 2) / 4)//声明波特率变量
bit Busy;//声明忙变量
extern uchar ReceiveNumber;//声明接收数量变量
extern uchar SendNumber;//声明发送数量变量
extern uchar CacheDataArray[16];//声明缓存数据数组变量
void Uart1Init();//串口1初始化函数
void Uart1Send(uchar Data);//串口1发送数据函数
void Uart1SendString(uchar *p);//串口1发送字符串函数
#endif 

STC8H系列单片机的串口1使用定时器1的8位自动重装定时模式2作为波特率发生器范例程序

main.c

#include "STC8H.h"
#include "intrins.h"
#include "Uart1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
 void PortModeSet()//单片机端口模式设置函数
{
   
  P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
  P0M0 = 0x00;//设置P0.0~P0.3为准双向口
  P0M1 = 0x00;//设置P0.4~P0.7为准双向口
  P1M0 = 0x00;//设置P1.0~P1.3为准双向口
  P1M1 =
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值