单片机笔记汇总.docx
《单片机笔记汇总.docx》由会员分享,可在线阅读,更多相关《单片机笔记汇总.docx(25页珍藏版)》请在冰点文库上搜索。
单片机笔记汇总
第一章
1.1数制定义
十进制:
0,1,2,3,4,5,6,7,8,9D逢十进一
二进制:
0,1B逢二进一
八进制:
0,1,2,3,4,5,6,7O逢八进一
十六进制:
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,fH逢十六进一
1.2数制转换
十进制->二进制
256
128
64
32
16
8
4
2
1
2^8
2^7
2^6
2^5
2^4
2^3
2^2
2^1
2^0
56=2^5+2^4+2^3=00111000=38H
48=2^5+2^4=00110000=30H
1.3有符号数
最高位正0负1
正数原码=正数反码=正数补码
负数原码-111
原码11101111
负数反码10010000
负数补码10010001(最后一位+1)
1.2.3(书本P6)
位bit二进制中的一位
字节Bbyte1B=8bit
字word1w=2B
双字字长为16
1.2.4BCD(以二进制表示十进制)
56D->01010110BCD
79D->01111001BCD
1.2.5ASCII
a=61HA=41Hk=6BH
第二章
用proteus画图的步骤
1.启动ISI模块
2.选取原件
3.摆放原件
4.编辑原件属性
5.编辑原件文本属性
6.原理图布线
计算机系统=硬件系统+软件系统
冯氏结构硬件系统
CPU=AU(运算器)+CU(控制器)
I->M->O
2.1.1单片机硬件结构
MCS-51单片机内部基本结构
1KB=2^10B
1MB=2^20B
1GB=2^30B
1TB=2^40B
2.2.2程序存储器
80C51型单片机且程序长度不超过4KB,则无须扩展片外ROM
2.2.3数据存储器
数据存储器在物理上和逻辑上都占有两个地址空间:
一个是片内256B的RAM,另一个是片外最大可扩充64KB的RAM
2.3单片机的复位、时钟与时序
复位SPstackpointer0000011107H
程序计数器PC0000H
P0~P311111111FFH高阻
2.3.2时钟电路
单片机执行指令的过程可分为取指令、分析指令和执行指令三个步骤
2.3.3单片机时序
(1)时钟周期
晶振或外加振荡源的振荡周期称为时钟周期
(2)状态周期
1个状态周期等于2个时钟周期
(3)机器周期
1个机器周期等于6个状态周期
(4)指令周期
执行一条指令所需要的时间称为指令周期
小结:
P0~P3都可作为准双向通用I/O口,其中只有P0口需要外接上拉电阻(加电阻降压,增加驱动);在需要扩展片外设备时,P2口可作为其地址线接口,P0口可作为其地址线/数据线复用接口,此时它是真正的双向口。
P2口(高8位)与P0口(低8位)共同组成16位地址
/*功能:
流水灯(4个灯流)*/
#include//调用库文件
#defineuintunsignedint//宏定义无符号整型
//定义全局变量
//定义子函数(延时函数)
voiddelay(uinttime)
{uinti;
for(;time>0;time--)
for(i=0;i<125;i++);
}
voidmain()
{
P0=0xff;//11111111设备初始化
delay(10);
P0=0xf0;//11110000低位灯亮4位
delay(500);
while
(1)
{uinti;
for(i=1;i<=1;i++)
{
P0<<=4;
P0|=0x0f;
delay(100);
}
for(i=1;i<=1;i++)
{
P0>>=4;
P0|=0xf0;
delay(100);
}
}
}
1.keilC设计软件程序的步骤
(1)安装
(2)project->选(80C51BH)->File-save(以.c为扩展名)->Addgroup-泡泡生成.hex
2.Hex->硬件仿真图->电路板
系统工程
建立模型
1.硬件设计-最小系统
2.软件设计-逻辑算法
3硬软联掉
流水灯设计过程
流水灯LED
1.LED工作原理正向导通
2.编程方法:
初始化->开始工作(启动)->有条件工作(算法,逻辑)->最后停止(定时)
3.实验箱:
下载程序ROM烧录
(1)选芯片
(2)端口
(3)文件程序
(4)下载
数码管(输出设备)
1.功能:
显示数字、字符
2.原理:
七段LED或八段(加上小数点)
3.分类:
共阳:
串联+5V电压
共阴:
串联地
共阳极(共阴极加~就可以了)
dp
g
f
e
d
c
b
a
0
1
1
0
0
0
0
0
0
0xc0
1
1
1
1
1
1
0
0
1
0xf9
2
1
0
1
0
0
1
0
0
0xa4
3
1
0
1
1
0
0
0
0
0xb0
4
1
0
0
1
1
0
1
0
0x99
5
1
0
0
1
0
0
1
0
0x92
6
1
0
0
0
0
0
1
0
0x82
7
1
1
1
1
1
0
0
0
0xf8
8
1
0
0
0
0
0
0
0
0x80
9
1
0
0
1
0
0
0
0
0x90
A
1
0
0
0
1
0
0
0
0x88
b
1
0
0
0
0
0
1
1
0x93
C
1
1
0
0
0
1
1
0
0xc6
d
1
0
1
0
0
0
0
1
0xa1
E
1
0
0
0
0
1
1
0
0x96
F
1
0
0
0
1
1
1
0
0x9e
#include
#defineuintunsignedint
sbita=P2^2;//38译码器的输入端之一A
sbitb=P2^3;//38译码器的输入端之一B
sbitc=P2^4;//38译码器的输入端之一C
charduanma1[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f};
//共阳数码管段码值0-9
charduanma2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴极段码值
charduanma3[]={0x06,0,0x38,0x5c,0x1c,0x79,0,0x3e};
//显示ILovEU共阴极段码值
voiddelay(uinttime)//延时子函数
{chari;//局部变量定义
for(;time>0;time--)
for(i=0;i<125;i++);//内循环延时大概1ms
}
voidsmg1()//共阳数码管显示0-9子函数
{chari;
P1=0xff;//初始11111111,全灭
delay(1000);//灭的时间是1s
for(i=0;i<=9;i++)
{
P1=duanma1[i];//显示共阳极段码值
delay(1000);//延时1s
}
}
voidsmg2()
{chari;
P0=0;//00000000段码值为0,共阴数码管灭
delay(10);
for(i=0;i<=7;i++)
{
switch(i)
{
case0:
c=0;b=0;a=0;break;//000,选通Y0,1号管
case1:
c=0;b=0;a=1;break;//001,选通Y1,2号管
case2:
c=0;b=1;a=0;break;//010,选通Y2,3号管
case3:
c=0;b=1;a=1;break;//011,选通Y3,4号管
case4:
c=1;b=0;a=0;break;//100,选通Y4,5号管
case5:
c=1;b=0;a=1;break;//001,选通Y5,6号管
case6:
c=1;b=1;a=0;break;//110,选通Y6,7号管
case7:
c=1;b=1;a=1;break;//111,选通Y7,8号管
}
P0=duanma2[i+2];//共阴极的段码值
delay(10);//动态扫描,延时时间很短
}
}
voidsmg3()//显示ILovEU显示3遍
{chari,m,j;
P0=0;//00000000段码值为0,共阴数码管灭
delay(10);
for(j=1;j<=3;j++)//闪烁3次
{for(m=1;m<=10;m++)//扫描10组
{for(i=0;i<=7;i++)//8个管一组
{
switch(i)
{
case0:
c=0;b=0;a=0;break;//000,选通Y0,1号管
case1:
c=0;b=0;a=1;break;//001,选通Y1,2号管
case2:
c=0;b=1;a=0;break;//010,选通Y2,3号管
case3:
c=0;b=1;a=1;break;//011,选通Y3,4号管
case4:
c=1;b=0;a=0;break;//100,选通Y4,5号管
case5:
c=1;b=0;a=1;break;//101,选通Y5,6号管
case6:
c=1;b=1;a=0;break;//110,选通Y6,7号管
case7:
c=1;b=1;a=1;break;//111,选通Y7,8号管
}
P0=duanma3[i];//共阴极的段码值
delay(10);//动态扫描,延时时间很短
}//i=8个
}//m=10次
P0=0;//数码管全灭
delay(300);
}//j=3次闪烁
}
main()
{
smg3();//只显示3次,不是一直显示
while
(1);
{
//smg1();//调用共阳数码管
//smg2();//调用8位1体共阴数码管
}
}
第5章
5.1中断
1.中断概念
2.中断术语
中断申请->中断响应->中断服务->中断返回
5.2中断控制系统
1.中断申请的中断源(3种)
中断源名称
中断号
外部中断
0
1
定时器
T0
1
T1
3
通信
TX
4
RX
4
2.中断寄存器(4个)
(1)TCON
(2)SCON
(3)IE
(4)IP
中断编程
1.硬件电路
固定接法
按键
2.中断初始化
3.中断服务
#include
#defineuintunsignedint
sbitdeng=P2^0;//变量灯与端口P2.0想通
voiddelay(uinttime)//延时子函数
{
chari;//局部变量定义
for(;time>0;time--)
for(i=0;i<125;i++);//内循环延时大概1ms
}
//中断初始化子函数int0
voidint0()
{
IT0=1;//中断触发方式为负跳动,外部中断0
EX0=1;//允许外部中断0中断
EA=1;//打开总中断
}
//中断服务函数外部中断0
int0_deng()interrupt0//外部中断0的中断号为0
{deng=!
deng;//对后面的deng求反,再传送给deng,再送出给P2.0端口
delay(100);//防止按键抖动
}
main()
{
//1.设备初始化
P2=0xff;//11111111灯灭
P3=0xff;//高电平,高阻抗
delay(100);
//2.中断初始化
int0();//调用外部中断0初始化子函数
//如果有按键按下,产生一个外部中断,系统自动进入中断服务函数
//3.系统开始工作
while
(1);//系统等待
}
#include
#defineuintunsignedint
sbitdeng=P0^4;//变量灯与端口P0.4相通
charduanma2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x58,0x5e,0x79,0x71};//共阴极0-9加AbCdEF
uintjs=0;
voiddelay(uinttime)//延时子函数
{
chari;//局部变量定义
for(;time>0;time--)
for(i=0;i<125;i++);//内循环延时大概1ms
}
//中断初始化子函数int01
voidint01()
{
IT0=1;//中断触发方式为负跳动,外部中断0
EX0=1;//允许外部中断0中断
IT1=1;//中断触发方式为负跳动,外部中断1
EX1=1;//允许外部中断1中断
EA=1;//打开总中断
}
//中断服务函数外部中断0
int0_deng()interrupt0//外部中断0的中断号为0
{
deng=!
deng;//对后面的deng求反,再传送给deng,再送出给P2.0端口
delay(100);//防止按键抖动
}
//外部中断1的中断服务
int1_smg()interrupt2//外部中断1的中断号为2
{
js=js+1;//累加计数的功能
if(js>=16)js=0;//如果大于等于16就为0
P2=duanma2[js];//对应显示计数的段码值
delay(100);//防止按键抖动,保护
}
main()
{
//1.设备初始化
P0=0xff;//11111111灯灭
P2=0;//00000000共阴极数码管灭
P3=0xff;//按键,高电平,高阻抗
delay(100);
//2.中断初始化
int01();//调用外部中断0,外部中断1初始化子函数
//如果有按键按下,产生一个外部中断,系统自动进入中断服务函数
//3.系统开始工作
while
(1);//系统等待
}
1.中断系统工作流程
暂时中止当前工作->转中断申请->进入中断服务->中断返回
2.中断系统的硬件结构组成
8位(统一设置或每一位设置编程)
TCONIT0电平触发
IT1边沿触发
SCON
IEEX0、EX1允许中断
EA总中断允许
IP
3.中断系统软件编程方法
1.调用库文件
2.设备初始化(保护,全灭,高阻)
3.中断初始化(3种中断源5个),可自动调用中断服务
4.系统开始第一个工作
5.继续调用其他工作
#include
#defineuintunsignedint
charkey;
voiddelay(uinttime)
{uinti;
for(;time>0;time--)
for(i=0;i<125;i++);
}
voiddeng_ld()
{chari;
P2=0xfe;
for(i=0;i<7;i++)
{P2<<=1;
P2|=1;
delay(100);
}
for(i=0;i<=7;i++)
{P2>>=1;
P2|=0x80;
delay(100);
}
}
voiddeng_ss()
{P2=0xaa;
delay(100);
P2=0x55;
delay(100);
}
deng[]={0x3c,0x18,0x7e,0x24};
deng_hy()
{chari;
for(i=0;i<=3;i++)
{P2=deng[i];
delay(100);
}
}
deng_0xff()
{P2=0xff;
delay(100);
}
voidint0()
{IT0=1;
EX0=1;
EA=1;
}
voidint0_deng()interrupt0
{key=P0&0x0f;
}
main()
{
P0=0xff;
P2=0xff;
P3=0xff;
delay(10);
int0();
while
(1)
{switch(key)
{case0x0e:
deng_ld();break;
case0x0d:
deng_ss();break;
case0x0b:
deng_hy();break;
case0x07:
deng_off();break;
}
}
}
第6章定时
1.中断源类型
INT0
INT1
T0
T1
TX/TR
0
2
1
3
4
2.外部中断硬件连接
INT0P3.2
INT1P3.3
3.软件编程
定时50ms,数码管变数字
1.硬件连接P3.4P3.5系统内部产生,不连接
2.软件
2.1#库文件、宏定义
2.2全局变量、端口
2.3数组
2.4子函数(延时、流水灯、数码管)
2.5中断初始化子函数
2.6中断服务
2.7主函数
#include
#defineuintunsignedint
uinta=65536-50000*11.0592/12;
charduanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay(uinttime)//延时子函数
{uinti;//局部变量定义
for(;time>0;time--)
for(i=0;i<125;i++);//内循环延时大概1ms
}
chardeng[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
voidT0_ini()
{
TMOD=0x01;//定时器工作方式00000001,T0方式1
TH0=a/256;//计时初值高
TL0=a%256;//计时初值低
ET0=1;//允许T0中断
EA=1;//总中断
TR0=1;//定时开始工作
}
chari=0,count=0,count2=0;
voidT0_smg()interrupt1
{
TH0=a/256;
TL0=a%256;//重新装计数初值//
count=count+1;
if(count==20)//50msX20=1s
{
count=0;i++;
if(i>10)
i=0;
P2=deng[i];
}
}
voidT0_deng()interrupt3
{
TH0=a/256;
TL0=a%256;//重新装计数初值//
count2=count2+1;
if(count2==20)//50msX20=1s
{
count2=0;i++;
if(i>=14)
i=0;
P2=deng[i];
}
}
voidmain()
{
P1=0xff;//数码管全灭
P2=0xff;//灯全灭
P3=0xff;//高阻
delay(100);
T0_ini();//调用
while
(1);
}
1.定时器硬件结构
1.T0P3.4
T1P3.5
16位TH高8位TL低8位
定时器初值a=2^n-t*f/12
2.控制R->TMOD:
设置工作方式方式12^16方式22^8自动重装初值
定时器电子秒表00~59
1.库、宏定义
2.数码管段码值数组定义
3.定义子函数
3.1T0中断初始化子函数
4.T0中断服务函数
5.主函数
5.1设备初始化
5.2T0初始化
5.3
//1.库文件宏定义
//2.定义全局变量
//3.定义数组数码管
//4.定义子函数
//4.1定义T0中断初始化子函数
//4.2定义T0中断服务函数
//5.主函数
#include
#defineuintunsignedint
charcount=0,t=0;
chardm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
uinta=-50000*11.0592/12;
voidT0_ini()
{
TMOD=0x01;
TH0=a/256;
TL0=a%256;
ET0=1;
EA=1;
TR0=1;
}
voidT0_mb()interrupt1
{
count++;
if(count==20)//是否到1s
{
count=0;
t++;
if(t==60)t=0;//是否到60s
}
P0=dm[t/10];
P2=dm[t%10];
}
voidmain()
{
P0=0;P2=0;//共阴数码管灭
P2=dm[0];
P2=dm[0];
T0_ini();
while
(1);
}