51c程序集51单片机基本应用全集Word文档格式.docx
《51c程序集51单片机基本应用全集Word文档格式.docx》由会员分享,可在线阅读,更多相关《51c程序集51单片机基本应用全集Word文档格式.docx(55页珍藏版)》请在冰豆网上搜索。
//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灯,造成循环流水点亮的效果
------------------------------------------------*/
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
延时子程序
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);
//重新赋值
}
2:
P1=0xff;
P1=0xaa;
P1=0x55;
3
/*调用位移函数的流水灯程序*/
#include<
#defineuintunsignedint
#defineucharunsignedchar
uchartemp,num,num1;
voiddelay(uintz)
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
temp=0xfe;
P1=temp;
delay(100);
temp=_crol_(temp,1);
//重要的51库函数调用
4:
喇叭
一般现象可以看到P1口LED闪烁,需要将该口通过杜邦线连接到喇叭信号输入端子,可以参考电路图或者说明书
sbitSPK=P1^5;
//定义喇叭端口
/******************************************************************/
/*延时函数声明*/
voiddelay(unsignedintcnt)
/*主函数*/
unsignedinti;
for(i=0;
i<
200;
i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
//参数决定发声的频率,估算值,可以自行更改参数并
SPK=!
SPK;
SPK=1;
//喇叭停止工作,间歇的时间,可更改
delay(20000);
5:
音乐播放
修改:
无
内容:
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<
t;
t1++)
for(t2=0;
t2<
8000;
t2++)
;
TR0=0;
/*定时器中断函数*/
voidt0int()interrupt1
speaker=!
speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
/*音乐处理函数*/
voidsong()
delay(time);
voidmain(void)
unsignedchark,i;
TMOD=1;
//置CT0定时工作方式1
EA=1;
ET0=1;
//IE=0x82//CPU开中断,CT0开中断
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:
步进电机的简单应用
ucharcodeffw[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
voiddelayus(uintus)
uinti,j;
for(j=0;
j<
us;
j++)
12;
i++);
{
uchari;
8;
i++)
{P1=ffw[i];
delayus(10);
}
7:
独立按键控制继电器
sbitjdq=P1^0;
sbitkey1=P3^0;
sbitkey2=P3^1;
voiddelay(unsignedinta)
while(a--);
jdq=0;
if(key1==0)
{jdq=1;
//delay(5000);
if(key2==0)
{jdq=0;
8:
数码管的静动显示及简单独立按键的使用
unsignedcharconstEL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示段码值01234567
unsignedcharcodeseg[]={0,1,2,3,4,5,6,7};
//分别对应相应的数码管点亮,即位码
sbitkey3=P3^2;
sbitkey4=P3^3;
unsignedchari;
P3=0XFF;
P0=0X06;
P2=0;
P0=0X5b;
P2=1;
P0=0X4f;
P2=2;
P0=0X66;
P2=3;
P0=0X6d;
P2=4;
P0=0X7d;
P2=5;
P0=0X07;
P2=6;
P0=0X7f;
P2=7;
break;
P0=EL[0];
P0=EL[1];
if(key3==0)
P0=EL[2];
if(key4==0)
P0=EL[3];
9:
矩阵键盘实验程序
通过反转法循环扫描矩阵键盘,并通过数码管显示数据
unsignedcharconstEL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
//0-F
函数声明
------------------------------------------------*/
ucharkeyscan(void);
//键盘扫描
voiddelay(uinti);
//演示程序
ucharkey;
//1数码管亮按相应的按键,会显示按键上的字符
P0=0X00;
key=keyscan();
//调用键盘扫描,
switch(key)
case0xee:
P0=EL[0];
break;
//0按下相应的键显示相对应的码值
case0xde:
P0=EL[1];
//1按下相应的键显示相对应的码值
case0xbe:
P0=EL[2];
//2
case0x7e:
P0=EL[3];
//3
case0xed:
P0=EL[4];
//4
case0xdd:
P0=EL[5];
//5
case0xbd:
P0=EL[6];
//6
case0x7d:
P0=EL[7];
//7
case0xeb:
P0=EL[8];
//8
case0xdb:
P0=EL[9];
//9
case0xbb:
P0=EL[10];
//a
case0x7b:
P0=EL[11];
//b
case0xe7:
P0=EL[12];
//c
case0xd7:
P0=EL[13];
//d
case0xb7:
P0=EL[14];
//e
case0x77:
P0=EL[15];
//f
键盘扫描程序
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
ucharcord_h,cord_l;
//行列值中间变量
P3=0x0f;
//行线输出全为0
cord_h=P3&
0x0f;
//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
//去抖
=0x0f)
cord_h=P3&
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的简单应用*/
sbitspeaker=P0^0;
//开总中断
//EX0=1;
//开外部中断0
//IT0=1;
EX0=1;
TCON=0x01;
//跳变出发设置
//EX1=1;
TCON=0x05;
voidexter1()interrupt1
uinti;
2000;
speaker=0;
speaker=1;
}
(2)
外部中断0的简单配置应用
#inc