导图社区 微机原理及应用(51)-知识梳理(8页)
基于天津大学精仪学院微机原理及应用课程资料,包含管脚功能、串行通讯、数模转换、寄存器总结、重要表格、汇编助记符等。
编辑于2020-08-19 16:39:451绪论
历史
46
ENIAC
冯·诺依曼
16
程序存储
二进制运算
经典结构
运算器
控制器
存储器
输入设备
输出设备
未突破
电子计算机
电子管计算机
晶体管计算机
集成电路计算机
大规模集成电路计算机
超大规模集成电路计算机
单片机
概括
一块集成芯片,具有一些特殊功能,这些功能实现需要我们编程完成,编程目的是控制这块芯片的引脚在不同时间输出不同的电平,进而控制单片机各引脚相连接的外围电路的电气状态。
应用
智能仪器仪表
机电一体化
实时工业控制
分布式系统前端
家用电器
80c51
Intel
最简系统
单片机
CPU
8位
片内数据存储器RAM
128B
片内程序存储器ROM/EPROM
4KB(有些芯片没
特殊功能寄存器SFR
128B-21个
并行口
P0-P3
定时器/计数器
2个16位
串行口
全双工×1
中断系统
5中断源 2优先级
供电电路
稳压、去耦电容
复位电路
时钟电路
电源电路
存储器设置电路
JTAG程序下载口
管脚支持矩阵动态分配
结构
多板机 (系统机
CPU
存储器
I/O接口
总线
主机板
微机主板
适配板卡
电源
软硬盘驱动
光驱
同一机箱
软件
完整的微型计算机系统
系统机
工业PC机
单板机
CPU芯片
存储器芯片
I/O接口芯片
简单I/O设备
键盘、led
印刷电路板
监控程序
ROM中
单板微型计算机
单板机
单片机
微处理器
存储器
I/O接口电路
一块集成电路芯片
单芯片微型计算器
系统机
桌面应用
通用计算机
数据处理、办公自动化、辅助设计
单片机
嵌入式应用
专用计算机
智能仪表、传感、家电、办公;车电、军事
2-1二进制、编码、结构
数据表、码制
10→2
÷2取余
×2取整
亦或
0⊕0=1⊕1=0
1⊕0=0⊕1=1
编码
BCD码
有权码
8421、2421、5421
无权码
余3码、余3循环码、格雷码
1000 0101 B
不能识别进制
来源规则处理
ASCII码
128字符
7位二进制
最高空闲/奇偶校验
整体结构
功能
8位CPU
4KbytesROM程序存储器
52 8K
256bytesRAM数据存储器
52 384bytes
32I/O线
111指令
多为单字节
21专用寄存器
2可编程定时/计数器
5中断源,2优先级
一个全双工串行通信口
外数据存储器寻址空间64kB
外程序存储器寻址空间64kB
逻辑操作位寻址
双列直插40PinDIP封装
单一+5V电源供电
时钟电路、CPU时序
振荡周期
时钟周期,时钟脉冲信号震荡源周期
状态周期
2*时钟周期,振荡周期2分频
机器周期
6*状态周期=12*时钟周期
CPU完成一独立操作
指令周期
CPU一条操作所需全部时间,单、双、四周期指令
CHMOS型51
XTAL1输入外时钟
XTAL2悬空
12MHZ
1μs/机器周期
双字节单周期指令
ADD A,#data
指令长1字节
执行1机器周期
单字节双周期指令
MOVX A,@DPTR
MOVX @DPTR,A
指令长1字节
执行2机器周期
DPTR16位运算两次
存储器配置
物理存贮空间*4
片内 外ROM
PSEN信号
片内 外RAM
逻辑地址空间*3
ROM内外
0000H-FFFFH
16位地址
MOVC
片内RAM
00H-FFH
8位地址
一般指令
片外RAM
0000H-FFFFH
16位地址
MOVX
程序存储器
系统保留存贮单元
内RAM
工作寄存器
4区每区8寄存器
R0-R7
程序状态字PSW专用寄存器
RS1、RS0 00、01、10、11
选择一区为当前工作区
未选中可存取数据,不能用R0-R7寄存器寻址方式访问
位寻址区
128RAM位
16RAM字节
93SFR位
12SFR
位寻址区
字节地址
20H-2FH
16字节
位地址
00-7FH
128bit
通用RAM
30H-7FH
专用寄存器SFR
80H-FFH
21个不连续
直接寻址
高区RAM
80H-FFH
寄存器间接寻址
管脚
XTAL1
反相放大器输入
外部震荡接收
XTAL2
反相放大器输出
外部震荡悬空
外界晶体振荡器<24M
微调电容30pF
RST/Vpd
复位
平时低电平
高电平有效
保持2机器周期高电平完成复位
电源输入端
备用
保证RAM不丢失
ALE/PROG
地址锁存允许信号
上电后输出正弦脉冲
振荡器频率1/6
CPU访问外部存储器时
锁存低八位地址控制信号
PROG
片内EPROM编程脉冲输入端使用
0
P0数据
1
P0地址
PSEN
访问片外ROM,定时输出负脉冲
选通信号
片外取值信号
片外程序存储器读
有效
P0读回指令/常数
EA/Vpp
外部程序存储器地址允许输入段/固化编程电压输入端
EA=1
PC<4K
CPU访问内部ROM
执行内部程序存储器命令
PC>4K(0FFFH)
转去执行片外
EA=0
CPU只访问片外ROM
P0
外存
地址/数据总线
分时输出地址、八位数据
无外存
准双向IO,开漏输出
P2
外存
外存16位时地址总线高8位
P3
0
RXD接收
1
TXD发送
2、3
中断0、1
0有效
4、5
时钟0、1
6
WR外RAM写
0有效
7
RD外RAM读
0有效
串行
异步
uart、RS232、RS485
数据帧、效率低、时钟不严
一帧数据
起始位
0
1位
数据位
低前高后
奇偶位
1位
奇校验
1数+校验位1=奇数
偶校验
1数+校验位1=偶数
停止位
1
1/2位
循环冗余校验
纠错强,广泛于同步通信
波特率
B/s
120字符/s,1始、8数、1止
10b×120/s=1200b/s=1200波特
UART
接收缓冲器只读不写
发送缓冲器只写不读
SBUF
99H
SCON
串行口控制
98H
可位寻址
0
SCON=0x00
波特率=fosc/12
RXD
移位数据输入/出
TXD
移位时钟输出
REN=1,RI=0(上次接收数据读走)
串口数据RXD输入
TXD输出同步移位信号
完成RI=1
1
波特率=
一帧数据10位
起始0
8数据
停止1
接受有效
RI=0
上一帧数据接收完成,RI1发出的中断请求已响应
SBUF已取走
SM2=0(8位通信,没RB8事)/SM2=1,9位RB8=1
2
波特率=
一帧数据11位
起始0
9数据
TB8 RB8
停止1
通信协议软件设TB8
写入SBUF
TB8自动装入9
发送完TI=1
REN=1,RXD1↓0开始接受
收完第九位送入SBUF条件
RI=0(接收缓冲器空
SM2=0/RB8=1
收到数据送SBUF
9位入RB8
RI=1
不满足两条件则接收信息丢弃
3
波特率=
同2
定时器1作波特率发生器
计数器
k=0(0);16(1);8(2、3)
定时器
串口13波特率
PCON
速度控制
SMOD
1
方式123波特率翻倍
使用
初始化
确定串行口控制
SCON
确定T1工作方式
TMOD
计算T1初值
TH1、TL1
启动T1
TCON-TR1
中断设置
IE、IP
工作
发送
写SBUF,查询TI中断
接收
REN=1,查询RI中断
PC通信
RS232
25、15、9针连接器
RS-232C接口
距离短,速率低
电平偏移
抗干扰差
TTL
连接简单
抗干扰差,通信距离<1m
RS-422
1219m,10Mbps
步骤
IIC
SDA
输入输出线
SCL
时钟线
无需片选
多主多从
接收器进行其他时牵住SCL=0
使SDA等待,传送暂停
协议
主控发起始信号
从机地址7bits、读写方向位1bit
1读从机0写
主机在第9时钟高电平期间读SDA
1无响应
0响应(SDA拉低
由地址、方向位,从机确定自己模式,响应ACK
从机不响应则SDA高(NACK
主读取从机数据,数据线从机控制
9bit时从机释放SDA等主ACK
NACK从机终止发送
后若干字节传输有ACK
末次无
主控发停止
除起始停止,正常通信时
时钟高电平期间数据不许变化
时钟线变低电平时变化
时钟信号SCL总由主机提供
SDA由发送数据方控制
从机地址
从机固定地址+可选引脚地址
AT24C04
1010(高4)+A2、A1、A0低三位
SPI
SCK
串行时钟线
主机产生
每8时钟周期信号1字节
MISO
主入/从出
MOSI
主出/从入
CS
低电平有效片选
速度
高速
最大时钟频率=系统时钟1/2
SPI最大时钟频率
CPU处理SPI数据能力
输出端驱动能力(PCB允许最大
一次通信8bit倍数
同步
一个时钟源
数据块,速度快、效率高、时钟要求严格
SPI、IIC、IIS
串行
通信双方
统一编码方式
相同传送速率
ADDA
DA
转换器
权电阻网络
权电流
T型电阻网络
分辨率
输出模拟量最小变化值
位数越多分辨率越高
5V 12位
5V/4096=1.22mV
影响精度的量化误差减少,其他(温漂,先行不良仍影响
转换误差
满刻度FSR百分数
1/2LSB
模拟电压绝对误差=输入代码0…1时输出电压一半
原因
参考电压VREF波动
运放0·漂移
模拟开关导通内阻、导通电压
电阻网络电阻值偏差
绝对精度
实际输出与理论值最大误差
<1LSB
由引起
DAC增益误差(输入全1,实际与理想差
0·误差(输入全0,DAC非0输出值
非线性误差
噪声
相对精度
同绝对精度,最大误差相对满刻度%
时间
输入数字量满刻变化,输出模拟量↑±1/LSB
电流型短,电压型取决运放
超高速<1μs,高速10~1μs,中速100~10μs,低速≥100μs
线性度(非线性误差
实际转换曲线与理想直线特性最大偏差%
DAAC0832
AD
转换
采样
保持
量化
编码
采样定理
采样频率fi>2×ui最高分量频率fimax
转换器
并联比较性
分压、比较、编码
速度快
比较器多
逐次逼近型
双积分型
性能稳定、抗干扰强
慢
精度高速度要求不高
高精度数字直流电压表
主要技术指标
分辨率
变化一个相邻数码所需输入模拟电压变化量
10V满刻,12位
量化误差
有限位进行量化引起的误差
偏移误差(0值误差
输入0输出非0
满刻度误差(增益误差
满刻度输出数对应实际输入-理想输入
线性度
非线性度,实际转换特性与理想直线最大偏差
绝对精度
实际模拟输入-理论模拟输入)max
转换速率
每秒转换次
一次时间的倒数
ADC0809
51
PC
初始化0000H
程序计数器
下一条指令地址
自动+1
中断+0
复位清0
16位
DPTR
16位数据指针
高8位DPH
低8位DPL
可单独访问
访问片外RAM、ROM
范围64K
SP
81H
复位07H
堆栈指针
栈顶地址
压PUSH+1
弹POP-1
TMOD
89H
定时器控制寄存器
计数器模式
TMOD.
7
3
GATE
定时操作开关控制
1
INT0/1引脚高电平
TR0/1=1
0
TR0/1=1
计数器0/1启动
6
2
C/T
功能选择位
1
计数器
引脚T0/1输入计数脉冲
0
定时器
内系统时钟计时脉冲
5
1
M1
4
0
M0
工作模式选择位
0
假设需要计数1000,8192-1000 = 7192 = 0x1C18 = 0B 0001-1100-0001-1000 TH0 = 0xE0,TL0 = 0x18; TH0 = (8192-1000)/32; TL0 = (8192-1000)%32;
1
(65536-m)/%256
23
TH0=TL0=256-m
TCON
88H
计时/计数器控制寄存器
控制定时器启/停 标志定时器溢出、中断
TCON.
7
TF1
T1溢出
1
申请中断
入中断
硬件清0
查询
软件清0
5
TR1
T1允许计数控制位
GATE=1
INT高电平
GATE=0
1
允许T1
软件清0
定时器T1
6
TF0
T0溢出
1
申请中断
入中断
硬件清0
查询
软件清0
4
TR0
T0允许计数控制位
GATE=1
INT高电平
GATE=0
1
允许T0
软件清0
定时器T0
3
IE1
1请求(P3.3 INT1)标志
1
1请求中断
响应
复位
2
IT1
1触发方式控制
0
低电平触发
P3.3 INT1低电平
IE1置位
1
下降沿
外中断1
1
IE0
0请求(P3.2 INT0)标志
1
0请求中断
响应
复位
0
IT0
0触发方式控制
0
低电平触发
P3.2 INT0低电平
IE0置位
1
下降沿触发
外中断0
IE
A8H
中断允许控制寄存器Interrupt Enable
IE.
7
EA
0
禁止中断
1
总允许
6
4
ES
串行口中断
1
允许
0
EX0
外中断INT0
2
EX1
外中断INT1
1
中断允许
5
ET2
定时器2
3
ET1
定时器1
1
ET0
定时器0
1
中断允许
复位
清0
全禁
IP
B8H
中断优先控制寄存器
IP.
7
6
5
PT2
定时器2
3
PT1
定时器1
1
PT0
定时器0
1
高优先
0
低优先
4
PS
串行口优先
1
高优先
0
低优先
2
PX1
INT1
0
PX0
INT0
1
高优先
0
低优先
复位
清0
全低优先
SBUF
串行数据缓冲器
99H
PCON
87H
掉电控制、波特率控制
SMOD
波特率选择位
1
方式123波特率翻倍
SCON
SCON.
7
SM0
6
SM1
工作方式
5
SM2
方式2、3
接收状态
1
9位 RB8 == 1
前八位送入 SBUF
RI发出中断申请
接到第九位RB8=0
接收到的前8位丢弃
0
前八位送入 SBUF
RI发出中断申请
4
REN
允许接收位
1
允
0
禁
3
TB8
发送接收数据位8
方式2、3
数据位9
0
数据
1
地址
奇偶校验
奇校验
数据1个数+校验位1=奇数
2
RB8
奇偶校验
偶校验
数据1个数+校验位1=偶数
存放接收到的数据位9
方式0不用
1
TI
方式0
发送完位8
硬件置1
其他方式
发送/停止位前硬件置位
软件清0
1
帧发送结束
0
RI
1
帧接收完成
硬件置位
可寻址标志位
串行口控制
ACC
E0H
算术/逻辑运算
低字节执行数/中间结果
累加器
B
F0H
算术/逻辑运算
高字节执行数/中间结果
×÷
放乘/除数
间接寻址(基)地址寄存器
P0
80H
P0.0~P0.7
外接存贮器
数据/地址总线低8位
P1
90H
P1.0~P1.7
P1.
0
T2
1
T2EX
EPROM地址低8位
P2
A0H
P2.0~P2.7
外存
地址总线高8位
EPROM地址高8位
P3
B0H
P3.0~P3.7
第二功能P3.
0
RXD
接收
1
TXD
发送
串行口
2
INT0
外中断0输入
3
INT1
外中断1输入
中断申请
4
T0
计数器0输入
5
T1
计数器1输入
CTC
6
WR
写外RAM
7
RD
读外RAM
读写控制
双功能口
驱动4TTL门
锁存器先置1
I/O
复位
0FFH
R0→R7
工作寄存器_组
仅R0R1间接寻址
PSW
D0H
程序状态信息
位PSW.
7
CY
布尔处理机累加器
D7进/借位时1
加减法
6
AC
辅助进位位,十进制调整指令
D3进/借D41
8位+法运算
低半字节
D3向D4进位
1
8位-法运算
低半字节
D3向D4借位
1
5
F0
用户定义1/0
测试用
4
RS1
3
RS0
工作寄存器区选择
2
OV
补码溢出标志
有符号数+-硬件置位/清楚判是否溢出
溢出=1
×÷指令
1
0
P
奇偶标志
ALU结果中1数
奇1
验证传输可靠
串口通讯
SBUF = i; while(!TI){} TI = 0;
ascii
0-9
0030-0039
浮动主题
自然优先级
高 ↓ 低
INT0
T0
INT1
T1
串行口
T2
表格
ASCII
存储
工作寄存器区
中断地址
中断顺序
高 ↓ 低
INT0
T0
INT1
T1
串行口
T2
寄存器地址
片内ROM寻址范围
0000H-07FFH
管脚结构
进制
串行
uart
PCON
87H
掉电控制、波特率控制
SMOD
波特率选择位
1
方式123波特率翻倍
波特率
0
波特率=fosc/12
固定
1
波特率=
3
波特率=
取决于T1溢出率
2
波特率=
取决于SMOD
定时器1作波特率发生器
计数器
k=0(0);16(1);8(2、3)
定时器
串口13波特率
11.0592MHz,波特率9600,SMOD=0
IIC
SPI
AD
分辨率
变化一个相邻数码所需输入模拟电压变化量
10V满刻,12位
中断、代码
共阳段码管测试
{ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
全部关闭消影
max7219
void Write_MAX7219(unsigned char Addr,unsigned char Data)//地址和数据写入(内部函数不可引用) { /*地址和数据均为两位16进制数,如0xFF*/ unsigned char Count; //计数变量 LOAD = 0; //LOAD引脚拉低电平开始写入数据 for(Count = 0;Count < 8;Count++) //写地址 { CLK = 0; Addr <<= 1; DIN = CY; //通过移位方式将一位数据移至单片机状态字寄存器的CY位,然后送出 CLK = 1; delay(1); CLK = 0; } for(Count = 0;Count < 8;Count++) //写数据 { CLK = 0; Data <<= 1; DIN = CY; //通过移位方式将一位数据移至单片机状态字寄存器的CY位,然后送出 CLK = 1; delay(1); CLK = 0; } LOAD = 1; //LOAD引脚拉高电平锁定数据 }
void Init_MAX7219(unsigned char Light_Coding,unsigned char SEG_Coding_Mode,unsigned char SEG_DIG_Num) //使用前调用设置MAX7219 { /*亮度(0x00~0x0F),编码模式(0x00,0x01,0x0F,0xFF),数码扫描管个数(0x00~0x07)*/ Write_MAX7219(0x09,SEG_Coding_Mode); Write_MAX7219(0x0A,Light_Coding); Write_MAX7219(0x0B,SEG_DIG_Num); Write_MAX7219(0x0C,0x01); }
uart
使用
初始化
确定串行口控制
SCON
确定T1工作方式
TMOD
计算T1初值
TH1、TL1
启动T1
TCON-TR1
中断设置
IE、IP
工作
发送
写SBUF,查询TI中断
接收
REN=1,查询RI中断
模式0
SCON = 0x10; //REN = 1; //设置成模式0并允许接收
接收
RI = 0; //启动74ls165输入进程 while(!RI); //等待串口通信完成 sd = SBUF; //读取串口数据到sd中间变量
发送
SBUF = sd; //将接收的数据发送给74ls164 while(!TI); //等待发送完成 TI = 0; //清除完成标志
模式1
SCON = 0x50; //SM0/SM1/SM2/REN/TB8/RB8/TI/RI,串口模式1,允许接收 TMOD = 0x20; //定时器1为模式2,自动重装载 //波特率 = T1的溢出频率/32 //9600 = fosc/12/M/32,M为计数值,fosc=11.0592MHz时,计算得M = 3 TH1 = TL1 = 256 - 3; TR1 = 1; EA = 1;
查询方式
while(1) { if(RI==1) { RI=0; P1=SBUF; } }
中断方式
void ser() interrupt 4 { RI=0; P1=SBUF; }
spi
u8 spi_io_byte(u8 d) { u8 i; u8 ret; ret = 0; SCK = 1; for (i=0;i<8;i++) { SCK = 0; _nop_(); if(MISO) ret += (1<<(7-i)); MOSI = (bit)(d&0x80); _nop_(); SCK = 1; d <<=1; } return ret; }
读取eeprom状态寄存器
u8 SPI_EEPROM_ReadSR(void) { u8 byte=0; CS3 = 0; //使能器件 spi_io_byte(RDSR); //发送读取状态寄存器命令 byte = spi_io_byte(0xff); //读取一个字节 CS3 = 1; //取消片选 return byte; }
void SPI_EEPROM_Wait_Busy(void) { while ((SPI_EEPROM_ReadSR()&0x01)==0x01); // 等待BUSY位清空 }
写使能
void SPI_EEPROM_Write_Enable(void) { CS3 = 0; //使能器件 spi_io_byte(WREN); //发送写使能 CS3 = 1; //取消片选 }
读
void SPI_EEPROM_Read(u8* pBuffer,u16 ReadAddr,u8 NumByteToRead) { u8 i; CS3 = 0; //使能器件 spi_io_byte(READ); //发送读取命令 spi_io_byte((u8)(ReadAddr>>8)); //发送16bit地址 spi_io_byte((u8)ReadAddr); for(i=0;i<NumByteToRead;i++) { pBuffer[i]=spi_io_byte(0xFF); //循环读数 } CS3 = 1; //取消片选 }
写
void SPI_EEPROM_Write(u8* pBuffer,u16 WriteAddr,u8 NumByteToWrite) { u8 i; SPI_EEPROM_Write_Enable(); //写使能 CS3 = 0; //使能器件 spi_io_byte(WRITE); //发送写命令 spi_io_byte((u8)((WriteAddr)>>8)); //发送16bit地址 spi_io_byte((u8)WriteAddr); for(i=0;i<NumByteToWrite;i++) spi_io_byte(pBuffer[i]); //循环写数 CS3 = 1; //取消片选 SPI_EEPROM_Wait_Busy(); //等待写入结束 }
IIC
延时
void delay5us(void) {//_nop_(); //加上这句就是6us}
启动S信号
void IIC_START(void) { SDA = 1; SCL = 1; delay5us(); SDA = 0; delay5us(); SCL = 0; }
停止P信号
void IIC_STOP(void) { SDA = 0; SCL = 1; delay5us(); SDA = 1; delay5us(); //SCL = 0; }
有效响应信号ACK
void IIC_ACK(void) { SDA = 0; SCL = 1; delay5us(); SCL = 0; }
非响应信号NACK
void IIC_NACK(void) { SDA = 1; SCL = 1; delay5us(); SCL = 0; }
向从机发一字节
bit IIC_WriteByte(unsigned char d) { unsigned char i; bit ack; for(i=0;i<8;i++) { if( (d<<i)&0x80 ) IIC_NACK(); //发送“1” else IIC_ACK(); //发送“0” } SDA = 1; //释放数据线 SCL = 1; delay5us(); ack = SDA; //读取ACK //delay5us(); SCL = 0; return(ack); //返回ACK信息 }
向从机读一字节
unsigned char IIC_ReadByte(void) { unsigned char i,d; d = 0; SDA = 1; //释放数据线 for(i=0;i<8;i++) { SCL = 1; delay5us(); if(SDA) d += (1<<(7-i)); SCL = 0; //delay5us(); } return d; }
喂狗
max813
watchdog_feed( ) { unsigned int i; P1.6 = 1; for(i=0;i<100;i++); P1.6 = 0; }
ADDA
PCF8591
AD
unsigned char PCF8591_AD(void) { unsigned char adv; IIC_START(); if( IIC_WriteByte(PCF8591W+1) ) return error; adv = IIC_ReadByte(); IIC_ACK(); adv = IIC_ReadByte(); IIC_NACK(); IIC_STOP(); return adv; }
DA
unsigned char PCF8591_DA(unsigned char com,unsigned char dav) { IIC_START(); if( IIC_WriteByte(PCF8591W)) return error; if( IIC_WriteByte(com) ) return error; if( IIC_WriteByte(dav) ) return error; IIC_STOP(); return ok; }
中断
设置
EA = 1; TH0 = (65536-50000)/256; TL0 = 65536-50000; TMOD = 0x51; ET0 = 1; TR0 = 0; //定时器0 IT0=1; EX0=1; //中断0-暂停按键0 IT1=1; EX1=1; //中断1-停止归零按键1 Init_MAX7219(0x0F,0xFF,0x07); ET1=1; TR1=1; TH1=TL1=0xff; //定时器1改中断 PT1=1; PT0=0; //定时器1>定时器0
中断
响应条件
中断源提出申请
总允许EA开
中断申请允许位为1
没有正进行的高级/同程中断子程
当前指令结束
标志位清除
TF0、TF1
入中断自动清
IE0、IE1
边沿入中断自动清
低电平在子程清除申请,管脚1
TI、RI
软件清0
按键
void Button0(void) interrupt 0 //开始/暂停计时 { judge=1; TR0=~TR0; Fcircle=~Fcircle; } void Button1(void) interrupt 2 //停止计时,归零 { char i; TR0=CS=S=M=0; for(i=0;i<6;i++) {MSCS[i]=0;} judge=1; Fcircle=0; }
计时改按键
void Button2(void) interrupt 3 //分段计时,定时1改按键中断 { TH1=TL1=0xff; // judge=~judge; if(judge) { judge=0; MSCS[0]=M/10; MSCS[1]=M%10; MSCS[2]=S/10; MSCS[3]=S%10; MSCS[4]=CS/10; MSCS[5]=CS%10; } else {judge=1;} }
秒表
计时
void Timer0(void) interrupt 1 //计时0 { TH0 = (65536-10000)/256; TL0 = 65536-10000; CS++; //时间刷新 if(CS>=100) { CS=0; S++; if(S>=60) { S=0; M++; if(M>=60) {M=0;} } } }
查询模式
子主题
键盘
uchar key_wat() //键盘检测 { uchar o=0,i=0,m; while(1) { if(key_2_flag&&key_flag==0){key_2_flag=0;break;} P1=(~(0x10<<i))|0x0f;//P1的赋值与读取,测哪个键按下 i++; if(i>3)i=0; _nop_(); if((~P1)&0x0f) { m=P1; while(1)//按下之后循环检测,测到松手代表按了一次 { if((~P1&0x0f)==0) { o=1; break; } } if(o==1)break; } } return m; }
汇编
51指令系统
44助记符
数据传送
MOVC
访问片内外ROM
MOVX
访问片外RAM
MOV
片内RAM
算术运算
逻辑运算
位操作
控制转移
操作数、符号
7寻址方式
111指令
255指令
A5×
堆栈
MOV SP,#60H
建立堆栈
PUSH A
压入栈
PUSH B
POP direct
弹出
DPTR
MOVX A,@DPTR
外部RAM地址@DPTR单元读到A
MOVX @DPTR,A
A内容写到外部RAM地址@DPTR单元
MOVC A,A+@DPTR
基址+变址方法读程序存储器内表格常数
DPTR基址,A变址
完成两路DA同步传输
MOV DPTR, #0DFFFH MOV A, #data1 MOVX @DPTR, A MOV DPTR, #0BFFFH MOV A, #data2 MOVX @DPTR, A MOV DPTR, #7FFFH MOVX @DPTR, A
指向0832(1)输入锁存器 打他1送入0832(1)输入锁存器 指向DAC0832(2)输入锁存器 data2送入0832(2)输入锁存器 同时启动0832(1)(2) 完成DA转换输出
8路模拟信号轮流采样,存储
MAIN:MOV R1, #DATA MOV DPTR, #7FF8H MOV R7, #08H LOOP:MOVX @DPTR, A HER: JB P3.3, HER MOVX A, @DPTR MOV @R1, A INC DPTR INC R1 DJNZ R7, LOOP
置数据区首地址 指向0通道 置通道数 启动A/D转换 查询A/D转换结束 读取A/D转换结束 存储数据 指向下一个通道 修改数据区指针 8通道转换完没?
调用
MOVC
ROM
MOVX
片外RAM
跳转
JMP
JNC
AB
INC A
A内容+1
ADD A,#data
(A)+#data 操作
MUL A B
(A)×(B)
DIV A B
(A)÷(B)