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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机学习笔记——串口与PC通信 -> 正文阅读

[嵌入式]单片机学习笔记——串口与PC通信

“与PC机串口通信”程序设计说明

  1. 明确程序目的:
    实现单片机与PC进行通信,现在设置进行两位数码管(前面两位)来显示,只传递两位数
  2. 创建新项目
  3. 编写代码
    3.1变量定义
 /**********************
串口测试 型号:STC15F2K60S2 主频:11.0592MHz
************************/
#include<STC15F2K60S2.h>
#include<intrins.h>
/*---------宏定义---------*/
#define uchar unsigned char
#define uint unsigned int

#define cstFocs      11059200L  //晶振频率
#define cstBaud1     9600       //波特率
#define cstKeyMaxNum 100        //按键抖动次数
/*cstFocs是根据你IC外部实际使用的晶振来定义的,如果你外部挂的是11.0592M的晶振,那么就需要这样定义
#define cstFocs      11059200L
 cstBaud1 的定义则是根据你与电脑串口所通讯的具体的波特率,若使用9600的波特率,则定义为
#define cstBaud1     9600*/
/*---------引脚别名定义---------*/
sbit sbtKey1 = P3 ^ 2 ;             //按键1,启动发送
sbit sbtKey2 = P3 ^ 3 ;             //按键2,数字减少
sbit sbtKey3 = P1 ^ 7 ;             //按键3,数字增加
sbit sbtLedSel = P2 ^ 3;        

/*---------变量定义---------*/
uchar ucT100usTimes;    //中断次数(1次中断为100US)
uint uiKey1Cnt;            //按键1计数
uint uiKey2Cnt;            //按键2计数
uint uiKey3Cnt;            //按键3计数
uint uiKeyAllCnt;          //按键总的抖动次数
bit btT1msFlag;            //1ms的标志
bit btKey1Current;   /*key1当前的状态*/
bit btKey1Past;      /*key1前一个状态*/
bit btKey2Current;   /*key2当前的状态*/
bit btKey2Past;      /*key2前一个状态*/
bit btKey3Current;   /*key3当前的状态*/
bit btKey3Past;      /*key3前一个状态*/
/*收发显示数据相关*/     
bit btUart1SendBusy = 0 ;        //判断串口是否正在忙碌
uchar ucDateTmp;               //传输数据暂存
uchar ucDateDigState;         //用来判断显示前一位还是后一位
uchar arrSegSelect[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};      //显示0-f

3.2初始化函数

void Init()
{   P2M0 = 0x08;      //设置推挽模式,如果用到数码管一般这样设置
    P2M1 = 0x00;
    P0M0 = 0xff;
P0M1 = 0x00;

    TMOD = 0x01; //定时器0,方式1
    ET0 = 1; //开启定时器中断
    TH0 = ( 65535 - 100 ) / 256;
TL0 = ( 65535 - 100 ) % 256;
//1个机器周期=12个时钟周期(或振荡周期)时,机器周期=12/11.0592微秒。
    TR0 = 1; //启动定时器

    Uart1_Init();   //外部中断:低优先级

    ucDateTmp = 0x00;  传输数据暂存
    sbtLedSel = 0;   //关闭LED灯
    btT1msFlag = 0;   // 1ms的标志

    /*初始化所有按键的当前状态、前一个状态,现在都初始化未按*/
    btKey1Current = 1; /*key1当前的状态*/
    btKey1Past = 1; /*key1前一个状态*/
    btKey2Current = 1; /*key2当前的状态*/
    btKey2Past = 1; /*key2前一个状态*/
    btKey3Current = 1; /*key3当前的状态*/
    btKey3Past = 1; /*key3前一个状态*/

    uiKey1Cnt = 0x80 + cstKeyMaxNum / 3 * 2;      // cstKeyMaxNu100 按键抖动次数
    uiKey2Cnt = 0x80 + cstKeyMaxNum / 3 * 2;
    uiKey3Cnt = 0x80 + cstKeyMaxNum / 3 * 2;         
    uiKeyAllCnt = cstKeyMaxNum;                      
}

/*---------串口1初始化函数--------*/
void Uart1_Init( void )
{
    AUXR = 0X80; //辅助寄存器 此时定时器0的速度是传统的12倍,不分频
    SCON |= 0X50;   //允许接收
    TL1 = ( 65536 - ( cstFocs / 4 / cstBaud1 ) );   
    TH1 = ( 65536 - ( cstFocs / 4 / cstBaud1 ) ) >> 8;
    AUXR |= 0X40; //辅助寄存器 此时定时器1的速度是传统的12倍,不分频
    RI = 0;      //接收中断标志位
    TI = 0;      //发送中断标志位
    TR1 = 1;     //启动定时器1
    ES = 1;      //串口中断允许位
    EA = 1;      //总中断允许位
    PS = 1 ;    //串口1中断高优先级
}

