前期配置
软件:proteus
keil
前面的显示无C51工具链,所以我又下了这个。
C51v9。
这是一个.htm文件。
现在就显示破解成功了。现在打开老师给的项目就没有** Error: Project 'TEST1-1' requires 'C51' Toolchain which is not installed.这个报错了。
气死我了,为什么偏偏少给一个软件。
有点小误会了,哈哈,这几个是一个软件的各个成员,哈哈。
其他细节就可以看这个哔哩哔哩了。
【实践1:KeilC对Proteus仿真的单片机编程】https://www.bilibili.com/video/BV1T34y1t71V?vd_source=4dea17d81c8aa248d227911a2bdcae39
结束,交作业去喽!!
问到底什么是单片机中的中断??
定义:
中断是指在CPU工作时,打断当前某个正常进行的工作,而去处理其他突发事件,等处理完突发事件后返回原来被打断地方接着继续刚才的工作。
作用机理:
引起中断的根源称为中断源。在CPU中存在多个中断源,规定每一个中断源有一个优先级别。优先级别高的会先发生。
在51单片机中,一定有5个基本的中断源,即外部中断0(INT0)、外部中断1(INT1)、定时/计数器0中断(T0)、定时/计数器1(T1)中断以及串口中断(UART)
默认时:
优先级的顺序是可以自我定义的。但外部中断>定时中断>
下面是如何设置优先级。
中断允许寄存器(IE):寄存器中的每一位对应着不同的中断源,每一位均有用户软件设置“允许”或“禁止”,相当于每一个中断源的开关。此外,在IE的最高位是一个总开关,欲使某个中断源允许中断IE的最高位需=1;
中断优先级寄存器(IP):该寄存器的每一位也对应着不同的中断源,其复位清0,会将对应中断优先级设为最低优先级,而置1将把对应的中断优先级设置为高优先级。
1、(INT0):对应的是P3.2引脚的外部中断0,可由(TCON.0)选择其为低电平有效还是下降沿有效;当CPU检测到P3.2引脚时出现有效中断信息时,向CPU申请中断。
2、(INT1):对应的是P3.3引脚的外部中断0,可由(TCON.1)选择其为低电平有效还是下降沿有效;当CPU检测到P3.3引脚时出现有效中断信息时,向CPU申请中断。
3、T0:对应的是P3.4引脚;TF0(TCON.5)片内定时/计数器T0溢出中断标志位,当定时/计数器T0发生溢出时,置位TF0,向CPU申请中断。
4、T1:对应的是P3.5引脚;TF1(TCON.7)片内定时/计数器T0溢出中断标志位,当定时/计数器T1发生溢出时,置位TF1,向CPU申请中断。
5、RXD 和 TXD: 对应的是 P3.0 和 P3.1 口的附加功能,RI(SCON.0)或 TI (SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或 当串行口发送完一帧串行数据时置位 TI,向 CPU 申请。
中断的使用
CPU如何才能响应中断呢?
中断响应的条件有三个:1、中断源要有中断请求;2、中断允许位打开;3、中断总开关打开。
面对上面的三个中断条件,在使用中断时,我们需要考虑:使用哪种中断?其触发条件?希望中断干什么?以外部中断0为例;
外部中断0的配置应为
EA=1;//打开中断总开关;
EX0=1;//打开外部中断0;
IT0=0;//设置外部中断的触发方式;
中断服务函数:
void int0() interrupt 0 // int0 是函数名,可自定义;interrupt 是一个关键字,表示 51 单片机中断,后面的“0”是中断号,外部中断 0 中断号为0.
{
//编写用户所需的功能代码
}
————————————————
例子:
#include <REGX52.H>//包含51头文件
sbit LED1=P2^0;//定义LED1
sbit key=P3^2;//定义独立按键3
/*******************************************************************************
* 函 数 名 Delayms()
* 函数功能 : 进行延迟xms;
* 输 入 : xms
* 输 出 : 无
*******************************************************************************/
void Delayms(xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/*******************************************************************************
* 函 数 名 : exti0_init
* 函数功能 : 外部中断 0 配置函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void exti0_init()
{
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开 INT0 的中断允许
EA=1;//打开总中断
}
void main()
{
exti0_init();//外部中断0配置
while(1)
{
}
}
/*******************************************************************************
* 函 数 名 : exti0() interrupt 0
* 函数功能 : 外部中断0 中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void exti0() interrupt 0 //外部中断0中断函数
{
Delayms(10);//消斗
if(key==0)//再次判断K3键是否按下
LED1=!LED1;//LED1状态翻转
}
实验现象:
原文链接:https://blog.youkuaiyun.com/m0_56399733/article/details/133904885
单片机的定时器/计数器
1、设置定时器数及工作方式(TMOD)寄存器;
2、设置定时器初值,用于控制计数的大小(TH、TL);
3、开启定时/计数器(TCON)寄存器(高4位)中TR;
4、如需要触发中断(定时器中断),重复 “一、中断的使用步骤".
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/m0_56399733/article/details/133904885
串行口寄存器学习
串口通信:【一根数据线。】
异步通信【异步通信与同步通信】与同步通信【发送方
时钟对接收方
时钟的直接控制
】
异步通信:以字符为单位组成字符帧进行的数据传送
同步通信:数据以块为单位进行的数据传送
3种传输形式:
- 单工:数据传输仅能沿
一个方向
,不能实现反向传输;- 半双工:数据传输可以沿
两个方向
,但需要分时进行;- 全双工:数据可以
同时进行双向
传输。
串行通信常见的错误校验:
奇偶校验:【常用】
在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。
代码和校验
代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。
循环冗余校验
这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。
串行通信接口标准:RS-232C接口,接口中的每个插针有特定功能。
还有RS-232C,RS422A接口、RS-485接口、
串行口结构
SBOF传输缓存器,
【➢在物理上是相互独立的,一个用于发送数据(SBUF发)一个用于接收数据(SBUF收)
➢共用一个地址(99H) ,通过读写指令区别是对哪个】
TXD为数据发送引脚,RXD为数据接收引脚
TI
发送中断标志位,RI
接收中断标志位。
SCON
串行口的工作方式
默认有四种工作方式。
SM0、SM1——串行口工作模式选择位。
TI
发送中断标志位,RI
接收中断标志位,UART:数据异步通讯方式。’
波特率的计算
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
方式1和方式3的波特率是固定的,而我们常用的是方式1
在51单片机中,TMOD
是一个特殊功能寄存器,用于控制定时器/计数器T0和T1的工作模式。TMOD
寄存器的每一位都对应着特定的控制位,其中低四位控制定时器T0,高四位控制定时器T1。TMOD
寄存器的格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
GATE C/T M1 M0 GATE C/T M1 M0
在这里,M1
和 M0
这两位用来确定定时器的工作模式。它们的不同组合可以表示不同的工作方式:
00
:模式0,13位定时/计数器01
:模式1,16位定时/计数器10
:模式2,8位自动重装载定时/计数器11
:模式3,仅用于定时器0,将定时器0拆分为两个独立的8位定时/计数器
TMOD |= 0x20;
这行代码的作用是设置定时器1的工作模式。在TMOD
寄存器中,0x20
对应的二进制是0010 0000
。这意味着:
- 高四位(D7-D4)控制定时器T1,这里设置为
0010
,即M1=0
和M0=1
,表示定时器1工作在模式2。 - 低四位(D3-D0)控制定时器T0,这里设置为
0000
,不影响定时器0的设置。
因此,TMOD |= 0x20;
这句代码是选择了定时器1的工作方式2,即8位自动重装载定时器/计数器模式
串口如何使用
1.初始化
- 确定
T1的工作方式
(编程TMOD
寄存器); - 计算
T1的初值
,装载TH1
、TL1
; 启动T1
(编程TCON
中的TR1
位);- 确定
串行口控制
(编程SCON
寄存器); - **注意:**串行口在中断方式工作时,要进行
中断设置
(编程IE
、IP
寄存器)。
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
void UsartInit()
{/* 此处配置的波特率是为4800,波特率加倍*/
TMOD|=0x20;//选择工作方式2:8位自动重装载的定时器,0x20由波特率计算而得
TH1=0xF4;//8位自动重装,所以上下两个一样
TL1=0xF4;
PCON=0x80;//设置SMOD,PCON是不可位寻址,波特率加倍
TR1=1;//启动定时器1
SCON=0x50;//SM0=0,SM1=1,即为方式1:8位数据、波特率可变;REN=1 允许串行接收位
ES=1;//打开串口中断
EA=1;//打开总中断
}
void main()
{
UsartInit();
while(1);
}
void Usart() interrupt 4
{
u8 receiveData;
receiveData=SBUF;//读取接收缓冲器中的数据
RI=0;//接收完成后,硬件自动置1,需要软件清零
SBUF=receiveData;//传递数据时,把数据存入传输缓冲器中
while(!TI);
TI=0;//发送完成后,硬件自动置1,需要软件清零
}
参考文章:
【单片机学习】51单片机【串口】,详细介绍_51单片机串口-优快云博客
DF1302
LCD屏幕显示
快速掌握——LCD1602液晶显示(多组实验,附带源程序)-优快云博客