51初期简单知识整理及简单程序编写实践
2016-12-03 14:04
411 查看
单片机初期理解
51单片的控制是基于对最底层寄存器的控制而成;
一.基本构成
包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
程序存储器(ROM)
51共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器(ROM)
51有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口
51共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。其中
·Pin20:接地脚。
·Pin40:正电源脚,正常工作或对片内EPROM烧写程序时,接 5V电源。
·Pin19:时钟XTAL1脚,片内振荡电路的输入端。
·Pin18:时钟XTAL2脚,片内振荡电路的输出端。
51的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另
输入输出(I/O)引脚
Pin39-Pin32为P0.0-P0.7输入输出脚,Pin1-Pin1为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚,这些输入输出脚的功能说明将在以下内容阐述。8051时钟电路
Pin9:RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,
RESET/Vpd还是一复用脚,Vcc掉电期间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
5081时钟电路
Pin30:ALE/PROG当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。
如果单片机是EPROM,在编程其间,将用于输入编程脉冲。
Pin29:PESN当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
Pin31:EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。
在编程时,EA/Vpp脚还需加上21V的编程电压。
指令时序:
时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期
8051外部程序存储器读时序
8051外部程序存储器读时序图,从图中可看出,P0口提供低8位地址,P2口提供
P2口锁存器和缓存器结构
P2口作为外部数据存储器或
P1口锁存器和缓存器结构
P3口锁存器结构
P3口的输入输出及P3口锁存器、中断、定时/计数器、串行口和特殊功能寄存器有关,P3口的第一功能,P3口的第二作用
△P3.0串行输入口(RXD)
△P3.1串行输出口(TXD)
△P3.2外中断0(INT0)
△P3.3外中断1(INT1)
△P3.4定时/计数器0的外部输入口(T0)
△P3.5定时/计数器1的外部输入口(T1
△P3.6外部数据存储器写选通(WR)
△P3.7外部数据存储器读选通(RD)
程序存储器()
数据存储器()
内部数据存储器的配置
数据存储器也称为随机存取数据存储器。MCS-51单片机的数据存储器在物理上和逻辑上都分为两个地址空间,一个是内部数据存储区和一个外部数据存储区。MCS-51内部RAM有128或256个字节的用户数据存储,它们是用于存放执行的中间结果和过程数据的。51的数据存储器均可读写,部分单元还可以位寻址。
二.个人实验部分
1.流水灯
2.蜂鸣器
3.继电器
4.静态数码管
5.独立按键
6.ds18b20(可独立编程)
编程:
1#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define led P1
void delay(u16 i)
{while(i--);}
void main()
{ while(1){u8 i;
led=0x01;
delay(50000);
while(1)
{ for(i=0;i<8;i++)
{ led=(0x01<<i);
delay(50000)}}
2#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=p1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(10);
}
}
3#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
P0=~smgduan[0];
while(1)
{
}
}
4#include <reg52.h>
sbit led=P0^0;
sbit k1=P1^0;
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
led=~led;
}
}
}
void main()
{
led=0;
while(1)
{
keypros();
}
}
6.DS18520
定义头文件
#ifndef_temp_H
#define_temp_h
#include <reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
sbit DSPORT=P3^7;
int Ds18b20ReadTemp();
#endif
Temp.c文件
#include <temp.h>
void Delay1ms(uint y)
{
uint x;
for(;y>0;y--)
{
for(x=110;x>0;x--);
}
}
uchar Ds18b20Init()
{
uchar i=0;
DSPORT=0;
i=70;
while(i--);//642us
DSPORT=1;
i=0;
while(DSPORT)
{
Delay1ms(1);
i++
if(i>5)
{
return 0;
}
}
return 1;
}
void Ds18b20WriteByte(uchar dat)
{
uchar i,j;
for(j=0;j<8,j++)
{
DSPORT=0;
i++;
DSPORT=dat&0x01;
i=6;
while(i--);
DSPORT=1;
dat>>=1;
}
}
uchar Ds18b20ReadByte()
{
uint i,j;
uchar bi,byte;
for(j=8;j>0,j++)
{
DSPORT=0;
i++;
DSPORT=1;
i++;
i++;
bi=DSPORT;
byte=(byte>>1)|(bi<<7);
i=4;
while(i--);
}
return byte;
}
void Ds18b20ChangeTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
}
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
}
int Ds18b20ReadTemp()
{
int temp=0;
uchar tmh,tml;
Ds18b20ChangeTemp();
Ds18b20ReadTempCom();
tml=Ds18b20ReadByte();
tmh=Ds18b20ReadByte();
temp=tmh;
temp<<=8;
temp|=tml;
return temp;
}
主函数:
#include <reg52.h>
#include <temp.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=p1^5;
sbit k1=P1^0;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 num=0,disp[4];
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
beep=~beep;
delay(100);
datapros(DS18b20ReadTemp());
DigDisplay();
}
}
}
void datapros(int temp)
{
float tp;
if(temp<0)
{
DisplayData[0]=0x40;
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
DisplayData[0]=0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
DisplayData[1]=smgduan[temp/10000];
DisplayData[2]=smgduan[temp%10000/1000];
DisplayData[3]=smgduan[temp%10000%1000/100]|0x80;
DisplayData[4]=smgduan[temp%100/10];
DisplayData[5]=smgduan[temp%100%10];
}
void DigDisplay()
{
u8 i;
for(i=0;i<6;i++)
{
switch(i)
{
case(0);
LSA=0;LSB=0;LSC=0;break;
case(1);
LSA=1;LSB=0;LSC=0;break;
case(2);
LSA=0;LSB=1;LSC=0;break;
case(3);
LSA=1;LSB=1;LSC=0;break;
case(4);
LSA=0;LSB=0;LSC=1;break;
case(5);
LSA=1;LSB=0;LSC=1;break;
}
P0=disp[5-i];
delay(100);
P0=0x00;
}
}
void main()
{
while(1)
{
keypros();
beep=~beep;
delay(100);
datapros(DS18b20ReadTemp());
DigDisplay();
}
}
51单片的控制是基于对最底层寄存器的控制而成;
一.基本构成
包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
折叠数据存储器(RAM)
51内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。程序存储器(ROM)
51共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器(ROM)
51有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口
51共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
全双工串行口
51内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。折叠中断系统
51具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。折叠时钟电路
51内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。折叠MCS-51的引脚说明
8051引脚图40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。其中
·Pin20:接地脚。
·Pin40:正电源脚,正常工作或对片内EPROM烧写程序时,接 5V电源。
·Pin19:时钟XTAL1脚,片内振荡电路的输入端。
·Pin18:时钟XTAL2脚,片内振荡电路的输出端。
51的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另
输入输出(I/O)引脚
Pin39-Pin32为P0.0-P0.7输入输出脚,Pin1-Pin1为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚,这些输入输出脚的功能说明将在以下内容阐述。8051时钟电路
Pin9:RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,
RESET/Vpd还是一复用脚,Vcc掉电期间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
5081时钟电路
Pin30:ALE/PROG当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。
如果单片机是EPROM,在编程其间,将用于输入编程脉冲。
Pin29:PESN当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
Pin31:EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。
在编程时,EA/Vpp脚还需加上21V的编程电压。
指令时序:
时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期
折叠节拍与状态
我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。折叠机器周期
MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1、S1P2……S6P1、S6P2(定时器那一部分中经常提到片机工作到某个状态),一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHz的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是1us。8051外部程序存储器读时序
8051外部程序存储器读时序图,从图中可看出,P0口提供低8位地址,P2口提供
指令周期
执行一条指令所需要的时间称为指令周期,MCS-51的指令有单字节、双字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器周期不相同,可能包括一到四个不等的机器周期。P0口和P2口
图为P0口和P2口其中一位的电路图,由图可见,电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组口线用来作为CPU与外部数据存储器、外部程序存储器和I/O扩展口,而不能象P1、P3直接用作输出口。它们一起可以作为外部地址总线,P0口身兼两职,既可作为地址总线,也可作为数据总线。P2口锁存器和缓存器结构
P2口作为外部数据存储器或
折叠P1口
右图为P1口其中一位的电路图,P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输入口时,1写入锁存器,Q(非)=0,T2截止,内上拉电阻将电位拉至"1",此时该口输出为1,当0写入锁存器,Q(非)=1,T2导通,输出则为0。P1口锁存器和缓存器结构
P3口
P3口的电路如上图所示,P3口为准双向口,为适应引脚的第二功能的需要,增加了第二功能控制逻辑,在真正的应用电路中,第二功能显得更为重要。由于第二功能信号有输入输出两种情况。P3口锁存器结构
P3口的输入输出及P3口锁存器、中断、定时/计数器、串行口和特殊功能寄存器有关,P3口的第一功能,P3口的第二作用
△P3.0串行输入口(RXD)
△P3.1串行输出口(TXD)
△P3.2外中断0(INT0)
△P3.3外中断1(INT1)
△P3.4定时/计数器0的外部输入口(T0)
△P3.5定时/计数器1的外部输入口(T1
△P3.6外部数据存储器写选通(WR)
△P3.7外部数据存储器读选通(RD)
程序存储器()
数据存储器()
内部数据存储器的配置
数据存储器也称为随机存取数据存储器。MCS-51单片机的数据存储器在物理上和逻辑上都分为两个地址空间,一个是内部数据存储区和一个外部数据存储区。MCS-51内部RAM有128或256个字节的用户数据存储,它们是用于存放执行的中间结果和过程数据的。51的数据存储器均可读写,部分单元还可以位寻址。
折叠特殊功能寄存器
特殊功能寄存器(SFR)也称为专用寄存器,特殊功能寄存器反映了MCS-51单片机的运行状态。很多功能也通过特殊功能寄存器来定义和控制程序执行二.个人实验部分
1.流水灯
2.蜂鸣器
3.继电器
4.静态数码管
5.独立按键
6.ds18b20(可独立编程)
编程:
1#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define led P1
void delay(u16 i)
{while(i--);}
void main()
{ while(1){u8 i;
led=0x01;
delay(50000);
while(1)
{ for(i=0;i<8;i++)
{ led=(0x01<<i);
delay(50000)}}
2#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=p1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(10);
}
}
3#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
P0=~smgduan[0];
while(1)
{
}
}
4#include <reg52.h>
sbit led=P0^0;
sbit k1=P1^0;
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
led=~led;
}
}
}
void main()
{
led=0;
while(1)
{
keypros();
}
}
6.DS18520
定义头文件
#ifndef_temp_H
#define_temp_h
#include <reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
sbit DSPORT=P3^7;
int Ds18b20ReadTemp();
#endif
Temp.c文件
#include <temp.h>
void Delay1ms(uint y)
{
uint x;
for(;y>0;y--)
{
for(x=110;x>0;x--);
}
}
uchar Ds18b20Init()
{
uchar i=0;
DSPORT=0;
i=70;
while(i--);//642us
DSPORT=1;
i=0;
while(DSPORT)
{
Delay1ms(1);
i++
if(i>5)
{
return 0;
}
}
return 1;
}
void Ds18b20WriteByte(uchar dat)
{
uchar i,j;
for(j=0;j<8,j++)
{
DSPORT=0;
i++;
DSPORT=dat&0x01;
i=6;
while(i--);
DSPORT=1;
dat>>=1;
}
}
uchar Ds18b20ReadByte()
{
uint i,j;
uchar bi,byte;
for(j=8;j>0,j++)
{
DSPORT=0;
i++;
DSPORT=1;
i++;
i++;
bi=DSPORT;
byte=(byte>>1)|(bi<<7);
i=4;
while(i--);
}
return byte;
}
void Ds18b20ChangeTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
}
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
}
int Ds18b20ReadTemp()
{
int temp=0;
uchar tmh,tml;
Ds18b20ChangeTemp();
Ds18b20ReadTempCom();
tml=Ds18b20ReadByte();
tmh=Ds18b20ReadByte();
temp=tmh;
temp<<=8;
temp|=tml;
return temp;
}
主函数:
#include <reg52.h>
#include <temp.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=p1^5;
sbit k1=P1^0;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 num=0,disp[4];
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
beep=~beep;
delay(100);
datapros(DS18b20ReadTemp());
DigDisplay();
}
}
}
void datapros(int temp)
{
float tp;
if(temp<0)
{
DisplayData[0]=0x40;
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
DisplayData[0]=0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
DisplayData[1]=smgduan[temp/10000];
DisplayData[2]=smgduan[temp%10000/1000];
DisplayData[3]=smgduan[temp%10000%1000/100]|0x80;
DisplayData[4]=smgduan[temp%100/10];
DisplayData[5]=smgduan[temp%100%10];
}
void DigDisplay()
{
u8 i;
for(i=0;i<6;i++)
{
switch(i)
{
case(0);
LSA=0;LSB=0;LSC=0;break;
case(1);
LSA=1;LSB=0;LSC=0;break;
case(2);
LSA=0;LSB=1;LSC=0;break;
case(3);
LSA=1;LSB=1;LSC=0;break;
case(4);
LSA=0;LSB=0;LSC=1;break;
case(5);
LSA=1;LSB=0;LSC=1;break;
}
P0=disp[5-i];
delay(100);
P0=0x00;
}
}
void main()
{
while(1)
{
keypros();
beep=~beep;
delay(100);
datapros(DS18b20ReadTemp());
DigDisplay();
}
}
相关文章推荐
- 【Symbian基础知识整理】_Symbian的目录结构和程序编译链接的简单过程
- 使用Delphi,SDK编写Windows简单程序
- 【Rebol 学习笔记】第一篇:编写一个简单的 CGI 程序
- 用java编写简单UDP网络通信程序
- 用C语言编写简单的接口程序
- 编写简单的中文分词程序
- 简单的用PHP编写的导航条程序
- 一个显示地图数据,并实现简单浏览查询程序源码(SDK编写)
- 编写简单的中文分词程序
- RMI程序编写简单指南
- 编写多线程网络检测程序的简单实现
- 用VB编写最简单木马程序
- 如何编写简单的端口扫描程序:
- 编写简单的中文分词程序
- 简单的用PHP编写的导航条程序
- 一个简单木马程序的编写
- Eclipse3.1+Lomboz3.1RC1+Tomcat5.5.9编写简单动态网页实践
- 简单APPLET程序编写与运行
- 十五ACE编写简单的通信程序
- 自己动手编写一个简单的U盘杀毒程序