单片机流水灯c语言实现_第1页
单片机流水灯c语言实现_第2页
单片机流水灯c语言实现_第3页
单片机流水灯c语言实现_第4页
单片机流水灯c语言实现_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验一闪烁的Led

C1

U1

rHk-19・39

220p>XTAL1P0.0/AD0"^38

P0.1/AD1

X1:37

P0.2/AD2

CRYSTAL18・36

C2XTAL2P0.3/AD3

・35

P0.4/AD4

34

P0.5/AD5

TF:33

220p.R1P0.6/AD6

9"・32

RSTP0.7/AD7

10k

・21

P2.0/A8

・22

C3P2.1/A9

・23

P2.2/A10

29■・24

PSENP2.3/A11

30^♦25

ALEP2.4/A12

后■26

EAP2.5/A13

327

P2.6/A14

■28

D1P2.7/A15

1■■10

P1.0P3.0/RXD

220RP1.1P3.1/TXD■7T

LED-RED■J2

VP1.2P3.2/INT0■~I3

P1.3P3.3/INT1■74

P1.4P3.4/T0

P1.5P3.5/T1

P1.6P3.6/WRHE

P1.7P3.7/RD■77

AT89C51

〃名称:闪烁的Led

〃说明:Led按设定的时间间隔闪烁,约亮1秒灭1秒

//

#include<reg51.h>

#defineucharunsignedchar//uchar宏定义

ttdefineuintunsignedint〃uint宏定义

sbitled=PlA0;

//

〃延时子程序

//

voiddelayMs(uintx)

(

uchari;//uchari取值为0-255

while(x-)

for(i=0;i<120;i++);〃延时120微妙

//

〃主程序

//------------------------------------

voidmain()

(

while(l)

(

led=~led;

delayMs(2050);〃约亮1秒灭1秒

}

实验二从左到右的流水灯

C1T

U1

XTAL1PO.O/ADO

IPO.VAD1

C2TPO2/AD2

XTAL2PO3AD3

P0.4/AD4

P05/A05

I2B2OPHPO.6.'AD6

TRSTPO.7/AD7

W

ALE

EA

P3.aRXO

罟P31,JXD

P3.2.1RT6

曾P3.3/1NY7

P34To

系P3.5T1

P3.&WR

P3.7TO

〃名称:从左到右的流水灯

〃说明:接在P0端口的8只Led从左到右循环依次点亮,产生走马灯效果

//------------------------------------

#include<reg52.h>

#include<intrins.h>〃循环左移头文件宏定义

#defineucharunsignedchar

#defineuintunsignedint

//

〃延时函数

voiddelayMs(uintx)

(

uchari;

while(x-)

for(i=0;i<l20;i++);

//-------------

〃主程序

voidmain()

PO=Oxfe;〃PO口初始化值1111.1110

while(l)

PO=_crol_(PO,l);//PO口循环左移1位

delayMs(15O);〃晶振为11.0592时,0.1594885秒移动一次

)

实验三左右来回循环的流水灯

U1

►XTAL1PO.Q'ADO

P0.1/AD1

PO2AD2

XTAL2PO3AD3

PO.4ACM

PO.&AD5

P0.6/AD6

RSTP0.7/AD7

P2.a,A8

P2.t/A9

P22A10

P2.WA11

P24Al2

P2.5'A13

P26A14

P2.7.A15

P3.0/RXD

P3.1/TXD

P3.2.'1NTO

P33,WH

P34,-T0

P3&-T1

P3.6WR

P3.7TO

〃名称:左右来回循环的流水灯

〃说明:程序利用循环移位函数一crol_和一cror形成来回滚动的效果

//

#include<reg52.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

//

voiddelayMs(uintx)

(

uchari;

while(x-)

for(i=0;i<120;i++);

)

//--------------

voidmain()

uchari;

P2=OxOl;〃P2端口初始化

while(l)〃死循环

(

for(i=0;i<7;i++)//i自加1,当i=7时执行第二个for语句

(

P2=_crol_(P2,l);〃P2端口循环左移1位

delayMs(150);

)

for(i=0;i<7;i++)

(

P2=_cror_(P2,l);//P2端口循环右移1位

delayMs(150);

)

)

)

〃注释for(i=0;i<7;i++).i初始值为0,

〃i++就是i自加1,每加一次执行

〃P2=_crol_(P2,l);〃P2端口循环左移1位

〃delayMs(150);延时

〃当i=7时,跳出第一个for语句,

〃执行第二个for语句

实验四花样流水灯

U1

>XTAL1PO.aADO

P0.1/AD1

P0.2/AD2

XTAL2P03AD3

P0.4/AD4

P0.5*AD5

P0.6.'AD6

RSTP0.7/AO7

P2QA8

P21-A9

P2.2/A10

PSENP2.3/A11

AL£P2.4AI2

EAP2S/A13

P26rAi4

P2.7/A15

P3.0.RXD

P3.1/TXD

P3.2/WTO

P33557T

P3.4/TO

P3.5'T1

P3.6WR

P3.7/RD

〃名称:花样流水灯

〃说明:16只LED分两段组按预设的多种花样变换显示

//--------------------------------------

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodepattern_PO[]={Oxfc,Oxf7,Ox5f};//>^5<PO

ucharcodepattern_P2[]={0xff,0x07,0xf5};〃定义P2显示数组

〃调整数组。里的内容,可以实现自定义的花样显示

//----------------------------------------

voiddelayMs(uintx)

(

uchari;

while(x--)for(i=0;i<120;i++);

)

//----------------------------------------

voidmain()

(

uchari;

while(l)

|

for(i=0;i<7;i++)

(

PO=pattern_PO[i];//i自加1次,PO数组重新扫描1次

P2=pattern_P2[i];//i自加1次,P2数组重新扫描1次

delayMs(150);

)

)

)

