关键词不能为空

当前您在: 主页 > 英语 >

单片机编程100例

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:45
tags:

-

2021年3月3日发(作者:mdcc)


单片机编程实例100例大全



单片机编程实例



*

< br>实例


1:


使用


P3


口流水点亮


8



L


ED




i

< p>


clud





g



1

< p>


h



//


包含单片机寄存器得头文件



/


函数


功能:延时一段时间



v



id d


el


a



(voi


)


{


unsigned


char i,j




for(i


=0;


i<2


5< /p>


0;i



+)


for(j=0;j


〈2


50;j++)


;


}


/


函数功能


:


主函数



vo


id mai


< br>(


vo


id)




wh


il e


(1)





P3=0x


f


e;


/


/第一个灯亮



de


la


y(


)

< p>


//


调用延时函数




3=



xf d





/< /p>


第二个灯亮




el



y


()


; /


/调用延时函数



P3=0x< /p>



b




//第三个灯亮



d

< br>el


ay



);



/


调用延时函数



P3=0xf7; //


第四个灯亮



dela



()



//


调用延时函数



P



=0xef; /


/第五个灯亮



de



ay


()


;


//


调用延时函数



P3=0xd



;

< br>/


/


第六个灯亮




elay


()


; //


调用延时函数



P3=


0x


bf;

< br>/


/


第七个灯亮



delay(); //


调用延时函数



P3=0x7f



//


第八个灯亮



delay



); //


调用延时函数



}



/




*


实例


2:


通 过对


P3


口地址得操作流水点亮


8


位LED



#in



lude



reg5


1、


h



//


包含单片机寄存器得头文件



sf


r x=0xb0; //P3


口 在存储器中得地址就是


b



H,


通过


sfr


可定


义 8


051


内核单片机



//


得所有内部8位特殊功能寄存器,对地址


x


得操作也就就是对P


1


口得操作



/


函数功能


:


延时一段时间



/


v



id


d e



a



(v oid)


{


uns



gne



char


i,j





or(



=0


;i<


2


50


;i++)

< p>
for


(j=


0;j


〈< /p>


25



;



++




;



/


利用循环等待若干机器周期,从而延时 一段时间




/

函数功能


:


主函数



/


v



i< /p>



main(v


id




{


while(1)


{


< p>
=0x



e;


//


第一个灯亮



elay()




/


/调用延时函数


< br>x=0x



d



//


第二个灯亮



d



lay



); //


调用延时函数



x=0



fb; //


第三个灯亮



del



y



);



/


调用延时函数



x=



x



7




//第四个灯亮



delay(


);


//


调用延时函数




x=0



ef



//


第五个灯亮



d


el


a



(); //


调用延时函数



x=0xdf;



/


第六个灯亮



d


elay(


);


/


/调用延时函数



x=0xbf




//


第七个灯亮



d


el


ay(); //


调用延时函数



x=



x7f





/


第八个灯亮



d



la


< p>
(



; //


调用延时函数





}


*< /p>


实例


3:


用不同数据类型控制灯闪烁时间




inc



ude



reg51

< br>、


h



/


/包含单片机寄存器得头文件



/


函数功能


:


用整形数据延时一段时间< /p>



/


void



nt


_


d


elay


(


voi


d

< br>)



//


延时一段较长得时间



{



n


si g


ned int


m;


//


定义无符号整形变量


,


双字节数据,值域



0~



5535



o



(m= 0



m



36



00


;m


+ +)




//空操作



}


/


函数功能


:


用字符型数据延时一段时间



/


void c



a

r_del


ay(void) //


延时一段较短得时间



{


unsigned cha





,j



/ /


定义无符号字符型变量


,


单字节数据


,



域0


~2 55 for(i=0;i<20



;i++)


for(j=0


;j<


1



0;j++)



/


/空操作



}




函数功能


:


主函数



/


void mai



(



oid)



< p>
un


s



g


ne


d


ch


ar i





hi le



1)




f



r


(i


=0


;i<


3



i++






P1< /p>


=0


x



e;


//


P


1、


0


口得灯点亮



i



t_d



lay

< br>(


); //


延时一段较长得时间



P1=



x



f





/


熄灭


< /p>


in



_



el



y()


;< /p>


//


延时一段较长得时间






or< /p>



i


=0;


i< 3;i++)


{


P1=0x


ef


;

< br>/


/P


1、


4

< br>口得灯点亮



cha



_



e



ay



)



//


延时一段较长得时间



} P1


=0


xff

< br>;


//


熄灭


c



ar


_


d



lay



); //


延时一段较长得时



}




*


实例< /p>


4


:用单片机控制第一个灯亮



#


inc


lude



g5


1、h


>


/


包含


51

单片机寄存器定义得头文件




oid main



void)


