51单片机记录

电平特性

(本课程中)定义单片机为TTL电平

高+5V 低 0V

RS232电平:计算机串口

高-12V 低+12V

※掌握二进制转16进制

二进制数的逻辑运算

"与"运算是实现"必须都有,否则就没有"运算符"·"---"&"有0则0

例:0·0=0;0·1=1·0=0;1·1=1

规律:两数相同是1,反之0;

"或"是实现"只要其中之一有,就是有"+" 有1则1

例:0+0=0; 0+1=1+0=1; 1+1=1

规律:两数有1结果1,反之0;

"非"是实现"求反"这种逻辑运算符号变量A---"A"上有横线

例子:!1=0 !0=1

规律:前1后0,前0后1(反着来)

"异或"运算时实现"必须不用,否则就没有",符号-"⊕"

例子:0⊕0=0;0⊕1=1;1⊕0=1;1⊕1=0

规律:两数相同0,不同1

|= 运算:

int a = 5; // 0000 0101

int b = 3; // 0000 0011

a |= b; // 0000 00111 // a = a | b 只要一竖行有1 结果就是1

例: 0000 0101

0000 0011

=0000 0111

}

80C51是MCS-51-----STC 89 C 52 RC40C-PDIP0721CV4336

STC:公司

89:系列民

c:CMS

52:系列名(51,54,55) 2(在乘4k)表示内部储存空间=8k

40:表示运行速度40HZ

C:表示商业级(工作温度不同)

PDIP:封制格式

0721:07年21周(生产日期)

80C51的引脚

总线型P:P1.0~P1.7~~P3.0~P3.7

非总线型:P1 P3

C-51

sft:特殊功能寄存器声明

sft16:sfr的16位数据声明

sbit:特殊功能声明

bit:位变量声明

例子;

sfr SCON=0X98;

sfr16 T2=0xCC;

sbit OV=PSW^2;

C语言

头文件:reg51.h,reg52.h,math.h,ctype.h,stdio.h,stdlib.h,absacc.h

常用有:reg51.h,reg52.h---(定义特殊功能寄存器和位寄存器)

数学运算:math.h

单片机最小系统运行条件

1.电源 2.晶振 3.复位电路

对单片机任意IO口随意操作

1.输出控制电平高低 2.输出检测电平高低

定时器:重点掌握最常用的方式2

中断:外部中断,定时器中断,串口中断

串口通信:单片机之间,单片机与计算机间

电路延时

//定义一个变量

unsigned int a;

void main(){

a=50000;

P1_1=0;

//延时,到a=0

while(a--);

a=5000;

p1_1=1;

//延时,到a=0

while(a--)

}

流水灯:crol (改变变量,向左移步幅)----intrins.h

010101 变成 101010 (步幅1)

引脚

RST引脚:复位引脚--高电平有效。加上大于两个机器周期----复位操作(指针到0)。一般加0.5V低电平。备用电源(Vpd)--加备用电源

TXD引脚

常用函数

//头文件

#include <reg52.h>

#include <intrins.h> //机器周期_nop_()

#define GUI_P0 P0

//位定义

sbit LED1=P1^0;

sbit LED2=P1^1;

sbit LED3=P1^2;

sbit LED4=P1^3;

sbit LED5=P1^4;

sbit LED6=P1^5;

sbit LED7=P1^6;

sbit LED8=P1^7;

//延时

typedef unsigned int u16; //对数据类型进行声明定义

typedef unsigned char u8;

void ys(u16 i)

{

while(i--);

}

流水灯:

方法1:

流水灯:crol (改变变量,向左移步幅)----intrins.h

010101 变成 101010 (步幅1)

方法2:

LED=(0x01<<i) 二进制左移

静态晶体管

u8 code smgduan []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//code 是 放在程序储存区

动态晶体管

void DigDisplay()

{

u8 i;

for(i=0;i<8;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//显示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//显示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位

}

P0=smgduan[i];//发送段码

delay(100); //间隔一段时间扫描

P0=0x00;//消隐

}

}

二进制--- ※注意 二进制是从右向左的(如果是第一个0xfe是第一个引脚为低电平)

0xfe //11111110

0xdf //11111101

0xfb //11111011

0xf7 //11110111

0xef //11101111

0xdf //11011111

0xbf //10111111

0x7f //01111111

74HC165芯片

位定义

sbit PIN_PL_SH_P16=P1^0; // SH/LD

sbit PIN_Date_QH_P17=P1^1; // QH 数据输出

sbit PIN_CLK_P36=P1^2; // 时钟拐角

LD引脚为低电平时,A-H置入寄存器,LD为高电平时,置数功能被禁止。

