主要用来做控制的,如果要驱动外部设备的话,需要使用驱动电路
proteus 模拟
51 8位
晶振电路-----提供时钟 12M(方便计算机器周期) 11.0592M(非常适合串行通信,设置波特率的时候误差是0)
复位电路------提供系统复位(手动复位)-----(上电自动复位)
电源电路-----供电电压(51漏极开路,要输出高电平要外接上拉电阻)
只能实现单片机的正常运行
如果需要烧写就要加上-----下载电路
不是说一定要到5V才算是高电平,也不是0V才是低电平,有一个临界电压,在临界电压之上就算是高电平,之下就是低电平。
高电平,低电平,高阻态
sbit LED1 = P2^0;
typedef unsigned char u8; 0~127
typedef unsigned int u16; 0~65535
是通用输入输出端口的简称,可以通过软件来控制其输入和输出
循环左移函数 _crol_(起始位,移动几位)
LED_PORT=~(0x01<
移位的话,左移补0 右移:正数补0,负数补1
使用函数的话:缺省的位是循环的
LED_PROT=~(0x01);
LED_PROT=_crol_(LED_PORT,1);
循环右移函数 _cror_
无源蜂鸣器(稍大,需要一定频率的脉冲信号)(改频率改音调)
压电式蜂鸣器
有源蜂鸣器(稍小)(音调一般改变不了)
电磁式蜂鸣器
驱动通常需要30mA 通常IO口不足,不会直接使用IO管脚进行驱动
可以使用一些放大电路(三极管)(如果是无源蜂鸣器,即使三极管导通,不给一定频率的脉冲信号,蜂鸣器也不会有声音)
发光二极管
共阳极数码管 单片机电压无法驱动,要外接
共阴极数码管
静态数码管(不推荐)
动态数码管
位选
段选(a-g-dp)
三八译码器----74HC138
一个数码管显示之后,要进行消影 SMG_A_DP_PORT=0x00;//消影
把上一次的数码管赋值的有效对下一个数码管赋值的影响。
行列式
线翻转
先传高位再传地位
如果要使用IO扩展的时候,要是OE和GND相连,使芯片工作
SER 数据寄存器
SRCLK 移位寄存器时钟的输入引脚(高低电平转换传输数据)
RCLK 存储寄存器时钟的输入引脚
通过第九引脚QH进行多个IO的扩展
是由发光二极管排列组成的显示器件
使用595芯片进行控制
用于驱动大功率器件(电灯,显示屏)
不仅可以用来驱动直流电机,还可以驱动步进电机。
由七对达灵顿管(NPN)
左右两边相当于一个非门的操作,左边输入是1,右边输出0
但是左边是低电平,右边不会变成高电平。
可以输出低电平,不能输出高电平(如果要输出高电平的话,要外接上拉电阻)
直流单机能将直流电能转换成机械能
需要知道直流电机的额定电压和额定功率。
是将电脉冲信号转变成角位移或线位移的开环控制元件
转速,停止的位置-----只取决于脉冲信号的频率和脉冲数
一个脉冲使电机转动一个步距角
单极性步进电机------五线四相步进电机
双极性步进电机-------四线双极性步进电机
技术指标:静态:
相数---电机里的线圈数
拍数----转一圈所需要的脉冲数
步距角----一个脉冲信号驱动电机转动的角度
定位转距-----不通电状态所在的位置
静转矩
TC1508S芯片驱动
分时操作、实时响应、可靠性高
中断嵌套
只要是51的芯片就一定会有INT0、INT1,T1、T2、串口
INT0、INT1、INT2、INT3
中断响应条件:
1、中断源有中断请求
2、中断源允许位为1
3、CPU开中断
例如:
中断0:
EA=1; //打开总中断
EX0=1; //开外部中断0
IT0= 0/1; //设置中断的触发的方式
void exti0() interrupt 0 -------中断0的入口是0 //1是定时器0的入口
{
//功能代码
}
中断1
EA=1; //打开总中断
EX1=1; //开外部中断0
IT1= 0/1; //设置中断的触发的方式
void exti1() interrupt 2 ------中断1的入口是2
{
//功能代码
}
1、配置TCON的IT0为1或为0
2、EX0(允许位)
3、EA(总中断)
TCON的 INT0 =1----下降沿触发
=0----低电平触发
IE---EX0和EA
EA控制总中断
每个中断的优先级可以通过软件设置(一般不修改)
T1、T2、T3、T4
溢出请求,进入中断
1、振荡周期
2、状态周期
3、机器周期
4、指令周期
外接晶振为12MHz时,51单片机相关周期的具体值为
振荡周期=1/12us 状态周期=1/6us 机器周期=1us 指令周期1~4us
TF1、TF0:分别是定时器1、定时器0的溢出标志位。当定时器x计满溢出时,由硬件使TFx位置“1”,并申请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。
TR1、TR0:分别是定时器1、定时器0的运行控制位。由软件清“0”关闭定时器。当GATE=1,且INTx为高电平时,TR置“1”启动定时器;当GATE=0,TRx置“1”启动定时器。
IE1、IE0:分别为外部中断1、外部中断0的请求标志位。
IT1、IT0:分别为外部中断1、外部中断0的触发方式选择位。当ITx=0,为低电平触发方式;当ITx=1,为下降沿触发方式。
高八位和低八位T1 T0
GATE一般设为0,启动通过TR0进行控制
C/T 设为1---是计数模式 0----为定时模式
TMOD----确定工作方式
TCON----高四位定时器控制位(停止、启动、溢出)
第四位外部中断
1、对TMOD赋值,确定T0和T1的工作方式
2、根据所要定时的时间计算初值,并将其写入TH0、TL0、TH1\TL1
3、如果使用中断,要EA
4、使TR0或TR1置位,启动定时/计数器
例如:
void time0_init(void)
{
TMOD|=0X01; //选择为定时器0模式,工作方式1
(这里使用或运算,可以不影响高八位)
TH0=0XFC; //给定时器赋初值,定时1ms
THL=0X18;
ET0=1; //打开定时器0中断允许
EA=1; //开总中断
TR0=1; //打开定时器
}
void time0() interrupt 1
{
static u16 i = 0;
TH0=0XFC; //进入中断服务程序之后重新赋初值
THL=0X18;
i++;
if(i==1000)
{
LED1=!LED1;
i=0;
}
}
通常用TXD RXD SGND---设备之间要接地
RS232标准 1 -3~ -15V
0 +3 ~ +15
单片机一般用TTL标准 1 5V
0 0V
通信设备要共GND
尽量使用11.0592M
数据寄存在SBUF
波特率计算靠TH1和TL1里面的数据
在使用串口的时候,要打开定时器1,工作在模式2(自动重载)
接收完毕RI硬件置1 ,进入中断服务函数之后软件将RI清零
发送完毕TI硬件置1 ,进入中断服务函数之后软件将TI清零
方式0 fosc/12
方式1 (2^SMOD/32)*(T1溢出率)----溢出率=foc/12/(256-初值)
开发工具里有一个波特率计算
串口初始化步骤
1、确定T1的工作方式(TMOD寄存器)-----定时器1--工作方式2(八位重载)
2、确定串口工作方式(SCON寄存器)
3、计算T1的初值(设置波特率),装载TH1、TL1
4、启动T1(TCON中的TR1位)
5、如果使用中断,需要启动串口中断控制位(IE寄存器) ES=1;EA=1
例如:
void uart_init(u8 baud)------baud用来设置波特率
{
TMOD|=0x20 //设置定时器1工作方式2
SCON=0X50 //设置串口为工作方式1
PCON=0X80 //波特率加倍
TH1=baud //设置计数器初值
TL1=baud
ES=1 //打开接受中断
EA=1 //打开总中断
TR1=1 //打开定时器
}
void uart() interrupt 4
{
u8 dat = 0;
RI=0;
dat = SBUF;
SBUF=dat;
while(!TI);
TI=0;
}
SCL
支持多主机多从机的连接模式
没个设备都有一个独立的地址
接了上拉电阻,空闲状态处于高电平
多个主机需要占用总线时,使用仲裁方式决定哪个设备占用总线
三种传输模式 标准100kbps/s 400k 3.4m
SCL高电平时要求数据稳定
先传高位,再传低位
一次传九位(八位数据位,一位应答位)
芯片掉电不消失
App------存放外设的一些驱动文件
Obj-----生成的乱七八糟的文件
Public----各个单片机都能使用的文件
User------用户的主函数
#include"intrins"
左移右移函数
可以使用nop() 进行延时,一个nop()代表一个机器周期,在12M晶振中相当于延时了1us
涓流充电(是用来弥补电池在充满电后由于自放电而造成的容量损失。一般采用脉冲电流充电来实现上述目的。为补偿自放电,使蓄电池保持在近似完全充电状态的连续小电流充电。又称维护充电。)
读一次得到最低位 temp
读八次
value=(temp<<7)|(value>>1)
或者
dat>>1;
if(读取是1)
dat |=0x80
读取的是0,不管他,直接继续循环进行移位,左边会补0
读一次得到最高位 temp
读八次
value+=temp
value<<1
NEC协议:
没有接收到脉冲信号的时候为高电平
采样,保持,量化,编码
采样保持电路
直接比较:逐次逼近型ADC、并行的ADC
间接比较:双积分型ADC
板子上接了AD1 电位器、 NTC1 热敏传感器、 GR1 光敏传感器,
通常使用PWM(脉冲宽度调制)模拟
使用占空比模拟输出模拟信号
带字库的
TFTLCD(彩屏)
薄膜晶体管液晶显示器
图片取模,加const(常量)-----使其存放在flash中
触摸屏:
电阻式触摸屏 精度高,稳定性好,价格低------工业上
容易被划伤,透光性不好。 不支持多点触摸,
电容式触摸屏 人体感应进行触点检测
表面式电容触摸屏----单点触摸
投射式电容触摸屏----多点触摸,寿命长,灵敏度高
在Keil 51中,code修饰的变量放在ROM(Flash)中,而const修饰的变量为只读(不可修改),放在RAM中!可以用“code const”修饰变量,表示变量存储在ROM中,且为只读,由此看来“code”与“code const”修饰变量有一样的功用。
Keil MDK中的const与code
在Keil MDK中,如进行STM32的开发,code修饰符无法使用,使用的话会报错。那么要怎么来修饰存放在ROM中的变量?此时是用到const,用const修饰的变量是存放在ROM中的。
总结,注意不同编译器对于const与code的规定。code一般用于51中,而const应用则非常广泛,注意其在不同的编译环境中表现的数据存储位置。
定义的时候加这个,可以把数据存放到外部存储区里
NC--------不通电处于常闭
NO-------不通电是处于常开
半双工
有且只有一个主机,剩下的全是从机
烧录器是用来将特定格式的程序文件(比如*.hex *.bin等格式)烧进单片机的内部EEPROM,使其上电后能运行你烧入的程序。也就是说你每次修改完程序需要验证的时候都得烧一次芯片,然后接到板子上,再上电运行,而且不支持多种调试方式。
仿真器是通过硬件和相应的软件对单片机进行仿真,可以直接接在用户板上运行程序,还可以进行程序调试(单步、断点等),它不需要每次修改程序都烧写芯片,更没有来回拆、装芯片的麻烦,是学习单片机极其方便的工具。不过一般情况下,价格较高。