求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 
单片机教程
第一章 单片机入门
1.单片机简介
2.开发板选择
3.前期准备
第二章 LED及入门
1.初识原理图
2.程序点灯
3.实际LED硬件连接
4.点亮LED
5.闪烁的LED
6.软件调试查看运行时间
7.延时1秒
8.函数封装
9.函数传参调用
10.流水灯
11.数组与移位
第三章 蜂鸣器
1.蜂鸣器原理
2.无源蜂鸣器鸣叫
3.无源蜂鸣器题目
4.无源蜂鸣器+LED
第四章 数码管
1.数码管原理
2.数组&数码管
3.数码管&LED
4.多个数码管显示
5.同时显示不同的数字
6.高位不显示0
7.数码管小数点
8.分钟秒表
第五章 独立按键
1.按键入门
2.按键&蜂鸣器&数码管
3.按键猜想
4.按键用法
5.按键模式
6.不支持连按
7.静态变量
8.支持连按与全局变量
9.再次优化不支持连按的代码
10.流水灯的优化解说
11. 代码对比
12.双模式函数封装
13.第一阶段综合例程(上)
14.第一阶段综合例程(下)
15.第一阶段的总结
第六章 多文件编程
1.多文件编写
2.模块初始化
3.数码管显示函数
4.多文件编程首次测试
5.带返回值的函数
6.新按键程序
7.最终按键程序
8.最终的function文件
第七章 外部中断
1.寄存器
2.中断函数
3.进一步理解中断函数
4.中断的实验现象
5.外部中断测脉冲个数
第八章 定时器
1.定时器概念
2.定时器工作模式
3.定时时长的做法
4.定时器简单运用
5.定时器工作模式2
6.定时器中断函数的使用
7.定时器初始化新写法
8.隐形漏洞
9.代码参考
10.微调定时精确时间
11.单独文件封装
12.输入捕获
13.数据类型强制转换
14.定时器&数码管扫描显示
15.呼吸灯
第九章 舵机与超声波模块
1.舵机入门
2.舵机与按键
3.超声波模块
第十章 串口通信
1.串口通信入门
2.简洁式串口通信
3.详细理解ASCII码
4.串口printf系列函数
第十一章 1602液晶屏
1.液晶屏代码讲解
2.指向数组的指针
3.液晶屏代码单独文件
4.各功能代码的运用
第十二章 IIC通信
1.IIC入门代码讲解
2.EEPROM简单使用
3.IIC&EEPROM合成文件
第十三章 红外遥控与温度传感器
1.红外遥控
2.代码文件和测试
3.温度传感器代码解析Ⅰ
4.温度传感器代码解析Ⅱ
5.温度传感器代码独立文件
第十四章 AD与DA
1.AD与DA合成文件
第十五章 混合例程
1.电位器控制舵机
2.遥控器控制舵机
3.温度传感器与串口
4.模拟倒车雷达报警
5.再次熟悉串口
6.串口&液晶屏Ⅰ
7.串口&液晶屏Ⅱ
8.串口&液晶屏Ⅲ
9.串口&EEPROM
10.实践操作
11.结束语
 
 
目录
串口通信入门
来源:C语言网    作者:继承叔    编辑:Alice(火龙果软件)
283 次浏览
1次  

在讲解本章的内容之前请大家先反复阅读《手把手教你学51单片机》文档的第11章内容,很多概念文档都已详细讲解有。

1.波特率

串口通信就是单片机与电脑端,单片机与单片机,单片机与模块器件之间互发信息进行通信,比如单片机发送一个“1”的字符给电脑端,电脑端的窗口就会接收到“1”。我们常用的波特率为9600,所谓9600指的是一秒钟单片机可以发送9600个数据位,也就是1秒钟的时间里单片机可以发送(9600/8)=1200字节。

如果我们想发送一个字符“A”给电脑端的窗口,那么字符“A”对应的ASCII值就是65,二进制表示为01000001。

2.通信引脚

单片机的P3.1是发送引脚,也就是说要发送字符“A”,这个引脚的变化如下图所示

