LED流水灯

思路:

用来测试发光二极管是否正常工作和学习使用发光二极管

点亮二极管,见前文

1.P0 P2 P3 设置为推挽输出,然后把P2 P3置1,使二极管发光。

然后再对P0赋值,即可点亮对应的led灯

要实现流水灯,可以点亮一个led灯 等待一段时间 将其熄灭,同时点亮下一个led灯 如此循环

推挽输出:

一种使用一对选择性地从相连负载灌电流或者拉电流 的器件的电路,它常常使用一对参数相同的功率三极管或MOSFET管,以推挽方式存在于电路

电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小,效率高,输出既可以向负载灌电流,也可以向负载抽取电流。推拉式输出既提高电路的负载能力,又提高开关速度。

推挽输出常见的是图腾式输出

图腾式输出

常用于数字电路,由于TTL与非门使用两个垂直堆砌的同类型晶体管,中间用一个钳式二极管隔开

关键代码设计

void Init()

对发光二极管电路进行初始化设置,只要把P0和P2\3工作模式设置为推挽输出,同时把P2\3置1,使可以令二极管发光
其中对P0\P2的工作模式设置,可以通过设置对应的P0口模式配置寄存器和P2模式配置寄存器来实现

void Init(){

P0M1=0x00;
P0M0=0xff;

P2M1=0x00;
P2M0=0x08;

led_sel=1;	

}
void delay_ms(unit n)
延时函数也可以在STC-ISP中通过“软件延时计算器”功能自动生成指定延时时间的延时函数代码,如下:
在这里插入图片描述

实现延时n毫秒的功能,但是延时的时间可能不会很准确。
单片机工作时,是在统一的时钟脉冲控制下有序进行,这个脉冲是由单片机控制器中的时钟电路产生的
时钟电路由振荡器和分频器组成,振荡器产生基本的震荡信号,然后进行分频,得到相应的时钟。
振荡电路通常有内部振荡和外部振荡两种方式
我们用的单片机内部集成高精度R/C时钟,工作时钟可以使用内部振荡器或者外部晶体振荡器产生的时钟
外部振荡信号通过内部时钟电路,经过分频,得到相应的时钟信号

在这里插入图片描述

各种周期

振荡周期:晶体振荡器的周期

状态周期/时钟周期:振荡信号经二分频后形成的时钟脉冲信号,用S表示,包含的两个振荡周期叫做节拍1和节拍2

节拍1用于算术逻辑操作 节拍2一般进行内部寄存器之间的传输

机器周期:完成一个基本操作所需的时间称为机器周期。一个机器周期包括6个时钟周期,用S1-6表示;共12个节拍,依次用S1P1,S1P2,S2P1,S2P2……表示

指令周期:CPU执行一条指令所需要的时间,CPU执行指令是在时钟脉冲控制下一步进行的,由于指令的功能和长短各不相同,因此,指令执行所需时间也不一样,一个指令周期通常含有1-4个机器周期

举例

在这里插入图片描述
例:若MCS-51单片机外接晶振为12MHz时,则单片机的四个周期的具体值为:

振荡周期=1/12MHz=1/12μs=0.0833μs

时钟周期=1/6μs=0.167μs

机器周期=1μs

指令周期=1~4μs

单片机晶体振荡器M的频率可以在4MHz~48MHz之间选择,典型值是11.0592MHz(因为使用这个频率的晶振可以准确地得到9600bits/s和19200bits/s的波特率)
根据指令执行的时间,可计算出1ms可以相应执行多少条指令,函数中可通过循环执行空指令来达到延时1ms的效果。

main()

每个程序都是从main开始执行,首先,调用Init对电路进行初始化,再循环地对P0进行赋值,点亮流水灯
void main()

{

  Init(); 
  /*对发光二极管电路进行初始化设置,
  只要把P0和P2\3工作模式设置为推挽输出,
  同时把P2\3置1,使可以令二极管发光*/

  led=0x01;//从第一个灯开始

  while(1)

  {

       P0=led;        //点亮第一个灯

       delay_ms(200); //延时200ms 
       

       if(led==0x80)  //再从头开始亮灯

           led=0x01;

       else

           led=led<<1;  //左移一位

  }   

}


# 总代码
#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 Delay100ms()		//@11.0592MHz
{
	unsigned char i, j, k;

//	_nop_();
	//_nop_();
	i = 5;
	j = 52;
	k = 195;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	Init();

	led=0x01;
//	P0=led;
while(1)
	{
		P0=led;
	//	delay_ms(200);
		Delay100ms(); //ÑÓʱ200ms	
		if(led==0x80)
			led=0x01;
		else
			led=led<<1;
	}

	
}


除了推挽设置没搞懂,其他都不错,很好!
6.28补充
左右移动的流水灯(兵乓球比赛基础)

void main()
{
	Init();

	led=0x80;
	while(1)
	{
while(1)
	{
		P0=led;
		Delay100ms(); //ÑÓʱ100ms	
		if(led==0x01)
		{
		break;
		}
		led=led>>1;
	}
while(1)
{
			P0=led;
		Delay100ms(); //ÑÓʱ100ms	
		if(led==0x80)
		{
		break;
		}
		led=led<<1;
}
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值