〃数组定义格式为

//ucharcodepattern_P0[]={0xfc,0xf7};

〃uhar为数组类型,pattern_PO数组名称

//code数组存储类型

〃{0xfc,0xf7}为数组显示参数,为Oxff为全部关闭

实验五Led模拟交通灯

//Led模拟交通灯

〃说明:东西向绿灯亮若干秒,黄灯闪烁,闪烁5秒后亮红灯,

〃红灯亮后,南北向有红灯变为绿灯,若干秒后南北向黄灯闪烁,

〃闪烁5次后,亮红灯,东西向绿灯亮,如此重复

//---------------------------------------------------

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitred_a=POAO;

sbityellow_a=POAl;

sbitgreen__a=P0A2;

sbitred_b=P0A3;

sbityellow_b=P0A4;

sbitgreen_b=P0A5;//sbit为LED控制位定义

ucharFlash_Count=0,Operation_Type=l;

//Flash_Count闪烁次数和Operation_Type操作类型变量定义

//

voiddelayMs(uintx)

(

uchari;

while(x-)

(

for(i=0;i<120;i++);

)

}

//

〃交通灯切换子程序

voidTraffic_Light()

(

switch(Operation_Type)

(

case1:〃东西向绿灯亮与南北向红灯亮

red_a=l;yellow_a=l;green_a=0;

red_b=0;yellow_b=l;green_b=l;

delayMs(2000);

Operation_Type=2;

break;

case2:〃东西向黄灯开始闪烁,绿灯关闭

delayMs(300);

yellow_a=!yellow_a;green_a=l;

〃黄灯闪烁5次

if(++Flash_Count!=10)return;

Flash_Count=0;

Operation_Type=3;

break;

case3:〃东西向红灯与南北向绿灯亮

red_a=0;yellow_a=l;green_a=l;

red_b=l;yellow_b=l;green_b=0;

delayMs(2000);

Operation_Type=4;

break;〃中断case3执行case4

case4:〃南北向黄灯开始闪烁

delayMs(300);

yellow_b=!yellow_b;green_b=l;

if(++Flash_Count!=10)return;

Flash_Count=0;

Operation_Type=l;

}

)

//