单片机要发送一个字节给电脑端,首先发送引脚需要先拉高,然后拉低持续(1/9600)秒,电脑端检测到这个低电平信号就会准备接收数据字节。然后我们要发送的二进制位是01000001,但是串口通信发送的字节是低位在前,高位在后,所以上图的发送顺序就是01000001反过来为10000010。一个字节发送完成之后还要发送一个停止位1,电脑端接收到这个停止位就认为一个字节发送完成了。

我们用定时器来实现引脚的持续时间,怎么定时(1/9600)秒怎么设置,计算一下就可以了

(1/9600)=X*(12/11059200)

解得X=96。

因为定时时间间隔比较短,所以我们使用定时器0的工作模式2就可以了。填充TH0的初始值就是256-96=160=0xA0。

因为P3.1在“#include<reg52.h>”已有定义为TXD,我们直接用即可。通过按K4来启动发送字节数据。

3.代码

#include <reg52.h> 
#include <function.h>//详见第六章第8讲
#include <timer.h>   //详见第八章第11讲
  
void TIM0_Mode2_Init()
{
    TMOD&=0xF0;   //清0低四位
    TMOD|=0x02;   //设置定时器0为工作模式2
    TH0 = 0xA0;   //计算出波特率9600
    TL0 = 0xA0;
    ET0 = 1;      //闭合定时器0中断的开关
    TR0 = 1;      //启动定时器0 
}
  
void main()
{  
    u8 key;
    LED_Init();        //初始化LED硬件模块
    KEY_Init();        //初始化按键模块
    EA = 1;            //闭合总中断开关
    TIM0_Mode2_Init(); //定时(1/9600)秒
    TR0 = 0;           //先关闭定时器
    while(1)
    {  
        key=KEY_Scan(0,1000);
        if(key==4)TR0 = 1;//开启定时器启动一次字节传输,按一次发送一次。    
    
}
  
void TIM0_IRQHandler()  interrupt 1   
{
    static u8 cnt=0,i,TXDBUF=65; //字符“A”的ASCII值为65
    cnt++;                       //cnt一直在1~10之间变化
   
    if(cnt==1)TXD=0;             //cnt变为1,发送起始位,这次的中断函数就执行完了,持续够(1/9600)秒之后,再次进入中断函数,然后就是进入发送数据字节的8位的任务
   
    if (cnt>=2 && cnt<=9)        //发送8位数据位,从低位开始引脚的变化为 1 0 0 0 0 0 1 0
    {
        TXD = TXDBUF & 0x01;     //“TXDBUF & 0x01”的表达式就是,要么等于1要么等于0,这样P3.1的引脚要么保持高电平,要么保持低电平
        TXDBUF >>= 1;   
    }
   
    if (cnt == 10)
    {  
        TXD = 1;     //发送停止位
        TR0 = 0;     //关闭定时器,结束一次字节传输
        cnt=0;
        i++;
        TXDBUF=65+i; //下次按按键发送的是 B C D E···     
    }
}

 

大家可能对中断函数里的内容感到艰涩难度,这里简单说明一下,我们按下K4启动了定时器,然后第一次进入中断函数时,做的任务就是拉低P3.1,然后这次的中断函数的任务就结束了,等过了(1/9600)秒之后,再次进入中断函数,上一次拉低P3.1的时间已经持续够(1/9600)秒了,这第二次的中断函数任务就是拉高P3.1,因为发送字符A这个字节的最低位为1,持续够(1/9600)秒进入第三次执行中断函数,拉低P3.1,第四,第五,第六,第七都是拉低P3.1发送0,以此类推,到第10次中断函数执行就是拉高P3.1发送停止位,关闭定时器结束一次字节的传输,要想再次发送需要按K4启动定时器,“TXDBUF=65+i;

”表示下次发送的是66这个数据,再下次就是发送67······

4.软件设置

在软件界面选择串口助手,选用字符格式显示,查看波特率是否为9600,最后点击“打开串口”。

不断地间隔按K4,就会看到电脑端显示出单片机发送过来的字符数据

 

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



283 次浏览
1次