所属系列:51单片机系列
公司:STC公司
位数:8位
RAM:512字节
ROM:8K(Flash)
工作频率12MHz
单片机版型
单片机开发板具体结构
电平特性
数字电路中只有两种电平:高电平和低电平
RS232电平:计算机串口的电平
所以当我们用单片机跟电脑通信的时候,我们要通过各种元器件将单片机的电平转换为计算机可识别的电平才能跟电脑进行通信。
总线:是计算机各部件之间传送信息的公共通道。微机中有内部总线和外部总线两类。内部总线是CPU内部之间的连线;外部总线是CPU与其他部件之间的连线。外部总线有三种:数据总线、地址总线、控制总线。
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器。
RAM:用于存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据。
ROM:用以存放程序、一些原始数据和表格。
I/O口:四个8位并行I/O口,既可以用作输入又可以用作输出。
T/C:两个定时器/计数器,既可以工作在定时模式,也可以工作在计数模式。
五个中断源的中断控制系统。
一个全双工UART的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信。
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。
单片机工作的基本时序
时钟周期:也称振荡周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,我们开发板上为12MHz。
状态周期:每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。
机器周期:一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。
指令周期:它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是由一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。
上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻起到一个限流的作用,下拉就是下拉到低电平。
作用:
OC门要输出高电平,外部必须加上上拉电阻
加大普通IO的驱动能力
起到限流的作用
抵抗电磁干扰
C-51数据类型扩充定义
sfr
:特殊功能寄存器声明
sfr 变量名=地址值;
sbit
:特殊功能位声明
sbit 变量名=地址值;
bit
:位变量声明
#ifndef…#endif
:条件编译,常用于头文件的定义还有一些程序条件编译
#ifndef __LED_H
#define __LED_H
#endif
单片机最小系统
LED的正极通过电阻连接到电源上,阴极连接P2口,此时只有给P2口低电平的时候,LED灯才会亮。
#include "reg52.h"
//将单片机的P2.0端口定义为led
sbit led=P2^0;
void main()
{
while(1)
{
//P2.0端口设置为低电平
led=0;
}
}
电路图与点亮LED灯的电路图相同,设置P2.0口输出低电平的时候,LED灯会点亮;设置P2.0口为低电平的时候,LED灯会熄灭。然后通过一定的延时,可以让LED灯出现闪烁的效果。
#include
#include "intrins.h"
//延时函数,会提供500ms的延时
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
//灯亮
P2=0xfe;
//延时
Delay500ms();
//灯灭
P2=0xff;
//延时
Delay500ms();
}
}
#include
#include "intrins.h"
int t=0,j,i;
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while (1)
{
if (P3_1==0)
{
Delay150ms(); //消振
if (P3_1==0)
{
t++;
if (t==9)
t=1;
}
}
switch(t)
{
case 1:P2=0xfe;break;
case 2:P2=0xfd;break;
case 3:P2=0xfb;break;
case 4:P2=0xf7;break;
case 5:P2=0xef;break;
case 6:P2=0xdf;break;
case 7:P2=0xbf;break;
case 8:P2=0x7f;break;
default :P2=0xff;break;
}
}
}
#include
void delay(unsigned int n)
{
unsigned int i,j;
for (i=n;i>0;i--)
for (j=110;j>0;j--);
}
void main()
{
unsigned int t=0;
while (1)
{
switch(t)
{
case 0:P2=0xfe;delay(250);break;
case 1:P2=0xfd;delay(250);break;
case 2:P2=0xfb;delay(250);break;
case 3:P2=0xf7;delay(250);break;
case 4:P2=0xef;delay(250);break;
case 5:P2=0xdf;delay(250);break;
case 6:P2=0xbf;delay(250);break;
case 7:P2=0x7f;delay(250);break;
default :P2=0xff;delay(250);break;
}
t++;
t=t%8;
}
}
#include
int i,j,t;
int a[8]={0,1,1,1,1,1,1,1};
void delay(int n)
{
for (i=n;i>0;i--)
for (j=150;j>0;j--);
}
void main()
{
while(1)
{
P2=0xff;
delay(250);
for (t=0;t<8;t++)
{
P2=(P2<<1)+a[t];
delay(250);
}
}
}
#include
void delay(int n)
{
unsigned int i,j;
for (i=n;i>0;i--)
for (j=150;j>0;j--);
}
void main()
{
int t;
while (1)
{
if (P3_1==0)
{
P2_0=0; P2_1=0;
delay(250);
P2_0=1; P2_1=1;
delay(250);
}
if (P3_0==0)
{
for (t=0;t<2;t++)
{
P2_2=0; P2_3=0;
delay(250);
P2_2=1; P2_3=1;
delay(250);
}
}
if (P3_2==0)
{
for (t=0;t<3;t++)
{
P2_4=0; P2_5=0;
delay(250);
P2_4=1; P2_5=1;
delay(250);
}
}
if (P3_3==0)
{
for (t=0;t<4;t++)
{
P2_6=0; P2_7=0;
delay(250);
P2_6=1; P2_7=1;
delay(250);
}
}
}
}