voidmain()

(

while(l)Traffic_Light();

)

//switch是多分支选择语句常用格式

“switch(表达式)

//{case常量表达式1;语句1

//case常量表达式2;语句2

//case常量表达式3;语句3

//case常量表达式n;语句n

“default:语句n+1}

“return是返回值,break的返回是指停止这•次执行,返回开始

实验六单只数码管循环显示0-9

RP1

RESPACK-8

C1

HFU1

220p19

►XTAL1P0.0/AD0

OX1■38

P0.1/AD1

■37

P0.2/AD2

C2—r-CRYSTA%-36

XTAl_2P0.3/AD3

■35

P0.4/AD4

■34

P0.5/AD5

220pR1■33

P0.6/AD6为2

9"-

RSTP0.7/AD7

10k1

-

»2互

P2.0/A82

±-C3-

P2.1/A93

髭-

P2.2/A104

-

刊卜-PSENP2.3/A11互5

10u-

6

ALEP2.4/A12必

-

EAP2.5/A137

匿-

P2.6/A148

--

P2.7/A15

W1O

T

2P1.0P3.0/RXD-

3P1.1P3.1/TXD2

-

4P1.2pa.a/ihrro五3

-

5P3.3/INTT

P1.3黑4

-

6P1.4P3.4/T05

7〒-

P1.5P3.5/T16

8五-

P1.67

P36亚-

P1.7P3.7/RD

AT89C51

〃单只数码管循环显示0-9

〃说明:主程序中的循环语句反复将0-9的段码送至P0端口

//使数字0-9循环显示

//

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeDSY_CODE[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,Oxff};

〃。内为共阳数码管0-9的编码

//

voidDelayMs(uintx)

(

uchari;

while(x--)for(i=0;i<120;i++);

)

//

voidmain()

uchari=0;

PO=OxOO;

while(l)

(

PO=~DSY_CODE[i];〃显示数组取反

i=(i+l)%10;//

DelayMs(180);

〃说明;电路中数码管接法是共阴,段码表是共阳的

〃;所以用PO=Y~DS_CODE[i]语句取反显示

实验七8只数码管滚动显示单个不同数字

XTAL1PO.OiADO

PO.1/AD1

PO2AD2

XTAL2P03/AD3

P0.4/AD4

PO.5'AD5

PO.6,AD6

RSTPO.7/AD7

P2.O/AB

P2.1/A9

P22A1O

P23A11

P24Al2

P2sAi3

P26Al4

P2.7/A15

P3.0/RXD

P3.trrxp

P、一L,

P3.3/INT7

P3.4.1D

P35rH

P3.aWR

P3.7TO

AT89C51

用三极管驱动显示不正常,最好去掉三级管驱动

/咫只数码管滚动显示单个不同数字

〃说明:数码管从左到右依次滚动显示0-9,

〃程序通过每次仅循环选通一只数码管

//

#include<reg51.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeDSY_CODE[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,};〃数组定义

//

voidDelayMs(uintx)

uchari;

while(x-)

(

for(i=0;i<200;i++);

}

}

//------------------------------------

voidmain()

