单片机实验一二三.docx
《单片机实验一二三.docx》由会员分享,可在线阅读,更多相关《单片机实验一二三.docx(34页珍藏版)》请在冰点文库上搜索。
![单片机实验一二三.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/2628fd7a-373c-452d-a35e-2698735418e8/2628fd7a-373c-452d-a35e-2698735418e81.gif)
单片机实验一二三
=实验一简单程序设计实验
一、实验目的
掌握单片机程序设计的基本方法,熟悉程序交叉编译和调试执行的过程。
二、实验器材
1、PC机(安装Keil软件)1台
2、实验开发板1块
3、U-EC5型仿真器1只
4、直流稳压电源1台
三、实验要求
1、课前温习和回顾C语言程序设计方面的知识。
2、搭建集成开发环境(参考所给实验附件中《Keil软件与仿真驱动程序安装.doc》)。
3、编写简单的C程序,熟悉Keil环境下的调试方法,包括跟踪、单步运行和断点设置等。
4、仔细观察实验板电路图,并结合《C8051F411数据手册》给出自己I/O端口配置方案。
5、编写程序,实现LED的亮灭、蜂鸣器的鸣叫以及按键状态识别等控制功能。
四、扩充实验(思考题)
1、如何实现蜂鸣器的间歇鸣叫(1秒)?
2、如何实现依次点亮LED的控制功能?
实验代码:
#include"c8051F410.h"
#defineOLD_BOARD
#ifdefOLD_BOARD
sbitLED8=P1^7;
sbitLED7=P1^6;
sbitLED6=P1^5;
sbitLED5=P1^4;
sbitLED4=P1^3;
sbitLED3=P1^2;
sbitLED2=P1^1;
sbitLED1=P1^0;
sbitKEY5=P2^2;
sbitKEY4=P2^1;
sbitKEY3=P2^0;
sbitKEY2=P0^2;
sbitKEY1=P0^1;
sbitSPKOUT=P0^0;
#else
sbitLED8=P2^1;
sbitLED7=P2^0;
sbitLED6=P0^7;
sbitLED5=P0^6;
sbitLED4=P0^3;
sbitLED3=P0^2;
sbitLED2=P0^1;
sbitLED1=P0^0;
sbitKEY5=P1^7;
sbitKEY4=P1^6;
sbitKEY3=P1^5;
sbitKEY2=P1^4;
sbitKEY1=P1^3;
sbitSPKOUT=P2^2;
#endif
voiddelay(intm){
inti,j;
for(i=0;i<100;i++)
for(j=0;j<250*m;j++);
}
voidinit(void);//初始化子程序
voidmain()
{
unsignedchari;
init();//初始化子程序
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=1;
SPKOUT=0;
for(i=1;i<9;i++)
{
SPKOUT=1;
LED1=0;
delay(50);
SPKOUT=0;
LED2=0;
delay(50);
SPKOUT=1;
LED3=0;
delay(50);
SPKOUT=0;
LED4=0;
delay(50);
SPKOUT=1;
LED5=0;
delay(50);
SPKOUT=0;
LED6=0;
delay(50);
SPKOUT=1;
LED7=0;
delay(50);
SPKOUT=0;
LED8=0;
delay(50);
P1=0xff;
delay(50);
}
}
voidinit(void)
{
PCA0MD=0x00;//关闭WDT控制
OSCICN=0xc7;//设置内部振荡器工作(使用内部晶振24.5MHz)
#ifdefOLD_BOARD
P0MDIN=0xFF;
P0MDOUT=0x11;
P0SKIP=0xCF;
P1MDIN=0xFF;
P1MDOUT=0x00;
P1SKIP=0xFF;
P2MDIN=0xFF;
P2MDOUT=0x04;
P2SKIP=0xFF;
#else
P0MDIN=0xFF;
P0MDOUT=0x10;
P0SKIP=0xCF;
P1MDIN=0xFF;
P1MDOUT=0x00;
P1SKIP=0xFF;
P2MDIN=0xFF;
P2MDOUT=0x04;
P2SKIP=0xFF;
#endif
XBR0=0x01;
XBR1=0x41;
}
结果截图
实验二单片机内部接口实验
一、实验目的
深入理解C8051F411单片机内部的定时器/计数器和串行接口的工作原理;熟悉单片机通过RS232与PC机进行通信的过程;了解单片机的接口调试方法。
二、实验器材
1、PC机(安装Keil软件)1台
2、实验开发板1块
3、U-EC5型仿真器1只
4、直流稳压电源1台
5、母对母交叉串口线1根
三、实验要求
1、课前阅读《C8051F411数据手册》,重点了解系统中断、UART等方面的内容
2、编写串口通信程序,实现将PC机发送过来的字符再回送给PC机。
利用串口监视器软件(实验附件中提供)监视此过程。
四、扩充实验(思考题)
1、如何在PC端通过串口下达指令,点亮某一LED,控制蜂鸣器响或不响?
实验代码:
#include
#include"../inc/config.h"
#include"../uart/uart.h"
unsignedcharxdataRdBuf[100];
#defineOLD_BOARD
#ifdefOLD_BOARD
sbitLED8=P1^7;
sbitLED7=P1^6;
sbitLED6=P1^5;
sbitLED5=P1^4;
sbitLED4=P1^3;
sbitLED3=P1^2;
sbitLED2=P1^1;
sbitLED1=P1^0;
sbitKEY5=P2^2;
sbitKEY4=P2^1;
sbitKEY3=P2^0;
sbitKEY2=P0^2;
sbitKEY1=P0^1;
sbitSPKOUT=P0^0
#else
//板级配置
//sbitSCOMEN=P2^3;
sbitLED8=P2^1;
sbitLED7=P2^0;
sbitLED6=P0^7;
sbitLED5=P0^6;
sbitLED4=P0^3;
sbitLED3=P0^2;
sbitLED2=P0^1;
sbitLED1=P0^0;
sbitKEY5=P1^7;
sbitKEY4=P1^6;
sbitKEY3=P1^5;
sbitKEY2=P1^4;
sbitKEY1=P1^3;
sbitSPKOUT=P2^2;
#endif
//配置初始化
voidinit(void)
{
PCA0MD=0x00;//关闭WDT控制
OSCICN=0xc7;//设置内部振荡器工作(使用内部晶振24.5MHz)
#ifdefOLD_BOARD
P0MDIN=0xFF;//端口0INPUTMODE寄存器设置初值
P0MDOUT=0x11;//端口0OUTPUTMODE寄存器设置初值
P0SKIP=0xCF;//端口0SKIP寄存器设置初值
P1MDIN=0xFF;//端口1INPUTMODE寄存器设置初值
P1MDOUT=0x00;//端口1OUTPUTMODE寄存器设置初值
P1SKIP=0xFF;//端口1SKIP寄存器设置初值
P2MDIN=0xFF;//端口2INPUTMODE寄存器设置初值
P2MDOUT=0x04;//端口2OUTPUTMODE寄存器设置初值
P2SKIP=0xFF;//端口2SKIP寄存器设置初值
#else
P0MDIN=0xF0;//端口0INPUTMODE寄存器设置初值
P0MDOUT=0x10;//端口0OUTPUTMODE寄存器设置初值
P0SKIP=0xCF;//端口0SKIP寄存器设置初值
P1MDIN=0xFF;//端口1INPUTMODE寄存器设置初值
P1MDOUT=0x00;//端口1OUTPUTMODE寄存器设置初值
P1SKIP=0xFF;//端口1SKIP寄存器设置初值
P2MDIN=0xFF;//端口2INPUTMODE寄存器设置初值
P2MDOUT=0x04;//端口2OUTPUTMODE寄存器设置初值
P2SKIP=0xFF;//端口2SKIP寄存器设置初值
#endif
XBR0=0x01;//端口I/O交叉开关寄存器0设置初值
XBR1=0x41;//端口I/O交叉开关寄存器1设置初值
TMOD=0x21;
TCON=0x05;
TH0=TIMER0CNT/256;
TL0=TIMER0CNT;
TR0=1;
IP=0x00;
ET0=1;
//串口初始化
PCON=0x00;
SCON0=0x50;
TMOD=0x21;
TH1=TL1=TIME1CNT;
TR1=1;
ES0=1;
//SCOMEN=0;
EA=1;
}
voidTime0_ISR(void)interruptINTERRUPT_TIMER0
{
staticintCounter=0;
Counter++;
if(Counter>999)
{
Counter=0;
if(RdBuf[99]==1)
{SPKOUT=!
SPKOUT;
LED5=0;
LED2=0;
LED1=0;
SendBytes("内蒙古工业大学欢迎你!
\r\n",24);
RdBuf[99]=0;
}
}
TH0=TIMER0CNT/256;
TL0=TIMER0CNT;
TR0=1;
}
voidmain(void)
{
intlen=0;
intdelayNum=240000;
init();
SPKOUT=0;
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=1;
RdBuf[99]=0;
for(;;)
{
if(len=ReadBytes(RdBuf))
{
RdBuf[99]=1;
}
if(KEY1==0)
{
while(--delayNum);
if(KEY1==0)
SPKOUT=!
SPKOUT;
}
}
}
结果截图:
实验三单片机实现电子音乐
一、实验目的
深入理解C8051F411单片机内部的定时器/计数器和串行接口的工作原理;熟悉单片机通过RS232与PC机进行通信的过程;了解单片机的接口调试方法。
二、实验器材
1、PC机(安装Keil软件)1台
2、实验开发板1块
3、U-EC5型仿真器1只
4、直流稳压电源1台
5、母对母交叉串口线1根
三、实验要求
利用现有资源做一个单片机的八音盒,五个按键切换五首歌曲,并且八个led灯可以随着曲调闪烁。
实验代码:
#include"c8051F410.h"
#defineOLD_BOARD//如果使用旧电路板,必须定义此语句!
!
#ifdefOLD_BOARD
sbitLED8=P1^7;
sbitLED7=P1^6;
sbitLED6=P1^5;
sbitLED5=P1^4;
sbitLED4=P1^3;
sbitLED3=P1^2;
sbitLED2=P1^1;
sbitLED1=P1^0;
sbitKEY5=P2^2;
sbitKEY4=P2^1;
sbitKEY3=P2^0;
sbitKEY2=P0^2;
sbitKEY1=P0^1;
sbitSPKOUT=P0^0;
#else
sbitSPKOUT=P2^2;
#endif
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
//sbitSPKOUT=P2^0;//接蜂鸣器管脚
ucharth0_f;
uchartl0_f;
//ucharfuhao[];
ucharcodejie8[8]={12,14,16,17,19,21,23,24};
/**************************中断函数*******************************************/
timer0()interrupt1
{
TL0=tl0_f;TH0=th0_f;
SPKOUT=~SPKOUT;//取反音乐输出IO
/*
LED8=~LED8;
LED7=~LED7;
LED6=~LED6;
LED5=~LED5;
LED4=~LED4;
LED3=~LED3;
LED2=~LED2;
LED1=~LED1;
*/
//P1=~P1;
//LED1=~LED1;
/*
switch(fuhao){
case1:
LED1=~LED1;
break;//7
case2:
LED2=~LED2;
break;//7
case3:
LED3=~LED3;
break;//7
case4:
LED4=~LED4;
break;//7
case5:
LED5=~LED5;
break;//7
case6:
LED6=~LED6;
break;//7
case7:
LED7=~LED7;
break;//7
default:
break;
}
*/
}
/********************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
};
/***************************音乐符号串解释函数****************************/
//入口:
要解释的音乐符号串,输出的音调串,输出的时长串
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);
//fuhao[i]=j;
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;
uchardiaodata[48];//音调缓冲
ucharjiedata[48];//音长缓冲
changedata(songdata,diaodata,jiedata);//解释音乐符号串
TR0=1;
while
(1)/////////////////////////////////////////////P0=0xff
{
for(i=0;diaodata[i]!
=0;i++)//逐个符号演奏
{
//LED1=~LED1;
//LED4=~LED4;
if(diaodata[i]==12){
LED1=~LED1;
}
if(diaodata[i]==14){
LED2=~LED2;
}
if(diaodata[i]==16){
LED3=~LED3;
}
if(diaodata[i]==17){
LED4=~LED4;
}
if(diaodata[i]==19){
LED5=~LED5;
}
if(diaodata[i]==21){
LED6=~LED6;
}
if(diaodata[i]==23){
LED7=~LED7;
}
tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c{
for(n=0;n<50500;n++);//29500
//if(P1!
=0xff)//(