初学单片机.docx
《初学单片机.docx》由会员分享,可在线阅读,更多相关《初学单片机.docx(14页珍藏版)》请在冰豆网上搜索。
初学单片机
单片机89C52之八灯闪烁程序(初学)笨办法--十二种变化
2010-04-2223:
52
#include
sbita0=P1^0;
sbita1=P1^2;
sbita2=P1^4;
sbita3=P1^6;
sbita4=P1^1;
sbita5=P1^3;
sbita6=P1^5;
sbita7=P1^7;
#defineN15
voiddelay(inttime)
{
intx,y;
for(x=time;x>0;x--)
{for(y=1150;y>0;y--);
}
}
//延时程序0.01秒
voidmain()
{
inti,j,j0,j1,j2,j3,j4,j5;
intb0,b1,b2,b3,c0,c1,c2,c3;
while
(1)
{
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
for(j=0;j<4;j++)
{
a0=0;delay(N);a0=1;
a1=0;delay(N);a1=1;
a2=0;delay(N);a2=1;
a3=0;delay(N);a3=1;
a4=0;delay(N);a4=1;
a5=0;delay(N);a5=1;
a6=0;delay(N);a6=1;
a7=0;delay(N);a7=1;
}
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
//--------------------------------------------------------------顺时针跑马灯
for(j0=0;j0<4;j0++)
{
a7=0;delay(N);a7=1;
a6=0;delay(N);a6=1;
a5=0;delay(N);a5=1;
a4=0;delay(N);a4=1;
a3=0;delay(N);a3=1;
a2=0;delay(N);a2=1;
a1=0;delay(N);a1=1;
a0=0;delay(N);a0=1;
}
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
//-------------------------------------------------------逆时针跑马灯
for(j1=0;j1<4;j1++)
{
a0=0;delay(N);a0=1;
a2=0;delay(N);a2=1;
a4=0;delay(N);a4=1;
a6=0;delay(N);a6=1;
a1=0;delay(N);a1=1;
a3=0;delay(N);a3=1;
a5=0;delay(N);a5=1;
a7=0;delay(N);a7=1;
}
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
//----------------------------------------------------------奇偶排列
for(j2=0;j2<4;j2++)
{
a0=0;delay(N);
a1=0;delay(N);
a2=0;delay(N);
a3=0;delay(N);
a4=0;delay(N);
a5=0;delay(N);
a6=0;delay(N);
a7=0;delay(N);
a7=1;delay(N);
a6=1;delay(N);
a5=1;delay(N);
a4=1;delay(N);
a3=1;delay(N);
a2=1;delay(N);
a1=1;delay(N);
a0=1;delay(N);
}
//-------------------------------------------------顺时针灯亮逆时针灯灭
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
for(j3=0;j3<4;j3++)
{
a0=0;a1=0;delay(N);a0=1;a1=1;
a2=0;a3=0;delay(N);a2=1;a3=1;
a4=0;a5=0;delay(N);a4=1;a5=1;
a6=0;a7=0;delay(N);a6=1;a7=1;
//-----------------------------------------------------------顺时针双跑马灯
a7=0;a6=0;delay(N);a7=1;a6=1;
a5=0;a4=0;delay(N);a5=1;a4=1;
a3=0;a2=0;delay(N);a3=1;a2=1;
a1=0;a0=0;delay(N);a1=1;a0=1;
//----------------------------------------------------------逆时针双跑马灯
a0=0;a4=0;delay(N);a0=1;a4=1;
a1=0;a5=0;delay(N);a1=1;a5=1;
a2=0;a6=0;delay(N);a2=1;a6=1;
a3=0;a7=0;delay(N);a3=1;a7=1;
//---------------------------------------------------------顺时针双灯跑马灯
a7=0;a3=0;delay(N);a7=1;a3=1;
a6=0;a2=0;delay(N);a6=1;a2=1;
a5=0;a1=0;delay(N);a5=1;a1=1;
a4=0;a0=0;delay(N);a4=1;a0=1;
}
//------------------------------------------------------逆时针双灯跑马灯
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
for(j4=0;j4<4;j4++)
{
a3=0;a4=0;delay(N);a3=1;a4=1;
a2=0;a5=0;delay(N);a2=1;a5=1;
a1=0;a6=0;delay(N);a1=1;a6=1;
a0=0;a7=0;delay(N);a0=1;a7=1;
//-------------------------------------------------------从中间到两边
a0=0;a7=0;delay(N);a0=1;a7=1;
a1=0;a6=0;delay(N);a1=1;a6=1;
a2=0;a5=0;delay(N);a2=1;a5=1;
a3=0;a4=0;delay(N);a3=1;a4=1;
//-----------------------------------------------------从两边到中间
}
for(j5=0;j5<4;j5++)
{
a3=0;a4=0;delay(N);
a2=0;a5=0;delay(N);
a1=0;a6=0;delay(N);
a0=0;a7=0;delay(N);
//------------------------------------------------------从中间到两边顺序灯
a0=0;a7=0;delay(N);
a1=0;a6=0;delay(N);
a2=0;a5=0;delay(N);
a3=0;a4=0;delay(N);
}
//-----------------------------------------------从两边到中间顺序灯
for(i=0;i<4;i++)
{
//---------------------------------------------------开始
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;//亮
delay(N);
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;//灭
delay(N);
//--------------------------------------------------------------结束
}
for(b0=1,b1=1000;b0<850,b1>0;b0++,b1--)
{
b2=b0;
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;
while(b2>0)
{b2--;}
b3=b1;
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;
while(b3>0)
{b3--;}
}
for(c0=1,c1=1000;c0<850,c1>0;c0++,c1--)
{
c3=c1;
a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;
while(c3>0)
{c3--;}
c2=c0;
a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;a6=0;a7=0;
while(c2>0)
{c2--;}
}
//-----------------------------------------------------调光4秒
}
}
C51单片机初学第十二课
2009-10-2919:
21
第21课按键音试验
你的手机里应该有这个选项,按键时发出嘀的一声,这时为了让用户知道按键已经生效的提示。
我们今天也在我们的试验板上做这个试验,按下K1,就发出短暂的嘀声。
――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include//包括一个52标准内核的头文件
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
sbitP10=P1^0;//LED1
sbitK1=P3^2;
sbitK2=P3^5;
sbitK3=P2^4;
sbitK4=P2^5;
sbitBEEP=P1^7;//喇叭输出脚
bi(ulongt)
{
ulongc;
uintn;
for(c=0;c{
for(n=0;n<50;n++);//延时
BEEP=~BEEP;//取反输出到喇叭的信号
}
}
//按键音试验
voidmain(void)//主程序
{
uintn;
while
(1)
{
if(!
K1)
{
bi(100);//发出按键音
while(!
K1);//等键松开
for(n=0;n<2000;n++);//键去抖
}
}
}
―――――――――――――――――――――
第22课音阶声音输出试验
这一课,我们不再输出简单嘀声了,而是要输出各种不同频率的音乐声。
先输出基本的音阶,12345671。
为了输出准确的音阶频率,我们需要用定时器输出来控制蜂鸣器的驱动,这里用的T0。
我们再每一次定时器中断溢出时取反P17引脚,以形成频率驱动蜂鸣器,定时器0工作在16位方式,需要在中断里重新置入初始值。
这个值就决定了P17输出的频率。
我们在程序里先做好了一张表,预先写好了每个音阶的频率需要设置的初始值。
到时调入对应的值进去T0,不断溢出时就P17可以输出对应的频率。
在这个程序里,我们自动地输出8个音符,每个音符保持1秒钟左右。
―――――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include//包括一个52标准内核的头文件
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
sbitBEEP=P1^7;//喇叭输出脚
ucharth0_f;//在中断中装载的T0的值高8位
uchartl0_f;//在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
ucharcodefreq[36*2]={
0xA9,0xEF,//00220HZ,1//0
0x93,0xF0,//00233HZ,1#
0x73,0xF1,//00247HZ,2
0x49,0xF2,//00262HZ,2#
0x07,0xF3,//00277HZ,3
0xC8,0xF3,//00294HZ,4
0x73,0xF4,//00311HZ,4#
0x1E,0xF5,//00330HZ,5
0xB6,0xF5,//00349HZ,5#
0x4C,0xF6,//00370HZ,6
0xD7,0xF6,//00392HZ,6#
0x5A,0xF7,//00415HZ,7
0xD8,0xF7,//00440HZ1//12
0x4D,0xF8,//00466HZ1#//13
0xBD,0xF8,//00494HZ2//14
0x24,0xF9,//00523HZ2#//15
0x87,0xF9,//00554HZ3//16
0xE4,0xF9,//00587HZ4//17
0x3D,0xFA,//00622HZ4#//18
0x90,0xFA,//00659HZ5//19
0xDE,0xFA,//00698HZ5#//20
0x29,0xFB,//00740HZ6//21
0x6F,0xFB,//00784HZ6#//22
0xB1,0xFB,//00831HZ7//23
0xEF,0xFB,//00880HZ`1
0x2A,0xFC,//00932HZ`1#
0x62,0xFC,//00988HZ`2
0x95,0xFC,//01046HZ`2#
0xC7,0xFC,//01109HZ`3
0xF6,0xFC,//01175HZ`4
0x22,0xFD,//01244HZ`4#
0x4B,0xFD,//01318HZ`5
0x73,0xFD,//01397HZ`5#
0x98,0xFD,//01480HZ`6
0xBB,0xFD,//01568HZ`6#
0xDC,0xFD,//01661HZ`7//35
};
//定时中断0,用于产生唱歌频率
timer0()interrupt1
{
TL0=tl0_f;TH0=th0_f;//调入预定时值
BEEP=~BEEP;//取反音乐输出IO
P2=~P2;
}
//音阶声音自动输出试验
voidmain(void)//主程序
{
ulongn;
uchari;
ucharcodejie8[8]={12,14,16,17,19,21,23,24};//1234567`1八个音符在频率表中的位置
TMOD=0x01;//使用定时器0的16位工作模式
TR0=1;
ET0=1;
EA=1;
while
(1)
{
for(i=0;i<8;i++)//循环播放8个音符
{
tl0_f=freq[jie8*2];//置一个音符的值
th0_f=freq[jie8*2+1];
for(n=0;n<50000;n++);//延时1秒左右
}
}
}
―――――――――――――――――――――――――――――――
请编译,运行。
可以听到8个音符不断循环输出。
第23课按键控制音阶声音输出(电子琴)
上次我们实现了通过蜂鸣器自动输出7个音符的试验,这一课我们用按键控制音符的输出,4个按键输出4个音符,效果就和电子琴的按键一样。
由于平时不能发声,只有按键后才发声,我们用定时器的启动TR0作为声音输出开关。
在发现按键后,送入对应频率值,打开定时器,就发出了声音,延时一阵,再关闭定时器,声音就停止了。
――――――――――――――――――――
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include//包括一个52标准内核的头文件
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
sbitBEEP=P1^7;//喇叭输出脚
sbitK1=P3^2;
sbitK2=P3^5;
sbitK3=P2^4;
sbitK4=P2^5;
ucharth0_f;//在中断中装载的T0的值高8位
uchartl0_f;//在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
ucharcodefreq[36*2]={
0xA9,0xEF,//00220HZ,1//0
0x93,0xF0,//00233HZ,1#
0x73,0xF1,//00247HZ,2
0x49,0xF2,//00262HZ,2#
0x07,0xF3,//00277HZ,3
0xC8,0xF3,//00294HZ,4
0x73,0xF4,//00311HZ,4#
0x1E,0xF5,//00330HZ,5
0xB6,0xF5,//00349HZ,5#
0x4C,0xF6,//00370HZ,6
0xD7,0xF6,//00392HZ,6#
0x5A,0xF7,//00415HZ,7
0xD8,0xF7,//00440HZ1//12
0x4D,0xF8,//00466HZ1#//13
0xBD,0xF8,//00494HZ2//14
0x24,0xF9,//00523HZ2#//15
0x87,0xF9,//00554HZ3//16
0xE4,0xF9,//00587HZ4//17
0x3D,0xFA,//00622HZ4#//18
0x90,0xFA,//00659HZ5//19
0xDE,0xFA,//00698HZ5#//20
0x29,0xFB,//00740HZ6//21
0x6F,0xFB,//00784HZ6#//22
0xB1,0xFB,//00831HZ7//23
0xEF,0xFB,//00880HZ`1
0x2A,0xFC,//00932HZ`1#
0x62,0xFC,//00988HZ`2
0x95,0xFC,//01046HZ`2#
0xC7,0xFC,//01109HZ`3
0xF6,0xFC,//01175HZ`4
0x22,0xFD,//01244HZ`4#
0x4B,0xFD,//01318HZ`5
0x73,0xFD,//01397HZ`5#
0x98,0xFD,//01480HZ`6
0xBB,0xFD,//01568HZ`6#
0xDC,0xFD,//01661HZ`7//35
};
//定时中断0,用于产生唱歌频率
timer0()interrupt1
{
TL0=tl0_f;TH0=th0_f;//调入预定时值
BEEP=~BEEP;//取反音乐输出IO
}
//按键控制音阶声音输出(电子琴)
voidmain(void)//主程序
{
ulongn;
ucharcodejie8[8]={12,14,16,17,19,21,23,24};//1234567`1八个音符在频率表中的位置
TMOD=0x01;//使用定时