{


P



=0xf


e;


//P1=1



11

< br>11


10B,



P1

< p>
、0输出低电平




< /p>


*实例


5


:用单片机控制一个灯闪烁:认 识单片机得工作频率




i

< p>


cl


ude〈


reg< /p>


51、


h> /


/包含单片机寄存器得头文件



/


函数功能:延时一段时间






o



d < /p>



e



ay(< /p>



oid)



/


两个v


oid


意思分别为无需返回值


,



有参数传递


{


unsigned


int


i



//


定 义无符号整数


,


最大取值范围6


553 5 f



r(i=0;


i<

< p>
20


00


0


< p>
i++




//


做20


0


00次空循环



; //


什么也不做


,


等待一个机器周期



}




函数功能


:


主函数


(C


语言规定必须有也只能有1个主函数)



/



o



d main(void)


{


while(



)



/


无限循环





P1=0xfe; //



1=1111


11


10B,


P


1、0输出低电平



dela



(



; /


/延时一段时间



P



=0x


ff;


//P1=1111


1111B



P1

< br>、


0


输出高电平



del


a



(); //


延时一段时间





}


*实例


6:



P


1口状态分别送入


P


0、

< p>
P


2、


P3


< p>
:


认识


I



O




得引脚功能



#inc


lu


de



reg51



h> /


/包含单片机寄存器得头文件





函数功能:


主函数


(C


语言规定必须有也只能有


1


个主函数


)


voi




ma



n(


vo

< p>
i



)




w



ile(



) //


无限循环







P1< /p>



0xff





/ P1=1


11


1


1111B,


熄灭L


E





0=P1; /





P


1口状态送入


P0


< br>


P2=



1;


//




P 1


口状态送入


P2


< br>


P3



P1;



/



P


1口状态送入


P


3口

< br>


}


}


*

< br>实例7


:



P

< br>0口、P1



口分别显示加法与减法运算结果


#in



lude



r


g5


1、h


>


voi




m ai



(vo



d




{


u



s



g< /p>


ned


c



ar m,n;


m=


4


3;


//


即十进制数


2x



6+11=43



=



0;


//


即十进制数3


x1



+



2=60

< p>
P



=



+n;


//



1

< p>


1


03


=0110 < /p>


0111



,


结 果


P1



3



P1



4


、< /p>


P


1、


7


口得灯被点亮



P0


=n-


m; /

< br>/


P0=17



0001 00 0



B,


结果


P


0、


0



P


0、


4


得灯被熄灭

}


*


实例8:用P


0


、P1口显示乘法运算结果




include



reg51



h



/


/包含单片机寄存器得头文件



vo



d main



void)


{


u



sign



d


ch



r m



n




unsigned


int


s;



m=



4;


n=71




s=m n;



/



=64



1=



5< /p>



4,


需要


16


位二进制数表示,高


8


位送

< p>
P1


口,低8位送


P


0口



//


由于


4 544


=1


7


256+19


2=


H3 16


16



6+


H2


16 16+H1 16+


H0



/< /p>


/


两边同除以


256,

< br>可得


17



19



/256=H3


1



+H2+



H


1< /p>


16+


H0


)/



56


//


因此

< br>,



8


位1

6


进制数


H3


16+H


2必然等于


17,


即454

4


除以


256


得商



//


低8位1


6

< p>
进制数


H1 16



H0


必然等于


1



2,



45



4


除以


256



余数



P



=s/2



6




//



8


位送


P1




,



1=17



11H=000




0001B,


P1



0与


P 1



4


口灭


,


其余亮



P0=s%256



//

< p>


8


位送


P


0口





P3



192=c0H=


1< /p>


1


00


0


00 0


B,


P


3、


1,



3



6 ,


P3、


7


口灭


,


其余亮





*


实例< /p>


9:



P1


、< /p>


P0


口显示除法运算结果



#include



h



/


/包含单片机寄存器得头文件




oid m


ai

n(void




{


P1



36/5; //


求整数



P0=((36



5) 10)


/5;


/


/求小数



while(1




;


//


无限循环防止程序“跑飞”



}


*


实例


1 0


:用自增运算控制


P


0口

< p>
8



LED


流水花样



#in



l



de


〈r


eg< /p>



1



h




//


包含单片机寄存器得头文件



/


函数功能


:


延时一段时间





void del



y



v



id)





nsigned



n



i;



or



i= 0



i<20



0



;i


++)


;






函数功能?:主函数



/


v


oid



main(void)


{


unsi



n



d char


i;


for(i=0


;< /p>


i



2



5



i


< p>
+)


/


/注意


i


得值不能超过


2



5


{


P0=i



//


i


得值送


P

0口



de


lay(


)



//


调用延时函数



}


}


*


实例


1



:


用P


0< /p>


口显示逻辑”与”运算结果



#i


nclu



e



reg51



h




//


包含单片机寄存器得头文件



voi



mai

n(


v


oi


d)


{


P0



( 4>



)



& (9>



x



b)



/


/将逻辑运算结果送


P0




wh



l


e(


1)




/


/设置 无限循环


,


防止程序“跑飞”



}


*


实例


1 2


:用


P0


口显示条件运算结果



#i



cl


ud


e



r



g51



h



/


/包含单片机寄存器得头文件


void

< br>m



in


(v

< br>oid)




P0

< p>



8>4)



8



4;


< p>
/


将条件运算结果送


P0


口,


P0=8=0000


1000




whil



(1



;


//设置无限循环


,


防止程序“跑飞”



}

*


实例1


3


:用P


0


口显示按位”异或”运算结果


#i



c


lud


e



reg



1



h



//


包含单片机寄存器得头文件


vo



d



ai



