51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机.docx
《51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机.docx》由会员分享,可在线阅读,更多相关《51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机.docx(21页珍藏版)》请在冰豆网上搜索。
![51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机.docx](https://file1.bdocx.com/fileroot1/2023-2/1/2656c70c-cbfc-4d27-9fb1-1ea8c085e2e9/2656c70c-cbfc-4d27-9fb1-1ea8c085e2e91.gif)
51程序合集包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机
*
/*按键则点亮LED灯,8路指示灯接p0口*
#include//51的端口和各特殊寄存器定义在此文件中此包含比不可少
sbitLED=P2^0;//定义LED在P2.0脚上
sbitK1=P0^0;//定义按钮在P0.0脚上
/*********************************************************/
main()
{
if(!
K1)LED=0;//当按键按下对应单片机脚变低电平LED变低灯亮
elseLED=1;//当松开键按对应单片机脚变高电平LED变高灯灭
}
/*按键则点亮LED灯,8路指示灯接p0口#include
#include
sbitBEEP=P1^5;
sbitRELAY=P1^4;
sbitK1=P0^0;sbitK2=P0^1;
sbitK3=P0^2;sbitK4=P0^3;
sbitK5=P0^4;sbitK6=P0^5;
voidbeep();
main()
{
while
(1)
{
P2=0xff;
if(K1==0)
P2=0xfe;
if(K2==0)
P2=0xfd;
if(!
K3)
P2=0xfb;
if(!
K4)
P2=0xf7;
if(!
K5)
beep();//喇叭发声
RELAY=1;
if(!
K6)
RELAY=0;//通过了反相器
}
}
voidbeep()
{
unsignedchari,j;
for(i=0;i<100;i++)
{
BEEP=!
BEEP;//BEEP取反
for(j=0;j<250;j++)//需要产生方波
_nop_();
}
BEEP=1;//关闭蜂鸣器
}
*
*连续按动按钮LED会不停的左移或右移#include
#include
unsignedcharscan_key();
voidproc_key(unsignedcharkey_v);
voiddelayms(unsignedcharms);
sbitK1=P0^0;//对应按钮K1
sbitK2=P0^1;//对应按钮K2
main()
{
unsignedcharkey_s,key_v;
key_v=0x03;
P2=0xfe;
while
(1)
{
key_s=scan_key();
if(key_s!
=key_v)
{
delayms(10);
key_s=scan_key();
if(key_s!
=key_v)
{
key_v=key_s;
proc_key(key_v);
}
}
}
}
unsignedcharscan_key()
{
unsignedcharkey_s;
key_s=0x00;
key_s|=K2;
key_s<<=1;
key_s|=K1;
returnkey_s;
}
voidproc_key(unsignedcharkey_v)
{
if((key_v&0x01)==0)
{
P2=_cror_(P2,1);
}
elseif((key_v&0x02)==0)
{
P2=_crol_(P2,1);
}
}
voiddelayms(unsignedcharms)//延时子程序
{
unsignedchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
#include//51的端口和各特殊寄存器定义在此文件中此包含比不可少
main()
{
if(!
K1)BEEP=0;//当按键按下对应单片机脚变低电平BEEP发声
elseBEEP=1;//当松开键按对应单片机脚变高电平BEEP关闭
}
[文件名]C51音乐程序(八月桂花)
#include
#include
//本例采用89C52,晶振为11.0592MHZ
//关于如何编制音乐代码,其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子,试探编吧!
sbitBeep=P1^5;
unsignedcharn=0;//n为节拍常数变量
unsignedcharcodemusic_tab[]={
0x18,0x30,0x1C,0x10,//格式为:
频率常数,节拍常数,频率常数,节拍常数,
0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,
0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,
0x1C,0x20,0x18,0x20,
0x20,0x80,0xFF,0x20,
0x30,0x1C,0x10,0x18,
0x20,0x15,0x20,0x1C,
0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,
0x20,0x30,0x80,0xFF,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,
0x20,0x30,0x1C,0x10,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x30,
0x20,0x30,0x1C,0x10,
0x18,0x40,0x1C,0x20,
0x20,0x20,0x26,0x40,
0x13,0x60,0x18,0x20,
0x15,0x40,0x13,0x40,
0x18,0x80,0x00
};
voidint0()interrupt1//采用中断0控制节拍
{TH0=0xd8;
TL0=0xef;
n--;
}
voiddelay(unsignedcharm)//控制频率延时
{
unsignedi=3*m;
while(--i);
}
voiddelayms(unsignedchara)//豪秒延时子程序
{
while(--a);//采用while(--a)不要采用while(a--);各位可编译一下看看汇编结果就知道了!
}
voidmain()
{unsignedcharp,m;//m为频率常数变量
unsignedchari=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while
(1)
{
a:
p=music_tab[i];
if(p==0x00){i=0,delayms(1000);gotoplay;}//如果碰到结束符,延时1秒,回到开始再来一遍
elseif(p==0xff){i=i+1;delayms(100),TR0=0;gotoa;}//若碰到休止符,延时100ms,继续取下一音符
else{m=music_tab[i++],n=music_tab[i++];}//取频率常数和节拍常数
TR0=1;//开定时器1
while(n!
=0)Beep=~Beep,delay(m);//等待节拍完成,通过P1口输出音频(可多声道哦!
)
TR0=0;//关定时器1
}
}
/******************************************************************/
/*继电器实验*
/**
/*连接方法:
连接JP11(P2)与JP5(按钮接口)*
/*按下P2.7继电器P1.4动作*
注意:
通过了74HC14控制ULN2003驱动芯片驱动继电器**
/******************************************************************/
#include//51的端口和各特殊寄存器定义在此文件中
sbitRELAY=P1^4;//定义继电器对应单片机管脚
sbitK1=P2^7;//定义按钮对应单片机管脚
/*********************************************************
主函数*
**********************************************************/
main()
{
if(!
K1)RELAY=0;//按钮按下开启继电器
elseRELAY=1;//按钮松开关闭继电器
}
*138译码器实验*
#include
sbitHC138A=P2^2;//定义译码器输入端A在P2.2管脚上
sbitHC138B=P2^3;//定义译码器输入端B在P2.3管脚上
sbitHC138C=P2^4;//定义译码器输入端C在P2.4管脚上
voiddelay(unsignedinti)
{
unsignedcharj;
for(i;i>0;i--)
for(j=255;j>0;j--);
}
main()
{
//点亮第一个LED灯
HC138C=0;HC138B=0;HC138A=0;
delay(1500);//延时
//点亮第二个LED灯
HC138C=0;HC138B=0;HC138A=1;
delay(1500);//延时
//点亮第三个LED灯
HC138C=0;HC138B=1;HC138A=0;
delay(1500);
//点亮第四个LED灯
HC138C=0;HC138B=1;HC138A=1;
delay(2000);
//点亮第五个LED灯
HC138C=1;HC138B=0;HC138A=0;
delay(1500);
//点亮第六个LED灯
HC138C=1;HC138B=0;HC138A=1;
delay(1500);
HC138C=1;HC138B=1;HC138A=0;
delay(1500);
HC138C=1;HC138B=1;HC138A=1;
delay(1500);
}
*标题:
试验数码管上如何显示数字(共阳极)*
#include
#include
#defineNOP()_nop_()/*定义空指令*/
voiddelay(unsignedinti);//函数声名
//此表为LED的字模
unsignedcharcodeLED7Code[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
main()
{
unsignedintLedNumVal=1,C;//定义变量
while
(1)
{
if(++C>=300)
{LedNumVal++;//每隔300个扫描周期加一次
C=0;//每隔300个扫描清零
}
//将字模送到P0口显示
P0=LED7Code[LedNumVal%10]&0x7f;//LED70x7f为小数点共阴和共阳此处也是不一样;
delay(150);//调用延时程序
}
}
voiddelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
*标题:
试验数码管上显示数字(单片机直接实现位选共阴极)#include
#include
voiddelay(unsignedinti);//函数声名
charDelayCNT;//定义变量
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段码控制
//此表为8个数码管位选控制,共阴数码管1-8个-
unsignedcharcodedispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位选控制查表的方法控制
/************主函数**********************/
main()
{
unsignedinti,LedNumVal=1;//变量定义
unsignedintLedOut[10];//变量定义
DelayCNT=0;
while
(1)
{
if(++DelayCNT>=20)//控制数字变化速度
{
DelayCNT=0;//20个扫描周期清零一次
++LedNumVal;//每隔20个扫描周期加一次
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[4]=Disp_Tab[LedNumVal%10000/1000];//千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80;//百位带小数点
LedOut[6]=Disp_Tab[LedNumVal%100/10];//十位
LedOut[7]=Disp_Tab[LedNumVal%10];//个位
for(i=0;i<9;i++)
{
P0=LedOut[i];
P1=dispbit[i];//使用查表法进行位选
/*switch(i)//使用switch语句控制位选
{
case0:
P1=0x7F;break;
case1:
P1=0xbF;break;
case2:
P1=0xdF;break;
case3:
P1=0xeF;break;
case4:
P1=0xf7;break;
case5:
P1=0xfb;break;
case6:
P1=0xfd;break;
case7:
P1=0xfe;break;
}*/
delay(150);//扫描间隔时间太长会数码管会有闪烁感
}
}
}
voiddelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
*标题:
试验数码管上显示数字(译码器位选共阴极)*
#include
#include
sbitLS138A=P2^2;//定义138译码器的输入A脚由P2.2控制
sbitLS138B=P2^3;//定义138译码器的输入脚B由P2.3控制
sbitLS138C=P2^4;//定义138译码器的输入脚C由P2.4控制
voiddelay(unsignedinti);//函数声名
charDelayCNT;
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
/************主函数**********************/
main()
{
unsignedinti,LedNumVal=1;
unsignedintLedOut[10];
DelayCNT=0;
while
(1)//进入循环状态
{
if(++DelayCNT>=50)
{
DelayCNT=0;//延时计数每扫描一次加一次
++LedNumVal;//每隔50个扫描周期加一次
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[4]=Disp_Tab[LedNumVal%10000/1000];//千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80;//百位带小数点
LedOut[6]=Disp_Tab[LedNumVal%100/10];//十位
LedOut[7]=Disp_Tab[LedNumVal%10];//个位
for(i=0;i<9;i++)//实现8位动态扫描循环
{
P0=LedOut[i];//将字模送到P0口显示
switch(i)//使用switch语句控制位选也可以是用查表的方式学员可以试着自己修改
{
case0:
LS138A=0;LS138B=0;LS138C=0;break;
case1:
LS138A=1;LS138B=0;LS138C=0;break;
case2:
LS138A=0;LS138B=1;LS138C=0;break;
case3:
LS138A=1;LS138B=1;LS138C=0;break;
case4:
LS138A=0;LS138B=0;LS138C=1;break;
case5:
LS138A=1;LS138B=0;LS138C=1;break;
case6:
LS138A=0;LS138B=1;LS138C=1;break;
case7:
LS138A=1;LS138B=1;LS138C=1;break;
}
delay(150);
}
}
}
voiddelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
*标题:
试验动静LED灯——实现动态控制#include
#include
sbitLED8_1=P1^1;//j14接在P1.1上
voiddelay(unsignedinti);//函数声名
charDelayCNT;
charLED;
main()
{
LED=0x01;
DelayCNT=0;
while
(1)
{
if(++DelayCNT>=10)//点亮动静LED灯速度控制
{
DelayCNT=0;
LED=LED<<1;//左移