3.3中断函数

/*---------定时器T0中断处理函数--------*/
void T0_Process() interrupt 1
{
    TH0 = ( 65535 - 100 ) / 256; //定时器初始值
    TL0 = ( 65535 - 100 ) % 256;
    ucT100usTimes++;
    if( ucT100usTimes == 10 )         //中断10次对应1ms   100us/次 1个脉冲1us左右
    {
        ucT100usTimes = 0;
        btT1msFlag = 1;
    }
    ucDateDigState++;        
    if( ucDateDigState == 2 )
        ucDateDigState = 0;                        //只有两位,故只设两种情况
        P0 = 0;
    switch( ucDateDigState )
    {
       case 0:
            P2 = 0x00;  P0 = arrSegSelect[ucDateTmp / 16];      //高位
break;
        case 1:
            P2 = 0x01;  P0 = arrSegSelect[ucDateTmp % 16];  break;  //低位
    }
}

/*---------发送数据函数--------*/
void SendData( unsigned char dat )
{
    while( btUart1SendBusy ); //发送单个字符给UART1以发送到PC机
    btUart1SendBusy = 1;
    SBUF = dat;
}

/*---------串口1中断处理函数--------*/
void Uart1_Process() interrupt 4 using 1
{
    if( RI )         //RI接收中断标志位,接受完数据后 RI自动制1
    {
        RI = 0;   ucDateTmp = SBUF;  //传递的单字符
    }
    if( TI )        //TI发送中断标志位,发送完数据后 RI自动制1
    {
        TI = 0;   btUart1SendBusy = 0;
    }
}

3.4主函数

/*---------主函数--------*/
void main()
{
    Init();
    while( 1 )
    {
        if( btT1msFlag )
        {
            btT1msFlag = 0;
            if( sbtKey1 == 0 )
                uiKey1Cnt--;
            if( sbtKey2 == 0 )
                uiKey2Cnt--;
            if( sbtKey3 == 0 ) //按键是按下状态
                uiKey3Cnt--;
            uiKeyAllCnt--;//总的次数减1

            if( uiKeyAllCnt == 0 ) //100次完了
            {

                if( uiKey1Cnt < 0x80 )   //按键时间最长(对于其他两个按建),相当于按下该按键
                {
                    btKey1Current = 0;
                    if( btKey1Past == 1 ) //下降沿(按键做动作)
                    {
                        btKey1Past = 0;
                        SendData( ucDateTmp ) ;
                    }
                }
                if( uiKey1Cnt >= 0x80 )
                {
                    btKey1Current = 1;
                    if( btKey1Past == 0 )
                        btKey1Past = 1;  //上升沿(假设不做动作那就继续)
                }
                if( uiKey2Cnt < 0x80 )
                {
                    btKey2Current = 0;
                    if( btKey2Past == 1 ) //下降沿(按键做动作)
                    {
                        btKey2Past = 0;
                        ucDateTmp--;
                    }
                }
                if( uiKey2Cnt >= 0x80 )
                {
                    btKey2Current = 1;
                    if( btKey2Past == 0 )
                        btKey2Past = 1;  //上升沿(假设不做动作那就继续)
                }

                if( uiKey3Cnt < 0x80 )
                {
                    btKey3Current = 0;
                    if( btKey3Past == 1 ) //下降沿(按键做动作)
                    {
                        btKey3Past = 0;
                        ucDateTmp++;
                    }
                }
                if( uiKey3Cnt >= 0x80 )
                {
                    btKey3Current = 1;
                    if( btKey3Past == 0 )
                        btKey3Past = 1;  //上升沿(假设不做动作那就继续)
                }

                /*新一轮的判断*/
                uiKey1Cnt = 0x80 + cstKeyMaxNum / 3 * 2;
                uiKey2Cnt = 0x80 + cstKeyMaxNum / 3 * 2;
                uiKey3Cnt = 0x80 + cstKeyMaxNum / 3 * 2;
                uiKeyAllCnt = cstKeyMaxNum;
            }
        }
    }
}

4.效果图片展示

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:17:17  更:2021-08-13 12:18:29 
 
开发: 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:46:24-

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