51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机Word下载.docx
《51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机Word下载.docx》由会员分享,可在线阅读,更多相关《51程序合集 包括流水灯按键蜂鸣器继电器译码器数码管点阵PWM步进电机Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
P2=0xfd;
K3)
P2=0xfb;
K4)
P2=0xf7;
if(!
K5)
beep();
//喇叭发声
RELAY=1;
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<
unsignedcharscan_key();
voidproc_key(unsignedcharkey_v);
voiddelayms(unsignedcharms);
//对应按钮K1
sbitK2=P0^1;
//对应按钮K2
unsignedcharkey_s,key_v;
key_v=0x03;
P2=0xfe;
key_s=scan_key();
if(key_s!
=key_v)
{
delayms(10);
key_s=scan_key();
if(key_s!
{
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++);
K1)BEEP=0;
//当按键按下对应单片机脚变低电平BEEP发声
elseBEEP=1;
//当松开键按对应单片机脚变高电平BEEP关闭
[文件名]C51音乐程序(八月桂花)
REG52.H>
INTRINS.H>
//本例采用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,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x20,0x20,0x30,0x30,
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驱动芯片驱动继电器**
//51的端口和各特殊寄存器定义在此文件中
//定义继电器对应单片机管脚
sbitK1=P2^7;
//定义按钮对应单片机管脚
/*********************************************************
主函数*
**********************************************************/
K1)RELAY=0;
//按钮按下开启继电器
elseRELAY=1;
//按钮松开关闭继电器
*138译码器实验*
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>
j--);
//点亮第一个LED灯
HC138C=0;
HC138B=0;
HC138A=0;
delay(1500);
//延时
//点亮第二个LED灯
HC138A=1;
//点亮第三个LED灯
HC138B=1;
//点亮第四个LED灯
delay(2000);
//点亮第五个LED灯
HC138C=1;
//点亮第六个LED灯
*标题:
试验数码管上如何显示数字(共阳极)*
#defineNOP()_nop_()/*定义空指令*/
voiddelay(unsignedinti);
//函数声名
//此表为LED的字模
unsignedcharcodeLED7Code[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
unsignedintLedNumVal=1,C;
//定义变量
if(++C>
=300)
{LedNumVal++;
//每隔300个扫描周期加一次
C=0;
//每隔300个扫描清零
}
//将字模送到P0口显示
P0=LED7Code[LedNumVal%10]&
0x7f;
//LED70x7f为小数点共阴和共阳此处也是不一样;
delay(150);
//调用延时程序
charj;
i--)
for(j=200;
试验数码管上显示数字(单片机直接实现位选共阴极)#include<
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};
//位选控制查表的方法控制
/************主函数**********************/
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;
case2:
P1=0xdF;
case3:
P1=0xeF;
case4:
P1=0xf7;
case5:
P1=0xfb;
case6:
P1=0xfd;
case7:
P1=0xfe;
}*/
//扫描间隔时间太长会数码管会有闪烁感
试验数码管上显示数字(译码器位选共阴极)*
sbitLS138A=P2^2;
//定义138译码器的输入A脚由P2.2控制
sbitLS138B=P2^3;
//定义138译码器的输入脚B由P2.3控制
sbitLS138C=P2^4;
//定义138译码器的输入脚C由P2.4控制
while
(1)//进入循环状态
=50)
//延时计数每扫描一次加一次
//每隔50个扫描周期加一次
i++)//实现8位动态扫描循环
//将字模送到P0口显示
switch(i)//使用switch语句控制位选也可以是用查表的方式学员可以试着自己修改
LS138A=0;
LS138B=0;
LS138C=0;
LS138A=1;
LS138B=1;
LS138C=1;
试验动静LED灯——实现动态控制#include<
sbitLED8_1=P1^1;
//j14接在P1.1上
charLED;
LED=0x01;
=10)//点亮动静LED灯速度控制
LED=LED<
1;
//左移