STC学习:流水灯

程序相关电路及工作原理说明
在这里插入图片描述
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模式)

HIGHLOWI/O口模式
00准双向口,灌电流可达到20mA
01推挽输出(强上拉输出,需加限流电阻)
10输入高阻
11开漏模式,内部上拉电阻断开

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;			
	 }
}
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布布要成为最负责的男人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值