CLK有一个为低电平并且SH为高电平,另一个时钟可以输入。

CLK有一个为低电平并且SH为低电平,另一个时钟禁止。

步骤:

{

(1)SH输入低电平 LD=0;

(2)置入A-H位,延时一个周期

(3)SH输入高电平

(4)延时一个周期

}

循环读发来的数据 8次{ ---一个时钟低电平(收数据)高电平(停止)

(5)时钟低电平

(6)延时一个周期

(7)QH传入一位与上一位组成一个十六进制 |=

(8)时钟高电平

}

74H595芯片

位定义

sbit STCP_SRC_P10=P1^0; //STCP(12)RCLK----存储寄存器(12)

sbit SHCP_SC_P11=P1^1; //SHCP(11)----------移位寄存器(11)

sbit DS_SE_P12=P1^2; //DS(14)------------串口输入(14)

当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在STCP 上升沿输出到并行端口。

数据的移位:

{

循环8次i

SE_DS=date>>7 //最低位到最高位 1010 1010 --右移-- 0000 0001

date=date<<1 //保证下次Date去掉一位

SHCP=0; //低电平
nop ();
nop (); //机器周期

SHCP=1; //上升沿 1位数据进入移位寄存器

跳出循环

STCP=0; //低电平,放到存储器(数据到并口)
nop ();
nop (); //机器周期

STCP=1; //数据由寄存器传入并行端口

}

中断系统

中断源

/INT0 (IE0) 0003H 外部中断0 P3.2引脚低电平或下降沿信号 0 高

T0 (TF0) 000BH 定时器0中断 定时/计数器0计数回溢出 1 |

/INT1 (IE1) 0013H 外部中断1 P3.3引脚低电平或下降沿信号 2 |

T1 (TF1) 001BH 定时器1中断 定时/计数器1计数回0溢出 3 |

TI,RI (RI和TI)0023H 串口完成一帧数据发送或接收引起的中断 4 低

中断相应条件
中断院有中断请求
此中断源的中断允许位为1;
CPU开中断(即EA=1)
以上三条同时满足,CPU才可能相应中断。  

例:	void 函数名() interrupt 0 using 1
{

}
解释  
void 函数名() interrupt 0(中断号) using 1(using 1 可省略)

配置

IT0的配置

void open_ZD_PIN(){

//配置INT0

IT0=1; //触发方式(下降沿)

EX0=1;//是否允许中断

EA=1;//打开总中断

}

IT1的配置

void open_ZD_PIN(){

//配置INT1

IT1=1; //触发方式(下降沿)

EX1=1;//是否允许中断

EA=1;//打开总中断

}

CPU时序有关知识

震荡周期(1/12us):单片机提供定时信号的震荡源的周期---12MHZ晶振 震荡周期=12 的 倒数

状态周期(1/6us):2个振荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期

机器周期(1us):1个机器周期含6个状态周期,12个震荡周期。

指令周期(1~4us):完成1条指令所占用的全部时间,它以机器周期为单位

1个机器周期(1us--1微秒)=6个状态周期=12个震荡周期
定时器/计数器0

计数回溢出时:计数器值-计数初始值=计数值

TCON--控制寄存器控制T0,T1的启动和停止设置溢出标志
GATE--门控位,GATE=0
C/T--模式选择:为0时为定时模式,为1时为计数模式
TMOD--工作方式寄存器(工作方式和功能)
初值计算:X=65536-N  

使用定时器,该做哪些工作
1.对TMOD赋值,以确定T0和T1的工作方式
2.计算器初值,并将其写入TH0,TL0或TH1,TL1
3.中断方式时,对EA赋值,开放定时器中断
4.使TR0或TR1置为,启动定时/计数器定时或计数

TMOD配置

89H寄存器 低四位 T0; 高四位 T1

CATE:门控位
GATE=0 (软控TR0或TR1为1,可)※
GATE=1 (软控TR0或TR1为1,且INT0/1为高电平,可)

C/T:定时/计数器模式选择位
C/T=0为定时模式※  C/T=1为计数模式
M1 和 M0 位
00  方式0  13位定时/计数器
01  方式1  16位定时/计数器  	※
10  方式2  8自动重装位定时/计数器
11  方式3  T0分成两个独立的8位定时/计数器,T1方式停止计数
常用配置:TMOD|=0x01	(或运算,不影响其他位)

TH0 TL0 位
初值计算:X=65536-N  
例子:x=65536-1000(1s)=64536=0xfc18
分解为4位2对 8个
TH0=0xfc
TL0=0x18

计时器配置

定时器1(中断编号1):

