IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机学习笔记——双机通信(型号:STC15F2K60S2) -> 正文阅读

[嵌入式]单片机学习笔记——双机通信(型号:STC15F2K60S2)

一、定义变量

/**********************
myM485 485双机通信例程测试
型号:STC15F2K60S2 主频:11.0592MHz
************************/
#include <STC15F2K60S2.H>
#include <intrins.h>
/*---------宏定义---------*/
#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define cstUart2Ri  0x01                        //接收中断请求标志位
#define cstUart2Ti  0x02                        //发送中断请求标志位
#define cstNoneParity           0           //无校验
#define PARITYBIT cstNoneParity         //定义校验位

/*串口波特率相关*/
#define cstFosc 11059200L               //系统时钟频率 
#define cstBaud2    9600                    //串口波特率    
#define cstT2HL     (65536-(cstFosc/4/cstBaud2))    //定时器初始时间

/*---------引脚别名定义---------*/
sbit sbtKey1 = P3 ^ 2 ;                 //启动发送
sbit sbtKey2 = P3 ^ 3 ;                 //数字减少
sbit sbtKey3 = P1 ^ 7 ;                 //数字增加

sbit sbtSel0 = P2 ^ 0 ;
sbit sbtSel1 = P2 ^ 1 ;
sbit sbtSel2 = P2 ^ 2 ;
sbit sbtLedSel = P2 ^ 3 ;

sbit sbtM485_TRN  = P3 ^ 7 ;   //定义MAX485使能引脚,为1时发送,为0时接收

/*---------变量定义---------*/
bit btSendBusy ;              //为1时忙(发送数据),为0时闲
uchar ucGetDataTmp ;          //接收数据暂存
uchar ucPutDataTmp ;          //发送数据暂存
uchar arrSegSelect[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,
                        0x6d, 0x7d, 0x07, 0x7f, 0x6f,
                        0x77, 0x7c, 0x39, 0x5e, 0x79,
                        0x71, 0x40, 0x00
                       };   //段选,显示0-f

在这里插入图片描述
图1(定义中大部分引脚,其余的因为经常用就不展示了)
在这里插入图片描述
图2(通信的原理图,结合引脚图理解)
从这两张图可以看出sbtM485_TRN 所对应的P3 ^ 7 ;

二、与串口有关的函数


/*---------串口2初始化及波特率发生函数---------*/
void Uart2Init( void )
{
    S2CON = 0x10 ;      //定义无校验位,允许串行口2接收
    T2L = cstT2HL ;             //设置波特率重装值 其中cstT2HL=(65536-(cstFosc/4/cstBaud2)) 
    T2H = cstT2HL >> 8 ;  //高八位
    AUXR |= 0x14 ;      //T2为1T模式,并启动定时器2
}


/*---------串口2中断处理程序---------*/
void Uart2_Process( void ) interrupt 8 using 1
{
    if( S2CON & cstUart2Ri )  //接收中断请求标志位,S2CON是串行口2控制寄存器     // cstUart2Ri=0x01
    {
        ucGetDataTmp = S2BUF ;
        ucPutDataTmp = ucGetDataTmp ;
        S2CON &= ~cstUart2Ri;   //接收中断标志位清0
    }
    if( S2CON & cstUart2Ti )         // cstUart2Ti=0x02
    {
        btSendBusy = 0 ;            //清除忙信号
        S2CON &= ~cstUart2Ti ;      //发送中断标志位清0
    }
}

其中用到的两个主要寄存器(串行口2的数据缓冲寄存器S2BUF、串行口2的控制寄存器S2CON)

S2CON的格式如下:
在这里插入图片描述
S2TI——发送中断请求标志位 , S2RI——接收中断请求标志位
S2BUF实际上是2个缓冲器,它可以进行两个操作(完成待发送数据的加载,获得已接收到的数据)。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。

三、外部中断函数

/*---------外部中断0处理程序---------*/
void ExInt0_Process() interrupt 0
{
    sbtM485_TRN = 1 ;   //MAX485使能引脚,为1时发送,为0时接收
    S2BUF = ucPutDataTmp ;  //串口2 的数据缓冲寄存器S2BUF
    while( btSendBusy ) ;
    btSendBusy = 1 ;      //为1时忙(发送数据),为0时闲
    sbtM485_TRN = 0 ;
}

这里为何MAX485使能引脚,为1时发送,为0时接收,具体可以看看图2,应该就可以理解了。
while( btSendBusy ) ; 这句话就是当btSendBusy=1时就不会进行下面的流程就会一直再循环这句。

四、初始化函数

/*---------系统硬件、变量初始化函数---------*/
void Init()
{
    P0M0 = 0xff ;       //P0口推挽(放大电流)
    P0M1 = 0x00 ;
    P2M0 = 0x0f ;       //P2.0—~P2.3口推挽
    P2M1 = 0x00 ;
    P3M0 = 0x00 ;       //准双口
    P3M1 = 0x00 ;
    P1M0 = 0x00 ;
    P1M1 = 0x00 ;       //P1、P3准双向口
    //外部中断0
    IT0 = 1 ;           //下降沿触发中断(为0则下降沿和上升沿均会触发中断)
    EX0 = 1 ;           //允许外部中断0
    PX0 = 0 ;           //外部中断:低优先级
    //485初始化  波特率生成
    sbtM485_TRN = 0 ;       //初始为接收状态
    P_SW2 |= 0x01 ;     //P_SW2 外围设备功能切换寄存器,其中最后一位S2_S,如果是1就切换串口2的管脚到P4.6,P4.7,是0就切换串口2的管脚到P1.0,P1.1
    Uart2Init() ;
    btSendBusy = 1 ;
    IE2 |= 0x01 ;       //开串行口2中断
    IP2 |= 0x01 ;       //设置串行口中断:高优先级
    EA = 1 ;            //开总中断
    //数码管选择
    sbtLedSel = 0 ;     //开启数码管显示,LED熄灭
    sbtSel0 = 1 ;
    sbtSel1 = 1 ;
    sbtSel2 = 1 ;           //选择第八位数码管显示
    ucPutDataTmp = 0 ;       
}

P_SW2寄存器的格式如下:
在这里插入图片描述
在这里插入图片描述

五、其他函数

/*---------延时函数---------*/
void delay( void )
{
    uchar i, j;
    for( i = 0; i < 255; i++ )
        for( j = 0; j < 255; j++ )
            ;
}

六、主函数

/*---------主函数---------*/
void main( void )
{
    Init() ;
    while( 1 )
    {
        ucPutDataTmp %= 16 ;
        P0 = arrSegSelect[ucPutDataTmp] ;

        if( sbtKey3 == 0 )
        {
            delay();
            if( sbtKey3 == 0 )  //按键3,加
            {
                while( !sbtKey3 );
                ucPutDataTmp++ ;
            }
        }
        if( sbtKey2 == 0 )
        {
            delay();
            if( sbtKey2 == 0 )   //按键2,减
            {
                while( !sbtKey2 );
                ucPutDataTmp-- ;
            }
        }
    }
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:45:24  更:2021-08-15 15:45:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:51:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码