程序相关电路及工作原理说明
led灯阳极:P0[7…0]
led灯阴极:共阴极,P2.3非
(1)发光二极管电路工作原理
P0口的8位输出分别连接了8个发光二极管L0~L7的阳极, P2.3经过一个反相器连接到8个发光二极管L0~L7的阴极(共阴极)。根据二极管的单向导通性(当阳极为高(对应P0口位为1)、阴极为低时,二极管导通,否则不导通),若P2.3输出信号为低电平“0”,则二极管的阴极都为高电平,此时无论P0输出的是“1”还是“0”,二极管都不会导通,也就不会发光。因此想要发光二极管导通,必须先设置P2.3输出信号为“1”,再通过设置P0,点亮想要点亮的发光二极管。
(2)P0口设置与工作原理
STC系列芯片有5组8位输入口,分别为P0到P5,其中P5口仅P5.0~P5.5用于输入输出。STC芯片的所有I/O口都可以配置为四种工作模式之一:准双向口/弱上拉、推挽/强上拉、输入/高阻和开漏模式。STC15系列单片机上电复位后为准双向口/弱上拉工作模式。
每个I/O口的工作模式由2个控制寄存器中的相应位控制(PnM0和PnM1,n=0、1、2、3、4、5)。也就是说P0口的具体工作模式由P0M0和P0M1控制。
点亮LED灯的条件
通电:P0=0xff
P2.3=1
模式:推挽输出
在实验板中,点亮led灯除了需要通电,还需要设置I/O口模式,可以通过设置寄存器P0M0[7…0]和P0M1[7…0]的值来实现,每一个led灯的I/O模式由P0M1和P0M0对应一位的组合决定(P0M1、P0M0共同控制了P0的I/O模式)
HIGH | LOW | I/O口模式 |
---|---|---|
0 | 0 | 准双向口,灌电流可达到20mA |
0 | 1 | 推挽输出(强上拉输出,需加限流电阻) |
1 | 0 | 输入高阻 |
1 | 1 | 开漏模式,内部上拉电阻断开 |
P0M1和P0M0组合决定了8位led的I/O模式,如下图:
时间设置
四种周期:
振荡周期:晶体的振荡器周期(1/12us)
状态周期:振荡周期二分频得到的脉冲信号。前半部分和后半部分成为P1和P2,P1有效时完成算术路基运算,P2有效时完成内部寄存器的访问传输。
机器周期:完成一个基本操作所需要的时间成为机器周期。一个及其周期包含6个状态周期(12个振荡周期,即1us)
指令周期:CPU执行一条指令需要的时间。一般为1-4个机器周期。
软件延时函数:
延时:可以通过1ms可以执行多少条指令来定义函数,执行空操作来实现时间延迟。
STC-ISP延时函数:
代码如下
#include<STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit led_sel=P2^3;//P2^3-----E3
uchar led;
void init()
{
P0M1=0x00;
P0M0=0xff;
P2M1=0x00;
P2M0=0x08;
led_sel=1;
}
void delay_ms(uint n)
{
while(n)
{
uchar i,j;
i=11;
j=190;
do
{
while(--j);
}while(--i);
n--;
}
}
void main()
{
init();
led=0x01;
while(1)
{
P0=led;
delay_ms(200);
if(led==0x80)
led=0x01;
else
led=led<<1;
}
}
当然,也可以直接控制led灯的两端电平来控制其发亮,不过要注意数码管的影响
#include<STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit led=P2^3;
sbit led0=P0^0;
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void delay_ms(uint n)
{
while(n)
{
uchar i,j;
i=11;
j=190;
do
{
while(--j);
}while(--i);
n--;
}
}
void main()
{
P0M0=0xff;
P0M1=0x00;
P2M0=0x08;
P2M1=0x00;
led=1;
led0=led1=led2=led3=led4=led5=led6=led7=0;
while(1)
{
led0=1;
delay_ms(200);
led0=0;
led1=1;
delay_ms(200);
led1=0;
led2=1;
delay_ms(200);
led2=0;
led3=1;
delay_ms(200);
led3=0;
led4=1;
delay_ms(200);
led4=0;
led5=1;
delay_ms(200);
led5=0;
led6=1;
delay_ms(200);
led6=0;
led7=1;
delay_ms(200);
led7=0;
}
}