{

TMOD|=0x01; //T0和T1的工作方式(方式1)

TH0=0XFC; //延时1秒

TL0=0X18; //延时1秒 1s=0xfc18

ET0=1; //打开定时器中断开关

EA=1; //总中断

TR0=1; //打开定时器

}

定时器2(中断编号3):

{

TMOD|=0x01; //T0和T1的工作方式(方式1)

TH1=0XFC; //延时1秒

TL1=0X18; //延时1秒 1s=0xfc18

ET1=1; //打开定时器中断开关

EA=1; //总中断

TR1=1; //打开定时器

}

串口通信

设置串口

void UsartInit()

{

SCON=0X50; //设置为工作方式1

TMOD=0X20; //设置计数器工作方式2

PCON=0X80; //波特率加倍

TH1=0XF3; //计数器初始值设置,注意波特率是4800的

TL1=0XF3;

ES=1; //打开接收中断

EA=1; //打开总中断

TR1=1; //打开计数器

}

串口中断: 传入:1.SBUF传入变量 2.清空RI=0接受中断

传出:1.变量传入SBUF 2.等待while(!TI)数据发送完成 3.清除TI=0发送完成标志位

void Usart() interrupt 4

{

u8 receiveData; //数据寄存

receiveData=SBUF; //出去接收到的数据

RI = 0; //清除接收中断标志位

SBUF=receiveData; //将接收到的数据放入到发送寄存器

while(!TI); //等待发送数据完成

TI=0; //清除发送完成标志位

}

RS485通信: 1.A→A B→B

2.DIR端口位定义://RS485DIR=0为接收状态 RS485DIR=1为发送状态

void Usart() interrupt 4

{

u8 receiveData;

receiveData=SBUF; //出去接收到的数据

RI = 0; //清除接收中断标志位

delay(100); //保证接受数据完整

RS485DIR=1; //端口置1;进入发送数据

SBUF=receiveData; //将接收到的数据放入到发送寄存器

while(!TI); //等待发送数据完成

TI=0; //清除发送完成标志位

RS485DIR=0; //端口置0;进入接受数据

}

I^2C串行总线

I^2C总线,单中线,SPI 等待while

I^2C总线进行数据传递时,

时钟信号位高电平期间,数据线上的数据必须保持稳定

时钟信号位低电平期间,高低电平允许变化

a,主机向从机发送数据,数据方向在整个过程中不变
A表示应答	A非表示非应答(高电平)	S表示起始信号	P表示终止信号
S(→)	从机地址(→)  0(→)	A(←)	数据(→)  A(←)	数据(→)   A/A(←)	P(→)
A表示应答	A非表示非应答(高电平),S表示起信号,P表示终止信号

I^2C总线协议,采用7位寻址字节(寻址字节是起始信号的后一个字节)
1.寻址字节的位定义
	7	6	5	4	3	2	1	0
	←--------从机地址-------→	R/W
	D7-D1 从机地址	D0 是数据传输方向(0:主 向 从写数据,1:主 向 从读数据)
 

void ZD_DSQ() interrupt 1
{
	TH0=0X0D8;  //延时1秒  
	TL0=0X0F0;  //延时1秒  1s=0xfc18  
	count++;  
	if(count<40)
	LED=1;
	else LED=0;
	if(count=100)count=0;
}
相关推荐
Java Fans2 小时前
嵌入式软件在电子烟开发中的应用
嵌入式硬件
环能jvav大师4 小时前
使用Ubuntu系统+VS Code开发STC51单片机
linux·c语言·开发语言·单片机·嵌入式硬件·ubuntu
q4725994515 小时前
UART通过DMA接收和发送,使用环形缓冲区,状态机的使用
stm32·单片机·嵌入式硬件
你也喜欢吃香菜嘛5 小时前
STM32主从定时器输出个数、频率可调的脉冲
stm32·单片机·嵌入式硬件
亿道电子6 小时前
【ARM】MDK-Functions界面设置
arm开发·stm32·单片机
Gui林9 小时前
【GL08】STM32--ADC/DAC
stm32·单片机·嵌入式硬件
sukalot10 小时前
windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(四)
windows·单片机·嵌入式硬件
RIGOL小普10 小时前
如何用李萨如图形测正弦信号的频率?若不使用李萨如图形,如何用示波器测交流信号频率?
单片机·嵌入式硬件·fpga开发·硬件工程·射频工程
charlie11451419115 小时前
STM32 从0开始系统学习2
stm32·嵌入式硬件·c·1024程序员节·arm架构·寄存器映射
乌南竹1 天前
STM32外设应用
stm32·单片机·嵌入式硬件