(

uchari,k;

k=0x80;//K初始化1000.0000

while(l)

(

for(i=0;i<10;i++)

(

PO=Oxff;〃关闭显示

PO=DSY_CODE[i];〃发送数字段码

k=_crol_(k,l);〃P2=k;所以第1位右移

P2=k;〃发送数码管位码,打开对应的数码管

DelayMs(300);

}

//i=10是因为数组里有1-9共十个段码

〃k=0x80;因为移位P2八8开始,移动一位才开始

〃显示第一位

实验八8只数码管显示多个不同字符

rm

XTAL1PO.O/ADO

X1■38P01

oP0.VAD1

।CRYSP02AD2

C2■36P03

XTAL2P0.3'AD3

P0.4/AD4

P0.5/AD5

P0.&AD6

RSTPO.7/AD7

P9

2.Z11/A0

P2,&A11

PSENP24A12

P2,A13

P2,s,A14

P2.6'A15

P2.7,,A1

P1QP3GRXD

PliP3.VTXD

P12P32标

P13P3.3.iRTl

P1.4P34F)

PtSP3.5TH

PI6P3.6匹

Pl7P37,'WO

IR只数码管显示多个不同字符

〃说明:数码管动态显示0-7,(刷新快)

//---------------------------------------

#include<reg51.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeDSY_CODE[]=

{0xc0,0xf9,0xa4/0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,0xff};〃数码管段码数组定义

//

〃延时程序

voidDelayMs(uintx)

(

uchari;

while(x-)for(i=0;i<120;i++);

)

//

〃主程序

//

voidmain()

uchark,m=0x80;〃赋初值

while(l)

for(k=0;k<8;k++)

(

m=_crol_(m,l);〃位右移

P2=m;〃位码

PO=DSY_CODE[k+l];〃段码

DelayMs(10);〃延时短

〃本例刷新速度快!视觉显示多个字符

〃如果延时间加长,就是固定位置显示单个字符

实验九数码管闪烁显示字符串

ABCDEFGDP512345678

0W

po

AD1

po.V2AD2

po

3AD黑3

po⑷

po⑸湛

2御R1

po向

------------------F7

10kpo

±rC3poP2Q/A8

P2.1/A9

P2.2/A10

PSENP23XA11

10uALEP2.4/A12

EAP25仇13

P2.&AJ4

P2.7/A15

R3.GRXD

P3.1.TXD

P32,WT0

P3.3WF7

P3.4/TD

P3.5'T1

P3.6WR

P37,«D

〃数码管闪烁显示字符串

〃说明:数码管闪烁显示由0-7构成的一串数字

//本例用动态刷新发法显示一串字符,在停止时所有数字显示消失(区别定义两个数组)

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

〃数字0-9的数码管段码表

ucharcodeDSYCODE[]=

{0xc0,0xf9/0xa4/0xb0,0x99,0x92/

0x82,0xf8,0x80,0x90};

〃数码管位选通索引表(位码表)

ucharcodeDSY_IDX[]=

{0x01,0x02,0x04,0x08,//

0x10,0x20,0x40,0x80};

//

〃延时程序

//

voidDelayMs(uintx)

(

uchari;

while(x-)for(i=0;i<120;i++);

}

//

〃主程序

H

voidmain()

(

uchark,m;〃赋初值

PO=Oxff;//PO初始化

P2=0x00;//P2初始化

while(l)

{for(k=0;k<30;k++)

(

for(m=0;m<8;m++)

(

P2=DSY」DX[m];〃显示位码

PO=DSY_CODE[m];〃显示段码

De!ayMs(20);

)

)

P2=0x00;〃位关闭

DelayMs(lOOO);

)

)

〃第一-个for(k=0;k<30;k++)数码管保持显示时间延时

〃第二个for(m=0;m<8;m++)位码和段码显示位限制

实验十8只数码管滚动显示数字串

E89

12345B78

83933883

C1

T卜Sxi

,39叩.0

220PXTAL1PO.O,ADO

PO」

PO1/AD1

・37叩N

[CRYSTALP02AD2

C2-9p3

XTAL2PO.3'AD0

P0.&AD4

・:MP0上

P0.&AD6

22即R1)3

P0.6/AD6:;,P07

1P0.7-AD7

±-C3P2QA8

P2VA9

・2302

P2.2-A10

・.Z03

PSENP2.3/A11

・253

ALEP2.4/A12

・2605

P2.&A13

Q6

P2.6/AI4:s

zsQ7

P2.7/A15蚩

P3.0/RXD

P3.1.<TXDzi

P3-2.NTOzi

P33/WTT

P3.4/TO

P3.5E

P3.6WR

P3.7W

AT89C51

"8只数码管滚动显示数字串

〃说明:数码管向左滚动显示3个字符构成的字符串

#include<reg51.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeDSY_CODE[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,

0x82,0xf8,0x80,0x90,Oxff};

〃程序将下面数组看成环形队列显示从

〃某个数开始的8个数(10表示黑屏)

ucharNum[]={10,10,10,10,10,10

,10,10,2,8,9};

//

voidDelayMs(uintx)

(

uchari;

while(x-)for(i=0;i<120;i++);

)

//

voidmain()

uchari,j,k,m;

PO=Oxff;

P2=0x00;

m=0x80;

while(l)

for(i=0;i<10;i++)〃显示保持

for(j=0;j<8;j++)

m=_crol_(m,l);

P2=m;

〃采用环形取法从第K开始取J个

PO=DSY_CODE[Num[(k+j)%ll]];

DelayMs(2);

)

