初识单片机
文章目录
- 单片机最小系统:
- 典型发光管控制电路
- 认识定时与中断
- 定时
- 中断
- 数码管
- 串口通信
网易云轻轻松松玩转51单片机
我觉得不错的单片机入门课程,学单片机首先要把基本的概念弄清楚,万事开头难,入了门就轻松多了,加油哈。
这些是我根据这个视频做的一些笔记,因为记笔记可以加深自己的印象,主要是给我自己看的,嘿嘿,当然,如果能够帮到你们那最好了不过了。
单片机是啥?
在一片集成电路上,集成了 微处理器、存储器、io接口电路
单片机控制原理:控制单片机的40个引脚输出的高低电平进行控制
目的:控制内外资源的运行
单片机最小系统:
构成可以工作的单片机最低的配置
- 电源
- 复位电路:提供复位功能,使单片机在一个确定的状态下开始工作 如:打开电源、按下复位键
- 晶振电路:为单片机提供一个时钟脉冲 (单片机是一个复杂的时序逻辑电路,需要在一个标准的时序脉冲下工作)——单片机的心脏
- 下载接口:将软件编制的目标程序下载到单片机里的一个连接接口 不同单片机下载接口不太相同
- EA接高电平:单片机程序放在单片机内部而不是外部
EA(External Access Enable 外部能够访问):是否允许访问外部(程序)存储器,低电平有效。(低电平允许访问外部程序)
单片机最小系统电路原理图
晶振(石英晶体振荡器):通过一定的外接电路,可以生成频率和峰值稳定的正弦波。
单片机在运行的时候,需要一个脉冲信号,作为自己执行指令的触发信号(单片机收到一个脉冲,就执行一次或多次指令。)
晶振给单片机提供工作信号脉冲,这个脉冲就是单片机的工作速度。
单片机内部也有晶振。接外部晶振可以或得更稳定的频率.
晶振的频率越快,单片机的运行速度就越快
11.05926的晶振 应用最为广泛 往往配合2个30p的电容
单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。
时钟周期:是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。
机器周期(CPU周期):单片机访问一次存储器的时间,(这是一个基本操作)用从内存中读取一个指令字(一条指令的机器字)的最短时间来规定,(这也是一个基本操作)这是一个时间基准(被人们确认为是最精确的时间尺度)。
为了便于管理,常把一条指令的执行过程划分为若干个阶段(如,取指令、存储器读、存储器写等),每一阶段完成一项工作(称为一个基本操作)。完成一个基本操作所需要的时间称为机器周期。
一般情况下,一个机器周期由若干个S周期(状态周期)(12个时钟周期)组成。
指令周期:执行一条指令的时间。(有的指令完成需要一个机器周期,有些需要两个机器周期)
如果一个单片机选择了12兆赫兹晶振,它的时钟周期是1/12us(周期为频率的倒数),则一个机器周期就是1us。而DJNZ指令是双周期指令,所以执行一次要2us。如果该指令需要执行500次,正好1000us,也就是1ms。
典型发光管控制电路
1 输出高电平 相当于输出5V 没有构成电压差 不亮
0 接地 构成电压差 亮
另一种
认识定时与中断
定时
解决方法:定时器
两个16位定时器/计数器(T0和T1)
计数器:每来一个脉冲,计数器加1 范围(0000~FFFF)
输入脉冲通过单片机引脚连接到计数器,实现计数功能
当我们把一个确定的时钟周期的一个脉冲通过单片机引脚连接到计数器,如周期为1微秒的一个标准时钟脉冲,这时计数器变成了一个定时器。计数器每加1,时间过去了1微秒,计数器计数的数值实际上就是一个时间的数值。
原理图:
在单片机所有的标志和控制都是对特定的寄存器的读写来实现的
查询tf的状态来判断定时是否到了,完成后清除tf标志,重新装入初值
TR0=1 开启定时器
中断
上个程序相应时间与查询次数之间存在矛盾,解决:中断
#include <reg51.h>//51单片机头文件sbit POUT=P1^0;void main(void) //主函数名{ TMOD=0x01;//设置工作方式TH0=0xfc;//装初值TL0=0x18; TR0=1;//开定时器0EA=1;//开中断总开关ET0=1; //开定时0中断while(1); }void time0() interrupt 1 //中断服务函数{TH0=0xfc;TL0=0x18;POUT=!POUT;//I/O管脚取反}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
/***********************************************************************程序功能:中断方式,定时器工作于方式1。每隔1秒,发光二极管闪烁1次。**************************************************************************/#include<reg52.h>#define uint unsigned int uint pp;sbit led=P0^0;void main(){TMOD=0x01; //定时模式设置,采用定时器0,工作模式1(M1=0,M0=1)。TH0=0Xff; //定时设置为100微秒。TL0=0Xa4;ET0=1; //开定时器0中断EA=1; //开总中断TR0=1; //打开定时器while(1){if(pp==10000)//时隔1s后,led闪烁。{led=~led;pp=0;}}}void time0() interrupt 1{TH0=0Xff;TL0=0Xa4;pp++;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
数码管
共阴的数码管高电平驱动 高电平点亮 低电平灭
共阳的数码管高电平驱动 低电平点亮 高电平灭
动态数码管
4个数码管的a~h八个端分别连接到一起,统一连接到一个八位的端口——段控端
那个数码管的那个位置亮,需要段控和位控同时配合
位控端——经过三极管放大
串口通信
并行通信:把所有的数据端连到一起,一次处理
速度快,硬件连接复杂
串行通信:将串行口发送和接收端连接到一起
8个数据分时通过同一通道发送过来
速度慢,硬件电路简单
用于串行通信
全双工制式:可同时发送和接受
单片机的串行通信是全双工制式
异步串口通行帧格式
奇偶效验:让数据通信更可靠
波特率:传输数据的速率,亦称比特率。(规定了每格数据有多长)
倒数即为每位数据传输时间。
如波特率为1200bps指每秒钟能传输1200位二进制码。
#include <reg51.h>//51单片机头文件#include <stdio.h>//输入输出函数头文件void main(void) //主函数{ SCON = 0x50; //串口方式1,允许接收 TMOD = 0x20; //定时器1定时方式2 TH1 = 0xF4; //11.0592MHz 2400波特率 TL1 = 0xF4;TI = 1; //串口发送标志 TR1 = 1; //启动定时器while(1) //主循环{printf('Hello world!\r\n');//字符串输出到串口}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
/******************************************************************************** 串口通信试验(发送) *********************************************************************************/#include <REG52.H>#include <stdio.h>unsigned char code MESSAGE[]= 'My first serial data!\n';unsigned char a;void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 200; j > 0; j--) ;}void main (void){ SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD|= 0x20; //定时器工作方式2 | 或等 不会改变T0的状态 TH1 = 0xF4;// 波特率2400、数据位8、停止位1。效验位无 (11.0592M)TL1 = 0xF4; TR1 = 1; //开启定时器1 while(1) { a=0; while(MESSAGE[a] != '\0') {SBUF = MESSAGE[a];//SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)while(!TI);// 等特数据传送(TI发送中断标志)TI = 0;// 清除数据传送标志a++;// 下一个字符} delay(1000); }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/******************************************************************************** 串口通信试验(收发) *********************************************************************************/#include<reg52.h>#define uchar unsigned charuchar a,flag;//设置全局变量void main(){SCON = 0x50; //串口方式1,允许接收TMOD=0x20;//设置定时器1为模式2TH1=0xf4;//装初值设定波特率2400TL1=0xf4;TR1=1;//启动定时器EA=1;//开总中断ES=1;//开串中断while(1){if(flag==1)//如果有数据则进入这个语句{ES=0;//进入发送数据时先关闭串行中断flag=0;SBUF=a;//将数据原样发回while(!TI);//等待数据发完TI=0;ES=1;//退出再开串行中断}}} void serial() interrupt 4//串行中断函数{ a=SBUF;//收取数据flag=1;//标志置位RI=0;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30