(v



id






P0=0x



2^0

< br>x


3



;//

< br>将条件运算结果送


P0



,


P0


=8=0000 100



B


while



1






//


设置 无限循环


,


防止程序“跑飞”





*


实例< /p>


16:



P0


显 示左移运算结果




in



lude<


reg5


1< /p>



h




//包含单片机寄存器得头文件


void

< br>main(v



id




{


P0=0x3b


〈〈


2


;//将左移运算结果送


P0< /p>



,P



=11



0


11


0



B=



xe c


whil



(1)


; //


无限循环


,

< br>防止程序“跑飞”



}


*


实例17:”万能逻辑电路



实验

< p>


#



nclude


〈r


e



51



h




//


包含单片机寄存器得头文件



s



it F=



1^4;


< br>/



F


位定义为


P


1、


4



bit


X



P



^5; //


将X位定义为



P1



5


sbi



Y=P


^6




/


/将


Y


位定义为

< br> P


1、


6



bi



Z=P1^



;


< br>/



Z


位定义为


P1


、7




oid


ma


i



(voi


d)

< br>


{


whil



(1






F=((


~X


)



Y)|


Z;


//


将逻辑运算结果赋给


F


;


}




*


实例


18:


用右移运算流水点亮


P1


口8位L


E< /p>




#i



clude




e g51



h




//


包含单片机寄存器得头文件



/


函数功能


:


延时一段时间



/


void de



ay(vo



d)


{


unsig



ed in



n;


for(


n=


0;n


〈3


0000< /p>


;n


++




;


}


/


函数功能


:


主函数



/


v



id


main(voi


d)



{


unsi



ned


ch


ar i




while(1)




P1=



xff




delay


()


;

< br>f


or



i=0



i



8;

< br>i


++)/


/设置循环次数为


8




P1=



1


〉〉


1;


//每次循环


P1


得各二进位右移


1< /p>



,


高位补


0


de


lay(); //


调用延时函数









*


实例< /p>


19




i


f语句控制P


0



8



L



D< /p>


得流水方向




in


clu


d



<



eg51


h>


//


包含单片机寄存器得头文件




bit S1=P



^



;


//



S1


位定义为


P

< p>
1、


4


sb


it


S2=


1^5



//将


S2


位定义为P


1



5


/


函数功能:主函数



/


void m



in(vo

< p>
id)



{


while



1






{ if(S



==0) //


如果按键< /p>


S1


按下



P< /p>


0



0x0


f;


/


/P0口高四位



ED


点亮




f(S2==0



//


如果 按键


S


2按下


P0=


0x


f0;


//P0


口低


四位LE


D


点亮< /p>





*实例2


0



用s


wt



ch


语句得控制

P0



8


位L

E


D得点亮状态


#in



lu



e


g< /p>


5


1、


h



//


包含单片机寄存器得头文件



sbit S1=



1^4;



/



S1


位定义为


P1



4


/


函数功能:延时一段时间



/



oi



< /p>


del


a



(v oi



)


{


u



sig



ed



nt n




for(



=0;n<100


00


;n++)


;


}


/


函数功能


:


主函数



/



oid



ain(voi



)


{


u


ns


i g



ed c



ar i;



=0



/ /



i


初始化为


0


w



ile


1)


{


if



S1



=0)

< p>
//


如果


S1


键按下





de



a



()



//


延时一段时间



if(S



==0)


//


如果再次检测到


S1


键按 下




++;



/i


自增


1



f(i


==


9



//


如果


i=9,


重新将其置为


1


i=1






swi



c



(i


)< /p>


//


使用多分支选择语句



{


}


}


cas




1:



0=



xfe




//


第一个


LE


D亮

< br> bre



k



c



s



2:


P



=



xfd;


/


/第二个


L


ED亮


b



e



k;


ca


se


3:P

0=


0xfb



//

< p>
第三个L


ED



b



eak




ca


se


4



P



=0



f7;


//


第四个

< br>LED



br



ak;



a



e



:P0=0xef;


< p>
/


第五个LE


D




brea



;



as



< /p>



:P0


=0


x



f; //


第六个

< br>LED



brea


k;




ase 7:P0=0xb



; //


第七个< /p>


LED





rea


k;




a



e < /p>



:



0


=0


x7



;


//


第八个


LE





br


eak; defau



t:



/


缺省值


,


关闭所有


LE




P0


=0xff;


}


*


实例


2


1:用f


or


语句控制蜂鸣器鸣笛次数



#incl



de



r



g5


1、


h



//


包含单片机寄存器得头文件


sb


it


so


nd=P



^


7;




/


sou


nd位定义为


P3



7 /


函数功能:延时形



1600H


z音频



/ void


de


la



16


00(


void







nsigned


char


n;




or



n



0


;n


<100;n+


+)

< br>




}




函数功能:延时形成


8



0H


z音频

< p>



voi



de


ay8



0


vo



d)





nsi gne





har



;



or (



=



;n <200;n+



)


;


}


/


函数功能

:


主函数



/



oi



main


(v


oid)


{


un



igned in



i




while(1






for(i=


;i<830;i+



)




soun


d=0; //P


3、7输出低电平



d



l



y1600



)




sound=



;

< br>//



3


7


输出高电平


delay1600();


}


for(


i=0

< br>;


i<200;i+


+)



{


sou



d=0; /



P3


、7输出低电平


d< /p>


el


ay80



()




soun


=



;



/



3



7


输出高电平


del



y80



()






}




*实 例2


2:



w



ile


语句控制


LE




#i


< br>cl



de


< br>re



5


1、h


>



/


包含单片机寄存器得 头文件






数功能


:


延时约

60ms



3


10




2< /p>


00


=6


0


00 0μs


) /


vo



d


d e


lay60m



(vo



d)


{


un


sig


n


ed


char m


,n;



f



r(



=0


;m<


10


0;m


+



)



or(n< /p>



0;


n<2


0 0;



++)


;




/


函数 功能


:


主函数



/


vo



d main(v



id)


{


uns



gned



ha





;


whil


e(1


)


//无限循环



{


i=0




//


将i初始化为


0


whil



(i


〈0


xff) //



i


小 于


0x



f(2



5)


时执行循环体


{


P


0=i;


/


/将i送


P0


口显示



d



la



60ms(


);



//


延时




++;



/


i自增


1






}


*


实例


2



:



d



-


wh


ile< /p>


语句控制


P


0口


8


位L


ED


流水点亮

< br> #inc



u



e



g51


、h〉




/


包含单片机 寄存器得头文件



/


函数功能


:


延时约


60m


s< /p>


(3 100


2


< br>0=60


000μs


)


/


void d



l


y60



s(

< br>v


oi



)




uns



gne




char



m



n




fo r



m=



; m



100;



+


+)



fo



(n=0


;n〈


2



0;



++






}


/


函数功能:主函数





v


oid



m


ai


n



vo i



)




do




P0=0xf


e;


< br>/


/


第一个


L

< br>ED亮



delay60



s();


}


P0=0


xfd


;

< br>/


/第二个


LED


< p>
de



ay


60m


s()



P0=0x


fb;


//


第三个


L



D


< p>
de


la


y6



ms



)




P0


=0x



7;


//第四个


L



D




d< /p>


e



ay60ms()

< br>;


P0=



x



f




/


第五个


LED



delay60ms()




P



=0xdf



//


第六个LED亮




el


ay6


0


ms()


; d



lay



0m


s();


P0=



xbf; //


第七个LE< /p>


D



de


l< /p>


ay



0ms


( );




0




x7



;


//


第八个


LED



de


l



y60ms()



}wh



