【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

 sbit led1 = P0^0;

 

 int main()

 {

while(1){

//线操作

P0 = 0xfe;

//位操作

led1 = 0;

}

 

return 0;

 }

 

闪烁灯:

 

 #include

 #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

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

#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

#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

#include

 

#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

 

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

点击目标选项按钮

点击项目

点击始终:设置成与硬件符合的时钟(晶振)。

关键字:     编辑:什么鱼 引用地址:

Similar Posts

发表评论

邮箱地址不会被公开。 必填项已用*标注

  • 友情链接