单片机学习程序.docx
- 文档编号:10023666
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:26
- 大小:25.27KB
单片机学习程序.docx
《单片机学习程序.docx》由会员分享,可在线阅读,更多相关《单片机学习程序.docx(26页珍藏版)》请在冰点文库上搜索。
单片机学习程序
4x4键盘C语言程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeBTNTAB[]={0x11,0x21,0x41,0x81,
0x12,0x22,0x42,0x82,
0x14,0x24,0x44,0x84,
0x18,0x28,0x48,0x88};
ucharcodeLEDTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,//0~7
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
voiddelay(uinttimecount)
{uinti;
for(i=0;i>timecount;i++);
return;
}
main()
{uchara,b;
while
(1)
{
do
{
P1=0xF0;
a=P1&0x0F;
}
while(a==0x00);
b=0x01;
do
{
P1=b;
a=P1&0xF0;
if(a!
=0x00)
{
break;
}
else
{
b=b<<1;
}
}
while(b!
=0x10);//
delay(1000);
a=P1&0xF0;
b=b&0x0F;
a=a|b;
b=0x00;
while(a!
=BTNTAB[b])
{
b=b+1;
}
if(b<16)
{
P3=LEDTAB[b];
}
}
}
4x4键盘汇编语言程序:
LINEEQU30H
ROWEQU31H
VALEQU32H
ORG00H
START:
MOVDPTR,#TABLE;段码表首地址
MOVP2,#00H;数码管显示初始化
LSCAN:
MOVP3,#0F0H;列线置高电平,行线置高电平
L1:
JNBP3.0,L2;逐行扫描
LCALLDELAY
JNBP3.0,L2
MOVLINE,#00H;存行号
LJMPRSCAN
L2:
JNBP3.1,L3
LCALLDELAY
JNBP3.1,L3
MOVLINE,#01H;存行号
LJMPRSCAN
L3:
JNBP3.2,L4
LCALLDELAY
JNBP3.2,L4
MOVLINE,#02H;存行号
LJMPRSCAN
L4:
JNBP3.3,L1
LCALLDELAY
JNBP3.3,L1
MOVLINE,#03H;存行号
RSCAN:
MOVP3,#0FH;行线列线电平互换
C1:
JNBP3.4,C2;逐列扫描
MOVROW,#00H;存列号
LJMPCALCU
C2:
JNBP3.5,C3
MOVROW,#01H;存列号
LJMPCALCU
C3:
JNBP3.6,C4
MOVROW,#02H;存列号
LJMPCALCU
C4:
JNBP3.7,C1
MOVROW,#03H;存列号
CALCU:
MOVA,LINE;根据行号和列号计算键值
MOVB,#04H
MULAB
ADDA,ROW
MOVVAL,A;存键值
MOVCA,@A+DPTR;要据键值查段码
MOVP2,A;输出段码显示
LJMPLSCAN
DELAY:
MOVR6,#20
D1:
MOVR7,#250
DJNZR7,$
DJNZR6,D1
RET
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
音阶输出实验C语言程序:
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include
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[i]*2];//置一个音符的值
th0_f=freq[jie8[i]*2+1];
for(n=0;n<50000;n++);//延时1秒左右
}
}
}
乐谱方式输入的音乐播放,仙剑奇侠传C语言程序:
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include
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
}
//******************************
//音乐符号串解释函数
//入口:
要解释的音乐符号串,输出的音调串,输出的时长串
changedata(uchar*song,uchar*diao,uchar*jie)
{
uchari,i1,j;
chargaodi;//高低+/-12音阶
ucharbanyin;//有没有半个升音阶
ucharyinchang;//音长
ucharcodejie7[8]={0,12,14,16,17,19,21,23};//C调的7个值
*diao=*song;
for(i=0,i1=0;;)
{
gaodi=0;//高低=0
banyin=0;//半音=0
yinchang=4;//音长1拍
if((*(song+i)=='|')||(*(song+i)==''))i++;
//拍子间隔和一个空格过滤
switch(*(song+i))
{
case',':
gaodi=-12;i++;//低音
break;
case'`':
gaodi=12;i++;//高音
break;
}
if(*(song+i)==0)//遇到0结束
{
*(diao+i1)=0;//加入结束标志0
*(jie+i1)=0;
return;
}
j=*(song+i)-0x30;i++;//取出基准音
j=jie7[j]+gaodi;//加上高低音
yinc:
switch(*(song+i))
{
case'#':
//有半音j加一个音阶
i++;j++;
gotoyinc;
case'-':
//有一个音节加长
yinchang+=4;
i++;
gotoyinc;
case'_':
//有一个音节缩短
yinchang/=2;
i++;
gotoyinc;
case'.':
//有一个加半拍
yinchang=yinchang+yinchang/2;
i++;
gotoyinc;
}
*(diao+i1)=j;//记录音符
*(jie+i1)=yinchang;//记录音长
i1++;
}
}
//******************************************
//奏乐函数
//入口:
要演奏的音乐符号串
voidplay(uchar*songdata)
{
uchari,c,j=0;
uintn;
ucharxdatadiaodata[112];//音调缓冲
ucharxdatajiedata[112];//音长缓冲
changedata(songdata,diaodata,jiedata);//解释音乐符号串
TR0=1;
for(i=0;diaodata[i]!
=0;i++)//逐个符号演奏
{
tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c for(n=0;n<32000;n++); TR0=0; for(n=0;n<500;n++);//音符间延时 TR0=1; } TR0=0; } //仙剑 ucharcodexianjian[]={ "|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|" "3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.--3_|" "67_6_55_3_|5--3_5_|26_5_32_3_|3---|" "26_6_6-|16_6_66_7_|`17_6_76_7_|3.--3_|" "67_6_55_3_|5--3_5_|67_6_76_7_|3---|" "26_6_6-|16_6_66_7_|`17_6_7.5_|6---|" }; //乐谱方式输入的音乐播放,仙剑奇侠传 voidmain(void)//主程序 { TMOD=0x01;//使用定时器0的16位工作模式 TR0=0; ET0=1; EA=1; while (1) { play(xianjian); } } 三个按键选择三首不同的音乐播放,一个键停止播放的C语言程序: #defineucharunsignedchar//定义一下方便使用 #defineuintunsignedint #defineulongunsignedlong #include charcodedx516[3]_at_0x003b;//这是为了仿真设置的 sbitBEEP=P1^7;//喇叭输出脚 sbitP10=P1^0; 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 } //****************************** //音乐符号串解释函数 //入口: 要解释的音乐符号串,输出的音调串,输出的时长串 changedata(uchar*song,uchar*diao,uchar*jie) { uchari,i1,j; chargaodi;//高低+/-12音阶 ucharbanyin;//有没有半个升音阶 ucharyinchang;//音长 ucharcodejie7[8]={0,12,14,16,17,19,21,23};//C调的7个值 *diao=*song; for(i=0,i1=0;;) { gaodi=0;//高低=0 banyin=0;//半音=0 yinchang=4;//音长1拍 if((*(song+i)=='|')||(*(song+i)==''))i++; //拍子间隔和一个空格过滤 switch(*(song+i)) { case',': gaodi=-12;i++;//低音 break; case'`': gaodi=12;i++;//高音 break; } if(*(song+i)==0)//遇到0结束 { *(diao+i1)=0;//加入结束标志0 *(jie+i1)=0; return; } j=*(song+i)-0x30;i++;//取出基准音 j=jie7[j]+gaodi;//加上高低音 yinc: switch(*(song+i)) { case'#': //有半音j加一个音阶 i++;j++; gotoyinc; cas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 学习 程序