le



1


);


//


无限循环,使


8



LED


循环流水点亮

< p>


*


实例


24:


用字符型数组控制


P0



8



LED


流水点亮


#



n


< br>l



de


r



g51


h





/


包含单片机寄存器得头文件





函数功能:延时约


60ms (3 100

< br>200=


6000


0μs)



/


vo



d


del



y60ms

< br>(


vo



d



{


unsi



ne



cha



m,n




for

(m


=0;m



100;m



+)


f



r(n



0



n



2


< p>
0;n++)


;


}


/


函数功能


:


主函数



/


v


i



main



v


oid


)


{



ns



g



ed cha



i;


unsi

< p>


n



d


char


code


T


ab[



] =



0xfe



0



f



, 0xfb



0



f7



0xef


,0x


df,0



bf,


0x


7f}





/


定义无符号字符型数组



wh


ile(


1


< p>


{


for(


i=


0



i



8



i+


+)





P



=Tab



i];//< /p>


依次引用数组元素,并将其送P0口显示



delay60


ms


(


< p>
;



/


调用延时函数





}


}


*实例


25:

< br>用


P0


口显示字符串常量



#include


1、h>


/


/包含单片机寄存器得头文件





函数功能


:


延时约


1



0ms



3 2



0


250


=1



0 00


0μs=

< p>
1


50


ms


/


void


de


lay


150



s



void




{


unsi



ned char


m,n





or(m=0



m

〈2


00;m



+




for(n=0;n


<< /p>


250


;n+


+)


;




/


函数功能:主函数



/


voi




m ai


n(


vo



d)


{


unsign



d



h


ar


s



r


[]


=< /p>




w,


Temp eratu



e


is


:”};



//


将字符串赋给字符型全部元素赋值




nsigned c



ar i;


while(1




{


i=0; //



i


初始化为


0


,从第一个元素 开始显示



while(


str


[i


]!=’



0'< /p>


) //


只要没有显示到结束标志'\0


'


{



0


=< /p>


str[i]



//

< br>将第


i


个字符送到


P0


口显示



d



lay


15


0



s



)


< p>
//


调用


15


0m


s


延时函数



i< /p>



+





/


指向下一个待显字符


}


}


}

< br>*实例


26:


用P


0


口显示指针运算结果



#in



lu



e

< p>


re



5


1、


h




voi




m



in



v< /p>



id)


{



nsigne




ch


ar


p1,



2



//


定义无符号字符型指针变量


p1



p2


uns


ig


ne


d


c



ar



,


j;


//


定义无符号字符型数据



i=25; //



i


赋初值


25


j


< p>
1


5;




1=



i; //


使指针变量指向


i


,对指针初始化



p2=&j



//


使指针变量指向


j ,


对指针初始化



P0=


p



+



2





/


p1+


p2


相当于i


+j,


所以

< p>
P



=25+15=


4< /p>


0=0x28


/


/则P0


=0



10


1000



,


结果


P0



3


、P


0


、5引脚


L



D


熄灭


,


其余


点亮< /p>


wh



le(1)


; //


无限循环,防止程序“跑飞”





*


实例< /p>


2



:


用指针数 组控制


P0



8


位LE


D


流水点亮


#in


clude


〈r


eg51


、h〉





函数功能


:


延时约


150

< p>
ms




3



00



5 0=



50


000μs=1


50



s


/


voi





ela



15


0m


s(voi


d)





unsigne



char m,n;


for(



=0;m



2


00


;m+



)



o



(n



0;


n〈


250



n++ )


;


}


/


函数功能:主函数



/


vo



d main

< br>(


vo



d





unsigned


c


ha


r code T



b


[]=


{0xf


e,0


xfd



0x



b


,0x


f



,0x



f ,0xd


f,


0xbf,0x7



}




un



ign


ed




h



r



[


]


=< /p>



&Tab[0




&



a



[


1]


,&Ta



[2]


,



T


ab


[3



,



T



b


[4]


,



T



b



5],



Tab[6],&Ta


< p>
[7



};


unsigne



char


i; //


定义无符号字符型数据



while



1)




for



i=0;i



8;


++)




P0



p[i]




dela


y1


50


ms


()

< p>





}




*< /p>


实例


2



:


用数组得指针控制


P0



8



LE


D流水点亮




i



c



u d


e〈


r



g



1


、h〉



/


函数功能


:


延时约


150ms (



200


250


=1


50 00


0μs=


150ms


/


vo



d d


el


ay15



m


(void)



< p>
uns



g


< p>
ed char


m,n


;

f



r



m=0;m<200;



++




f


or


(



=0;



<



50;n+



)


;


}




函数功能


:


主函数


/


vo



d


m



in(


vo


i


d)



