for(y=0;y<120;y++);
}
voidmain()
{
_nop_();//1us
delay
(1);//25us
delay
(2);//34us
delay(3);//43us
delay(5);//61us
delay(10);//106us
delay(50);//466us
delay(100);//916us
Delay(1000);//9019us
delay_nms
(1);//,991us
delay_nms(10);//9,675us
delay_nms(100);//97,515us
while
(1);
}
1:
/*-----------------------------------------------
名称:
流水灯
内容:
循环点亮P1口对应的8个LED灯,造成循环流水点亮的效果
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineucharunsignedchar
#defineuintunsignedint
/*------------------------------------------------
延时子程序
------------------------------------------------*/
voiddelay(uintcnt)
{
while(--cnt);
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
P1=0xfe;//给初始化值换算成二进制是11111110
while
(1)
{
delay(58000);//延时程序
P1<<=1;//左移一位该语句等效于P1=P1<<1
P1|=0x01;//最后一位补1,该语句等效于P1=P1|0x01符号"|"表示"或"
if(P1==0x7f)//检测是否移到最左端?
"=="表示检测符号2端的值是否相等
{
delay(58000);
P1=0xfe;//重新赋值
}
}
}
2:
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineucharunsignedchar
#defineuintunsignedint
/*------------------------------------------------
延时子程序
------------------------------------------------*/
voiddelay(uintcnt)
{
while(--cnt);
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
P1=0xff;//给初始化值换算成二进制是11111110
while
(1)
{
delay(58000);
P1=0xaa;
delay(58000);
P1=0x55;
}
}
3
/*调用位移函数的流水灯程序*/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
uchartemp,num,num1;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmain()
{
temp=0xfe;
while
(1)
{
P1=temp;
delay(100);
temp=_crol_(temp,1);//重要的51库函数调用
delay(100);
}
}
4:
/*-----------------------------------------------
名称:
喇叭
内容:
一般现象可以看到P1口LED闪烁,需要将该口通过杜邦线连接到喇叭信号输入端子,可以参考电路图或者说明书
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbitSPK=P1^5;//定义喇叭端口
/******************************************************************/
/*延时函数声明*/
/******************************************************************/
voiddelay(unsignedintcnt)
{
while(--cnt);
}
/******************************************************************/
/*主函数*/
/******************************************************************/
main()
{
unsignedinti;
while
(1)
{
for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
delay(50);//参数决定发声的频率,估算值,可以自行更改参数并
SPK=!
SPK;
}
SPK=1;//喇叭停止工作,间歇的时间,可更改
delay(20000);
}
}
5:
/*-----------------------------------------------
名称:
音乐播放
修改:
无
内容:
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbitspeaker=P1^5;//定义音乐输出端口,需要连接到对应的喇叭,请参考电路图
unsignedchartimer0h,timer0l,time;
//世上只有妈妈好数据表
codeunsignedcharsszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
//音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
/******************************************************************/
/*延时函数*/
/******************************************************************/
voiddelay(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
/******************************************************************/
/*定时器中断函数*/
/******************************************************************/
voidt0int()interrupt1
{
TR0=0;
speaker=!
speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
/******************************************************************/
/*音乐处理函数*/
/******************************************************************/
voidsong()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
/******************************************************************/
/*主函数*/
/******************************************************************/
voidmain(void)
{
unsignedchark,i;
TMOD=1;//置CT0定时工作方式1
EA=1;
ET0=1;//IE=0x82//CPU开中断,CT0开中断
while
(1)
{
i=0;
while(i<100){//音乐数组长度,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
6:
步进电机的简单应用
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeffw[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
voiddelayus(uintus)
{
uinti,j;
for(j=0;jfor(i=0;i<12;i++);
}
voidmain()
{
uchari;
while
(1)
{
for(i=0;i<8;i++)
{P1=ffw[i];
delayus(10);
}
}
}
7:
独立按键控制继电器
#include
sbitjdq=P1^0;
sbitkey1=P3^0;
sbitkey2=P3^1;
voiddelay(unsignedinta)
{
while(a--);
}
voidmain()
{
jdq=0;
while
(1)
{
if(key1==0)
{jdq=1;
//delay(5000);
}
if(key2==0)
{jdq=0;
//delay(5000);
}
}
}
8:
数码管的静动显示及简单独立按键的使用
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
unsignedcharconstEL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示段码值01234567
unsignedcharcodeseg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^2;
sbitkey4=P3^3;
/*------------------------------------------------
延时子程序
------------------------------------------------*/
voiddelay(unsignedintcnt)
{
while(--cnt);
}
voidmain()
{
unsignedchari;
i=0;
P3=0XFF;
while
(1)
{
P0=0X06;
P2=0;
delay(100);
P0=0X5b;
P2=1;
delay(100);
P0=0X4f;
P2=2;
delay(100);
P0=0X66;
P2=3;
delay(100);
P0=0X6d;
P2=4;
delay(100);
P0=0X7d;
P2=5;
delay(100);
P0=0X07;
P2=6;
delay(100);
P0=0X7f;
P2=7;
delay(100);
if(key1==0)
break;
}
while
(1)
{
if(key1==0)
delay(100);
if(key1==0)
{
P0=EL[0];
P2=0;
}
if(key2==0)
delay(100);
if(key2==0)
{
P0=EL[1];
P2=0;
}
if(key3==0)
delay(100);
if(key3==0)
{
P0=EL[2];
P2=0;
}
if(key4==0)
delay(100);
if(key4==0)
{
P0=EL[3];
P2=0;
}
}
}
9:
/*-----------------------------------------------
矩阵键盘实验程序
通过反转法循环扫描矩阵键盘,并通过数码管显示数据
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharconstEL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
ucharkeyscan(void);//键盘扫描
voiddelay(uinti);//演示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain()
{
ucharkey;
P2=0;//1数码管亮按相应的按键,会显示按键上的字符
P0=0X00;
while
(1)
{
key=keyscan();//调用键盘扫描,
switch(key)
{
case0xee:
P0=EL[0];break;//0按下相应的键显示相对应的码值
case0xde:
P0=EL[1];break;//1按下相应的键显示相对应的码值
case0xbe:
P0=EL[2];break;//2
case0x7e:
P0=EL[3];break;//3
case0xed:
P0=EL[4];break;//4
case0xdd:
P0=EL[5];break;//5
case0xbd:
P0=EL[6];break;//6
case0x7d:
P0=EL[7];break;//7
case0xeb:
P0=EL[8];break;//8
case0xdb:
P0=EL[9];break;//9
case0xbb:
P0=EL[10];break;//a
case0x7b:
P0=EL[11];break;//b
case0xe7:
P0=EL[12];break;//c
case0xd7:
P0=EL[13];break;//d
case0xb7:
P0=EL[14];break;//e
case0x77:
P0=EL[15];break;//f
}
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
{
ucharcord_h,cord_l;//行列值中间变量
P3=0x0f;//行线输出全为0
cord_h=P3&0x0f;//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
delay(100);//去抖
if(cord_h!
=0x0f)
{
cord_h=P3&0x0f;//读入列线值
P3=cord_h|0xf0;//输出当前列线值//当时还是按住的实际P3=11101110。
结合实际按键
cord_l=P3&0xf0;//读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff);//返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
voiddelay(uinti)//延时函数
{
while(i--);
}
10:
(1)/*外部中断0/1的简单应用*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbitspeaker=P0^0;
#defineucharunsignedchar
#defineuintunsignedint
/*------------------------------------------------
延时子程序
------------------------------------------------*/
voiddelay(uintcnt)
{
while(--cnt);
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
EA=1;//开总中断
//EX0=1;//开外部中断0
//IT0=1;
EX0=1;
TCON=0x01;//跳变出发设置
//EX1=1;TCON=0x05;
P1=0xfe;//给初始化值换算成二进制是11111110
while
(1)
{
delay(58000);//延时程序
P1<<=1;//左移一位该语句等效于P1=P1<<1
P1|=0x01;//最后一位补1,该语句等效于P1=P1|0x01符号"|"表示"或"
if(P1==0x7f)//检测是否移到最左端?
"=="表示检测符号2端的值是否相等
{
delay(58000);
P1=0xfe;//重新赋值
}
}
}
voidexter1()interrupt1
{
uinti;
while
(1)
{
for(i=0;i<2000;i++)
{
speaker=0;
delay(20000);
speaker=1;
delay(20000);
}
}
}
(2)
外部中断0的简单配置应用
#inc