〃环形队列首指针K递增,Num的下表范围为

/A)-10因此对■11求余

k=(k+l)%ll;

)

〃在用软件仿真是最好不要加三极管驱动!因程序运行占用CPU资源,运行不正常

实验1K1-K4控制LEd移位

C1

U1

■39DID1D1D9

220p__|_LXTAL1PO.O/ADO

・%"D2

X1P0.1/AD1

口■37~D3

C2CRYSTALP02AD2

18■36,DTD2D2D1

XTAL2P0.3/ADG

P0.4.AD4远

■34~D6~

HF-P0.5/AD5D3D3

■33~D7~D11

2丝R1_P0.6/AD6

■32

―RSTP0.7.'AD7

10k

D9jD4D4D1

P2QA8

士C3・22DIO

P2.1;A9

・23D”

P2.2/A10

29・临D12D5D5D1

H产PSENP2.3,A11

・:;士

ALEP2.4/A12

31・•冬D14

EAP2HAi3

・Z7D15D6D6

P26A14

■讶D16

P2.7/A15

07D7D1.吗.

P1.0P3O/RXD

Pi1P3.VTXD

L下移.P1.2P3.2/WTO

P13P3.3.'WTT

4P1.4P3.4/T0220R

6・

R上机P1.5P3.5F

7"

P16P3.&WR

P1.7P3.7而

AT89C51

〃名称:K1-K4控制LEd移位

〃说明:按下kl时,P0端口LED向上移动一位

〃说明:按下k2时,P0端口LED向下移动一位

〃说明:按下k3时,P2端口LED向上移动一位

〃说明:按下k4时,P2端口LED向下移动一位

//

#include<reg51.h>

#include<intrins.h>

ttdefineucharunsignedchar

#defineuintunsignedint

H

voidDelayMs(uintx)

(

uchari;

while(x-)

(

for(i=:0;i<120;i++);

)

}

//

〃根据Pl端口的按键移动LED

voidmove_LED()

(

if((Pl&OxlO)==O)PO=_cror_(PO,l);//kl键PO左移

elseif((Pl&0x20)==0)P0=_crol_(P0,l);//k2键PO右移

elseif((Pl&0x40)==0)P2=_cror_(P2,l);//k3键P2左移

elseif((Pl&0x80)==0)P2=_crol_(P2,l);//k4键P2右移

}

//Pl端口值初始化为1,有建按下对应键值为0

〃对应键值PO、P2的Led移位

//

voidmain()

(

ucharRecent_key;

PO=Oxfe;

Pl=Oxff;

P2=0xfe;

Recent_key=Oxff;〃按键初始化为高电平

while(l)

(

if(Recent_key!=Pl)〃判断是否有键按下

{

Recent_key=Pl;〃保存最近按键值

move_LED();〃根据P1端口的按键移动LED

DelayMs(lO);

)

}

)

〃调整延时值,可改变流水灯流动速度

实验十二K1-K4按键状态显示

C1

U1

小D1R2

220p■39

>XTAL1PO.O/ADO

■38

PO.1/AD1

口■37

C2P0.2/AD21^36

XTAI_2P0.3/AD3

dP0.4/AD4

P0.5/AD5

220PD3

R1P0.6/AD6

RSTP0.7/AD7220R

D4R5

-C3P2.0/A8

P2.1/A9220R

P2.2/A10

PSENP2.3/A11

ALE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论