{


unsigned cha




i;



unsig


e



char Ta



[


]={0xFF

< p>


0xFE,0x


FD,


0x



B,0xF7,0xE



,0xDF



0x



F, 0x7F



0xBF,0xDF ,0xE



,0


xF

< br>7,0xFB,0



F


D,


0



FE



0



FE,


0x< /p>


FC



0xFB,0xF


0,


0



E0,0xC0



0



8



,0x0


0,



0xE7,0xDB,0xBD,0x7E,0x3C,0x18,



x00,0x81,


0



C3



0x



7,0x7E



0x


B D


,0xD


B,0


< br>E7


,0x


BD,0



DB



;



/


流水灯控制码



unsig


ne


d



h



r p




/


/定义无符号字符型指针




=Ta



;



/


将数组首地址存入指针p



wh



le(1




{


for< /p>



i


=0


;i< /p>



3



;i++



//



3 2


个流水灯控制码



{


P



= (p



i



; //


(p+


i)


得值等于

< p>
a[i




}



ela



1


50


ms(



;


/


/调用


150ms


延时函数



} }


*


实例


29:


用P


0




1


口显示整型函 数返回值



#in


< br>lude



re



51



h




/


函数功能:计算两个无符号整数得与



/ unsigned int



u



(i


nt


a,i



t


b)



{


u ns



g



e d



nt s




s=a+



;


r



turn



s



;


}


/


函数功能

:


主函数



/



oid main


(v


o



d)


{

< p>


nsig



ed


z;



z=s


um


(



008,

200


9


);


< br>P


1=



/


56; //


取得z得高


8




P0=z


%2


56



//


取得


z


得低8位



hi



e(1)


;


}


*


实 例


3



:


用有 参函数控制P


0


口8位


L



D


流水速度


#i



cl


ud


e



h




/


函数功能


:


延时一段时间



/


v



id


delay(unsi



ned c



ar


x







nsi g



e



< /p>


c



a





,



; < /p>


for



m=0



m<



;



++




fo r(n=0


;n


<200


< p>
n++




;


}


/


函数功能

:


主函数



/


vo



d main(void)




unsigned



har


i;


nsi



ned



har



ode


Ta


b[


]={0xFE,0



FD



0xFB, 0xF7



0xE


< br>,0xD



,0xBF,0x7F


};


//


流水灯控制码



while(


1)





//


快速流水点亮LED


< p>
for



i=0;i<8;



++



//


共8个流水灯控制码



{



0=T



b[



];


delay(1

< br>0


0)



//


延时约


60ms,


(3


10




200=6




00


0μs)





//


慢速流水点亮L


ED


for(i


=0;


i<8;i++) //


共8个流水灯控制码






0=T



b



i



;



elay


(2


50);


//延时约

< p>
150m



,



3


250


200=



50


000μs)


}



}


}


*


实 例


31:


用数组作函数参数控制流水花样



#in



l


ud


e



re



51



h




/


函数功能

:


延时约


150ms


/


v



id d



lay(voi



)


{


un



igned


cha





,n;


fo


r(


m=0;m<



00;m++)



or(n


=0


;



<



5



;n++








/


函数功能


:


流水点亮


P


0口


8

< br>位


LED


/


v


oid


l



d_



low(unsig



ed



ha





un


si


gne



c



ar



;


fo



(



=


0;i


<8;i++)




P


0=


a[i];

< br>d



l


ay

(



;


}




/


函数 功能


:


主函数



/


v



id ma


in


(void)


8])



a[



< /p>


unsi



n



d



har


c



de


Ta



[



={0xFE



0


F


D,



xFB,



xF


< br>,0x



F,



xDF,0xBF



0x7F};

< br>/


/


流水灯控制码


< p>
le


d_



low(T< /p>



b)




}


*


实例3


2:


用指针作函数参数控制


P


0口


8



LE


D流水点 亮


#inclu



e< p>


g



1



h>


/


函数功能


:


延时约


1


50


ms


/


void delay



voi



)


{


unsign



d cha



m,


n;



for


m=0;


m〈


2



0;m+



)

< p>
fo


r(


n=



;


n〈2


5


0;n


++)


;


}


/


函数功能


:


流水点亮


P0


口8位L


ED


/


void


l

ed


_



low(


uns


i



ned


cha



p





/< /p>


形参为无符号字符


型指针






n



ig



ed



har i;


while(



)





=



; < /p>



/


将i置为0,指向数组第一个元素< /p>



w



ile( (p+i



!=




') //


只要没有指向数组得结束标志



{



0=



p +



);/




取得指针所指变量


(


数组元素)


得值,



P


0口




el


ay()





/


调用延时函数



i++




//指向下一个数组元素



}








函数功能:主函数



/


vo



d m



i



(voi



)




unsi



n


ed

char


code Ta


b[


]={0



FE,0xFD



0xFB


,0


xF


7< /p>


,


0xE


F


,< /p>


0xDF



0xB


F,


0x7F



< br>0


x



F


,0


xB



,0xDF,0xEF,


0x


F7,0



FB


,0


x


FD

,0



FE




xF


F,

0



F


E,


0xFC,0



F



,0xF0,0xE0,0xC0,0x



0




0x00,0x



7,



x


D< /p>


B



0xBD



0x7E,0xFF,0xFF,0x3C,



x18,0


x0,0


x81,0

xC


3,



xE

< br>7,0


xF



, 0xFF,0 x7



}





/


流水灯控制码


unsigned cha



poi



te



;


poin



er=Tab; < /p>


led


_f


low



po



nter)





*实例3


3:


用函数型指针控制


P


1口灯花样



#



n



lude<

< br>r


e



51

、h〉


//


包含


51

< p>
单片机寄存器定义得头文件



uns


i



ned


char



o


de


T ab[



={


0x

FE



0xFD,



xFB,0xF


7,


0xEF



0xDF


,0


xBF


,0x


7F};


/


/流水 灯控制码


,


该数组被定义为


全局变量< /p>



/


函数功能


:


延时约


150m


< br>


/


vo



d delay



v


oi


d)




unsi



ned char


m,


n



< /p>



or(


m=


0 ;m<200



m++)


for


(n


=0;n



2 50;n



+




;


}


/

函数功能


:


流水灯左移



/ void



ed_flow



voi



)


{


uns



g


ne


d ch



r


i;

f



r(i


0


;i


<8;i+


+)

< p>


//8


位控制码





P



=



a



[i


];



d



lay(


);



}


}


/


函数功能:主函数



/


void m



i

n(


void)


{


void




p



(v



i



); //


定义函数型指针,所指函数无参数


,


无返


回值


p=

le


d_f



ow;

< p>


/


将函数得入口地址赋给函数型指针

< p>
p



hile


(1)< /p>



( p



();



/


通过函数得指针


p


调用函数


le


d_


fl



w()




*< /p>


实例3


4:


用指针数组作为函数得参数显 示多个字符串



#in



l


ud


e〈


re

< p>


51


、h〉


/


/包含


51


单片机寄存器定义得头文件



un



igned


c



ar


cod




str1[


]=”Temperat


ure


is


test


ed







S1


8B20”;/


/C

< br>语言中,字符串就是作为字符数组来处理得



un



igned c



ar


co


de


s


tr2[ ]=”Now


t


em< /p>


pe



ature



s


:”; //所以


,


字符串得名字就就是字符串得首地址



uns



gn


ed


char code s



r3[ ]=



t



rm i



d



s



gned


by Z



ang Sa


n”;



u


ns


ig



ed ch



r



ode



tr4[


]=”Th


e


date


is 20



8



9-


30”;



un



igned


char


p[


< br>={str1,st



2,


s< /p>


t



3,str4};


//


定义


p



4



为指向


4


个字符串得字符型指针数组





函数功能:延时约15


0ms


/ void de


la


y(


vo


i



)


{


unsign



d



har m,n;


for



m=0;m<200;m++)



or



n=0



n<250;n++)




}


/


函数功能

:


流水点亮


P0



8


位L


ED


/


void


led_di


sp


lay


(un


si


g< /p>


n



d


c



a




x




])


//


形参


必须为指针数组



{


u



si g


ne


d


char i,j




for

(i=


0;i



4



i++) //



4


个字符串要显示



{


j=0



//


指向待显字符串得第


0


号元素




h



le( (x



i]+j


)!=’



0’)




/


只要第


i


个字符串得第


j


号元


素不就是结束标志

< br> {


P0=


(x


[i]


+j



; /


/取 得该元素值送到


P


0口显示



de



ay(


);


/


/调用延时函数




++



//


指向下一个元素



}




}


/


函数功能:主函数



/ v


oi


d


m



i


n(


void





unsign


ed




h


ar



i;


w



i le(1




{

f



r(i=0;i<4;



++)


led_disp



ay(p)



//


将指针数组名作实际参数传递





}


*实 例


3



:


字符 函数


ctyp


e、h应用举例



#


inc


lude

< br>51、


h> //


包含5


1


单片机寄存器定义得头文件



< p>
inc



ude


〈c


t



p


e、


h>


void


ma


in(vo



d)





hile(1)


{


P3=i



a


lp


ha(



_’)?0xf


0:0x0f



/


/条件运算,



'


_


'


就是英文


字母,


P


3=


0x



0






*实例


36


:内部函数

i


nt


r



ns



h


应用举例

< br>


#i



clude<



eg51



h



//


包含


51< /p>


单片机寄存器定义得头文件



#inc< /p>



u


de




tri



s< /p>




>


//< /p>


包含函数


is


al


ph



(



声明得头文件




< br>函数功能


:


延时约


1

< p>
50m


s



void delay



void)


{



ns



g


ne


d


c



a



m



n;


for(m=0;


m〈


2



0;m++)


for



n=0;n

< br>〈


250;n++)


;


}


/


函数功能


:


主函数




vo


id


main(



oid)


{


P3=0x


fe


;

< br>//P


3



11



1 111



B


wh



l


< p>
(1




{

< p>
P3=


_


c


< p>
o



_(P


< p>
,1



;//



P3


得二进制位循环左移1位后再赋给


P3


delay(


);


//


调用延时函数







*


实例


37:


标准 函数


std



ib


h


应用举例


< br>#


inclu



e



g



1



h



< br>//


包含


51


单片机寄存器定义 得头文件


#



n


lude


li


b



h



//


包含函数


isalpha()


声明得头文件< /p>


/


函数功能:延时约


150m




/



o


id


d elay(


voi


d






nsigne



char m,n;

< br>fo



(m=0;m



2



0



m++)


for(


n=


0



n



2



0;n+



)


;




/


函数功能


:


主函数


/ void


ma


in



vo



d)





n



ig


ne


d


cha




i





hile(1






fo


r< /p>



i



0;


i〈


10



i++ )


//产生


10


个随机数

< p>




P3=ra



d()/



6


0;


//


将产生得随机数缩小

< p>
16


0倍后送P


3


显示< /p>



delay


()


;






}


*实例


38:

字符串函数


str



ng



h


应用举例




in



lude< /p>



r



g



1



h

< p>


//


包含


51


单片机寄存器定义得头文件




in


clude




g



h


〉< /p>


//


包含函数i


s


lp



a



)


声明得头文


< br>


voi


d


m



in(v



id)




uns



gn



d


c



ar s



r1



]=


The


te


< br>peratur





s


:”;



un



ign



d c



a




st


r2[ ]


=”Now,



The




e mper



tu


e



s 36



entgrad


e:”; u


nsigned


ch



r


i;



i=st



cmp



str

< br>1,


str2)



/


/比较两个字符串,并将结果存入i



if



i==0) //st



1=str2


P3


=



x00




e



se


if



i


〈0)



//s


tr


1< /p>



str2


P3=0x



0




else



/st

< br>r1〉


s



r2


P3



0x0


f;




hil


e(


1)




//


防止程序“跑飞”



}


*实例


39


:宏定义应用举例


2


#i



clud


e〈


reg51

、h〉


//


包含


51

< p>
单片机寄存器定义得头文件



# define F(a



b) (a



+(a




(b)

< p>


2



6+



b)



/


带参数得宏定



,a



b


为形参


vo



d



a


in


(



o id)


{


unsigned c



ar i,j,


k;



i=40;


j=30;


k=


< br>0





3=F(


i,


j


< br>k



; //


i与


j



k


分别为实参


,


宏展开时


,


实参将替 代


宏定义中得形参



while



1)


;




*实 例


40:


宏定义应用举例2



#inclu


de<


AT89X51

< p>


h




#



nc


< br>u



e



ctype



h>


v



id



ain(void






P3_



=0;

//


将P3、


0


引脚置低电平,L


E


D点亮



P3_1=0; //



P3


、0引脚置低电平,


LED


点亮



P



_2=0; //



P3



0


引脚置低电平,


LED


点亮

< br>


P3_



=

< br>0


; /


/将P


3



0


引脚置低电平,


LED


点亮



P3_4=



;

/


/将P3、


4


引脚置高电平


,LE


D熄灭





P3_5



1;

//



P


3、

5


引脚置高电平


,


LE

< p>
D


熄灭



P3_6=1;


//


将P


3



7


引脚置高电平,


L

< br>ED熄灭



P3_



=1;

/


/将


P3


7


引脚置高电



,


LED熄灭


while


(1)





*


实例< /p>


41


:宏定义应用举例


3



inc



u


de<re


g5


1、


h



//


包含5


1


单片机寄存器定义得头文





defi



e MA



100


< br>/



MAX


宏定义为字符串


100


v


oi


d


mai


n(v



i


d)



{


#if


MAX


〉8


0


//


如果字符串1


00


大于


80


P



=


0x


f0;


//


P< /p>


3


口低四位


LED


点亮



#e



se



3



0x0f




//


否则


,P


3口高四位L


ED


点亮



#


end


if



/


结束本次编译



}


/


中断、定时器



中断、定时器



中断、定时器



中断、定时器





*


实例4


2:


用定时器


T0

查询方式


P2



8


位控制


L


ED闪烁



#i



clu



e



51


、< /p>


h>



/


包 含


51


单片机寄存器定义得头文件



/


函数功能


:


主函数



/



o



d main(vo



d)


{



/ EA=1;



/


开总中断



// E



0=1; //

< p>
定时器


T0


中断允许


< /p>



MO



=



x0



; /


/使用定时器


T0得模式


1


T



0=(



5536


-4


6


0< /p>


83)/256



//


定时器T


0


得高8位赋初值



TL0=(6



5


6



46083


)%2


5



;



/


定时器


T0

< p>
得高


8


位赋初值



TR0=


1;



//


启动定时器


T0


TF0=0




P2=0xff;


while(1


) /


/


无限循环等待查询






hil e(T



0



=0






T



0=0





2



~P2;



H0



(6



536


—4


6083)


/2


56

< p>


//


定时器


T0


得高


8


位赋初值




L



=(6 553


6-


46083


)%2


56; //


定时器


T0


得高8位赋初值


}


}


*实例< /p>


43


:用定时器


T1

查询方式控制单片机发出


1KHz


音频

#



nclude<



e



51


< p>
h〉



//


包含


51


单片机寄存器定义得头文件



sb



t



ound=P



^


;


//


sound


位定义为P


3



7


引脚



/


函数功能:主函数



/


voi


d m



i



(v



id




{


//



EA=1; //


开总中断



//


ET0



1




//


定时器


T0

< p>
中断允许


TM



D



0



10; < /p>


//使用定时



T


1得模式


1


T


< br>1=(65536


—9


21)


/ 25


6;


//


定时器


T1


得高8位赋初值



TL< /p>


1=(6



536



9


21


)



256; /


/定时器T


1


得高


8


位赋初值




R1=1; //


启动定时器


T1


TF1=



;


wh



le(1)/


/无限循环等待 查询






hile(T


F1


==0)


;



F1=0;

< br>sou



d=



sound;


//将P


3


、 7引脚输出电平取反



TH1=



65536-92



)


256;



/


定时器


T0


得高


8

< p>
位赋初值



TL1=(6



53



-



2



)%256




//定时器


T0


得高


8


位赋初值





}


*实 例


4


4:将计数器


T0


计数得结果送


P


1口8位


LE D


显示



#inc


ude



reg51

< p>


h>


//


包含


5


1单片机寄存器定义得头文件


sbi





=P3


^4;


/


/将


S


位定义为


P3


< p>
4


引脚





函数功能:主函数




void main(void)


{


/



EA=



; //


开总中断



// ET0



1; //


定时器

< p>
T0


中断允许




M



D


< p>
0x



2; /


/使用定 时器


T


0得模式


2


TH0=256-156




//


定时器


T0


得高< /p>


8


位赋初值



T L



=2


56—


156



//


定时器T

< p>
0


得高


8


位赋初值



TR0


=1;



/


启动定时器


T0

< br>w


h



le

(1


)//


无限循环等待查询



{


wh


il


e(T



0=



0



//


如果未计满就等待



{


i



(S==



)


//


按键


S


按下接地


,


电平为


0



1=



L0;



/


计数器

< br>TL0



1


后送


P1


口显示



}


TF


0=0;


//

< br>计数器溢出后


,



T

< p>


0



0




}


*< /p>


实例


45:


用定时器

T0


得中断控制


1



LED


闪烁


#include


reg5


1、



>



/


包含


51


单片机寄存器定义得头文件


< br>s



i





1=P2^0



/


/将


D


1位定义为P2、


0


引脚



/


函数功能


:


主函数



void


mai


n(


void







A=1;


//


开总中断



ET



=1;


//


定时器T


0


中断允许

< p>


TM



D=

< p>


x01



< p>
//


使用定时器


T0


得模 式


2


T


H0


=(



5



3 6



46



8 3)/256;


//


定时器T0得高


8


位赋初值



TL

0=



65


36



460


< br>3)%2



6



/


/定时器


T0


得高


8


位赋初值




R



=



; //


启动定时器


T




while


1)



/


无限循环等待中断









函数功能


:


定时器


T0


得中断服务程序




vo


id




i



e


0(


voi


d)



i



ter



u



t 1 us


in


g 0


//“interrupt”声明函数为中断服务函数


//< /p>


其后得


1


为定时器


T0


得中断编号;


0


表示使用第


0


组工作寄存器



{



1=~D1




/


按位取反操作


,



P

< br>2、


0


引脚输出电平取反



TH



=(65536


46083



/



5


6;


< br>/


/


定时器T


0


得高


8


位重新赋初





L0=(655


3 6-


4608


3)


%2


56


;



/


定时器


T0


得高


8

< p>
位重新赋初




}


*


实例


46:


用定 时器


T0


得中断实现长时间定时



#in


clu



e



reg


51、


h〉



/




包含


51


单片机寄存器定义得头


文件



sbi




D1=P2^0



//



D1


位定义为P


2



0


引脚



unsigned


char


Cou



tor



/


/设置全局变量


,


储存定时器


T0


中断次






函数功能


:


主函数



/ void main


(v


oid)


{


E



=1; //


开总中断



E


0=



; //


定时器


T0


中断允许



TMOD=0



01;


//使用定时器


T0


得模式


2


T



0=


(65


53


6—4


6

< br>0


83)/256; /


/定时器


T


0得高8位赋初值



TL


0=


(65



3



-46083



% 256




//定时器T


0


得高


8


位赋初值



T



0=1;


//


启动定时器


T




Countor



0;



/


从0开始累计中断次数



wh


ile


(


1)


//


无限循环等待中断



;


}


/


函数功能


:


定时器


T0


得中断服务程序



/ void Ti



e0



void) i


nt


erru



t




using




//“inter


ru


p



声明函数为中断服务函数



//


其 后得1为定时器


T


0得中断编号


;0< /p>


表示使用第


0


组工作寄存器



{


C



unto



++


< p>
//


中断次数自加


1


if


(C


o



ntor==2



) /


/若累计满< /p>


2


0次


,


即计时 满1s





D


1=~


D1




//


按位取反操作


,


将P


2



0


引脚输出电平取反



Co


un tor=0



//



Countor



0,


重新从


0


开始计数



}


TH


0=(



5536-4608


3)


/256 ; //


定时器


T


0得高


8


位重新赋初值



TL


0=


(65536-46083)



25



; //


定时 器


T0


得高8位重新赋初值





*实例


4 7:


用定时器T


1


中断控制两个


LED


以不同周期闪烁


#i


nc


l


ude〈


r



g51



h




//


包含


51


单片机寄存器定义得头文件



sbit



1

< p>


P



^0;



/



D


1位定义为


P2



0


引脚



sbi



D



=P2^1



//


将D


2


位定义为


P


2、1引脚



u


ns


i



ne





har Count



r1; /


/设置全局变 量


,


储存定时器


T1

< br>中断次数



unsigne




ch



r


C



u



t



r2; /


/设置全局变量,储存定时器


T1


中断次数



/


函数功能


:


主函数



/ void main(void




{


EA



1;


//


开总中断



ET1=1



//

< br>定时器


T1


中断允许



TM



D=


0x


10



//


使用定 时器T


1


得模式


1

< br>T



1=(65536-



6



8


3)


/256;



/


定 时器


T


1得高8位赋初值


< p>


L


1=(


6

< p>
55


36-


46


083) %



56





/


定时器


T 1


得高


8


位赋初值


TR1



1


/


/启动定时器


T

< p>



C



u


nt


or1=


< p>
;


//



0

< p>
开始累计中断次数



Counto



2=0; /


/从


0


开始累计中断次数



wh



l



(1)//


无限循环等待中断



;


}




函数功能:定时器


T1


得中断服务程序




v



i



Time1(v



id) in



errupt


3 usin



0


//“in


terrupt”声明函数为中断服务函数


//


其后得


3


为定时器T1得中


断编号< /p>


;0


表示使用第0组工作寄存器



{


C


ou


ntor1++;

< p>


/C


ou


nto



1


自加


1


Co


u



tor2+ +



/


/C


ount



r2


自加

< br>1


if(Coun



o



1==


2)


/< /p>


/若累计满


2



,


即计时满


1



0



s




D1=~



1;

//


按位取反操作,将


P2



0


引脚输出电平取反


C

< br>oun


tor


1=


0

< p>


//


将C


o



n



o



1



0

< br>,重新从


0


开始计数



}


if


(



o



ntor2


==


8)


//若累计满8次


,


即计时满4


00



s


{


D2=~D2; //


按位取 反操作


,



P2



1


引脚输出电平取反


C


ou


n


to


r



=0;



/



Countor


1清0,重新从0开始计数





T



1=(655


36-

4



08


3)

/25



;


//定时器


T1


得高8位重新赋


初值



TL1=(6553


6—


4608 3)


%2


5



;



/


定时器T

1


得高


8


位重新赋初值

< p>




*实例

< p>
4



:


用计数器T


1


得中断控制蜂鸣器发出


1

< br>K


Hz


音频


#i



c


lud


e



g51



h> //


包含


5


1单片机寄存器定义得头文件< /p>



sbi



< /p>


sound=P



^


;



/


将s


ou



d


位定义为


P3



7

< br>引脚




函数功能


:


主函数



/



oid


mai


n



vo


d)


{


EA=1;



/


开总中断



ET1=1; //


定时器


T1


中断允许




MO< /p>


D=


0


x1


0< /p>



//T


MO


D=0



01


00

< br>0


B


,使用定时器


T1


得模式1



TH1=(65536-9


21)


/256; //


定时器T


1


得高


8


位赋初值



TL1


=(6


553 6



921)%256; //


定时器


T1


得高


8


位 赋初值




R1=


1;



/


/启动定时器


T1


whi



e(1


< p>
//


无限循环等待中断



;


}


/


函数功能:定时器T


1


得中断服务程序



/ voi





im



1(



o


id


)



n



erru


t 3



si


ng





//


“i


nterr


upt”声明函数为中断服务函数

< br>


{


so


< br>nd=



so


un


d




TH1=

< p>


6



53


6—


921


)/


256; //


定时器


T1


得高

< br>8


位重新赋初值



TL1=(6


55


36



9



1



%25


6;




/< /p>


定时器


T1


得高


8


位重新赋初值



}

-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:45,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/700024.html

单片机编程100例的相关文章