【C51自学笔记】闪烁灯+流水灯(四种方法) + 74HC573芯片+keil4软件仿真(debug)

AT89S52:

  • P0:不含上拉电阻,需要外接
  • P1,P2,P3:内部含上拉电阻
  • 左下方是个晶振
  • 51单片机的复位是高电平复位(默认是高电平输出)-如何复位:赋予高电平脉冲

复位的接入方法

如何复位详解:RST含高电平脉冲

复位键断开:RST是低电平(接地)

复位键闭合:闭合回路上,RST获得高电平,计算V(rst) = 4.7 v 为高电平

搭建最小系统:

  • ​​​​​​接入晶振
  • 接入RST
  • 接入上拉电阻并为上拉电阻提供VCC
  • EA接入VCC(代表使用片内存储器) 接入0(代表使用片外存储器)

解释573芯片:

​​​​​​

​​​​​OE上加-:低电平有效,高电平无效。

Z:高组态,既不是高,也不是低。接什么平是什么平,相当于芯片没有工作

Q0:维持原来的状态不改变。

排阻的九个引脚:接入VCC的COM脚是八个电阻共接在一起的。1K的阻值:发光二极管的正向导通电压(1.6-1.7V)除以流过的电流

(3-10mA)

如何点亮图中二极管:

  • VCC已经提供高电平,保证负极的低电平。
  • P0i对应第i+1个二极管=》P0i依次设置成低电平。
  • 循环
 
 
点亮灯:
 
 #include <reg52.h>
 sbit led1 = P0^0;

 int main()
 {
	 while(1){
		 //线操作
		P0 = 0xfe;
		//位操作
		led1 = 0;
	 }
	 
	 return 0;
 }
闪烁灯:
 
 #include <reg52.h>
 #define  uint unsigned int
 void delay(uint a){
	 while(a--)
		 ;
 }
 
 int main()
 {
	while(1){
		P0=0xfe;//11111110
		delay(50000);//并不是精确的秒数,而是一个大致的时间间隔
		P0=0xff;//11111111
		delay(50000);
	}
	 
	 return 0;
 }

流水灯:

位操作:

#include <reg52.h>
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(void)
{
	unsigned char a,b;
	for(a=0;a<200;a++)
	for(b=0;b<200;b++);
}

void main()
{
	while(1)
		{
		led0=0;
		delay();
		led0=1;
		delay();

		led1=0;
		delay();
		led1=1;
		delay();
				
		led2=0;
		delay();
		led2=1;
		delay();

		led3=0;
		delay();
		led3=1;
		delay();

		led4=0;
		delay();
		led4=1;
		delay();

		led5=0;
		delay();
		led5=1;
		delay();

		led6=0;
		delay();
		led6=1;
		delay();

		led7=0;
		delay();
		led7=1;
		delay();
		}
}

2.线操作:

#include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int

unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*
1111 1110
1111 1101
1111 1011
1111 0111
1110 1111
1101 1111
1011 1111
0111 1111
*/
void delay(void)
{
	uchar a,b;
	for(a=0;a<200;a++)
	for(b=0;b<200;b++);
}

void main()
{
	uchar i;
	while(1)
	{
	for(i=0;i<8;i++)
	{
	P0=table[i];
	delay();
	}

}
}

方法三:位运算

#include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int

void delay(void)
{
	uchar a,b;
	for(a=0;a<200;a++)
	for(b=0;b<200;b++);
}

void main()
{
	uchar k,i;
	while(1){
		
		k=0xfe;//11111110
		
		for(i=0;i<8;i++)
		{
			P0=k;				//1111 1110
			delay();
			
			k=k<<1;   			//1111 1100
			
			k=k|0x01; 			//1111 1101
			//0x01:0000 0001(把最低位 或 为1)
		}		  
	}		  	
				

}

方法四:函数

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char 
#define uint unsigned int
void delay(void)
{
	uchar a,b;
	for(a=0;a<200;a++)
	for(b=0;b<200;b++);
}

void main()
{
	uchar k;
	k=0xfe;
	while(1)
	{
		P0=k;
		delay();
		k=_crol_(k,1);
		/*
		1111 1110
		1111 1101
		---
		0111 1111 
		*/
	}

}

软件仿真:debug

利用软件仿真测试语句间的执行时间:

  • 开启debug
  • 设置断点在起始位置
  • run
  • t1 = sec
  • 设置断点在起始位置
  • run
  • t2 = sec
  • 时间间隔 = t2-t1
 

设置与硬件同频率的晶振:

  • 点击目标选项按钮
  • 点击项目
  • 点击始终:设置成与硬件符合的时钟(晶振)。

猜你喜欢

转载自blog.csdn.net/f_zmmfs/article/details/81146594