您好,欢迎访问三七文档
单片机原理实验报告学年:______________学期:______________专业:09电子信息工程班级:______________姓名:____Pred______学号:______________指导老师:___________日期:年月日2目录contents1.I/O输入、输出实验…………………………………………………………………32.数码管动态扫描显示实验……………….….………………………………………63.键盘输入实验………………….……………………………………….……………94.定时/计数器…………………………………………………………………………125.音频控制实验……………………………..…………………………………………166.串行口通信………………………………..…………………………………………22说明:1.6个实验程序均在伟纳电子ME830单片机实验板上调试成功。Mcu是AT89S52。2.音频控制实验源码来自网上,若想在晶振11.0592mhz上运行,只需更改输出频率表格的定时器初值即可。同时,由于程序占用233字节data,写入普通51mcu是运行不了的,这里我是用ICE52仿真器运行。3.串行口通信实验中上位机使用伟纳电子的串口调试软件,可以到其官方网站下载。4.由于本次实验旨在达到实验目的,程序本身存在很多不完善的地方,如:定时计数器实验中取位运算中耗费大量时间,导致显示过程出现闪烁现象。5.电路原理图在prorel99se上画的,不能保证原理图的正确。(我还没学呢….)3实验一:I/O口输入/输出实验1.实验任务流水灯单循环,P0口接八个共阳发光二极管,分别为D0、D1……D7。程序先点亮D0,延时一段时间(1秒钟),再顺序点亮D1……D7,然后又是D0。同时只能有一个灯亮。设晶振频率fosc=11.0592MHz,要求亮灯1秒后下一个灯点亮。2.实验原理图3.系统板上硬件连接44.程序设计内容1)先计算好定时器初值,并载入TH0,TL02)等待定时器中断响应,响应后累次叠加到1s时,设置标志位3)检测标志位,点灭上一个灯,点亮点一个灯4)判断是否点亮第七个灯,是则下一个点亮第零个灯,否则跳过5.程序框图6.C语言源程序#includereg52.h#defineucharunsignedchar#defineLEDPORTP0bitledturn=0;//设置亮灯标志chari=0;ucharcodeledlight[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//led亮起顺序voidmain()NYNY开始储存显示顺序定时器使能中断使能LED=1?i7?i=0中断响应T==20?TF=0;T++;T=0;LED=1,;结束LED=0;显示数据端口;i++;Y5{RCAP2H=0x4C;//定时器2,晶振11.0592MHz,单次定时50msRCAP2L=0x00;ET2=1;//定时器2中断允许EA=1;//中断允许TR2=1;//开始计时while(1)//进入死循环{if(ledturn){ledturn=0;LEDPORT=ledlight[i];i++;if(i==8)i=0;}}}timer2()interrupt5//定时器2终端服务程序{staticuchart;TF2=0;//溢出清0t++;if(t==20){t=0;//取消标志ledturn=1;//设置亮灯标志}}7.数据分析这里实现流水灯单循环的方法是,依次灭掉前一个灯和点亮后一个灯,再延时一会,不断循环,当点亮到D07时候,下一个是点亮D00。如此,就可以看到流水灯单循环的效果了。6实验二:数码管动态扫描显示实验1.实验任务在动态共阳数码管上显示89C51字样2.实验原理图3.系统板上硬件连接4.程序设计内容71)先准备好要显示的数据,放入相应的显示存储单元中。2)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。3)根据使用数码管的个数来确定扫描的位数。4)查表将要显示的数据转换为能使数码管正确显示相对应的段码。5)分时送段码和位码,数码管开始循环显示。5.程序框图6.C语言源程序#includereg52.h#defineucharunsignedcharucharcodedig[]={0x10,0x08,0x04,0x02,0x01};//位码ucharcodedisplay[]={0x80,0x90,0xC6,0x92,0xF9};//段码uchari=0;voiddelayms(unsignedintms){unsignedchark;while(ms--){for(k=0;k114;k++)YN开始存段码存位码输出段码到P0输出位码到P2i=7?i=0用i取段码用i取位码i++8;}}voidmain(){P2=0xFF;P0=0xFF;while(1){P2=0xff;P0=display[i];P2=~dig[i];delayms(1);i++;if(i==5)i=0;}}7.数据分析显示89C51字样主要依靠人的视觉停留效应,先选中第一个数码管,送入段码显示1,延迟一段时间后关闭段码,选中第二个数码管,送入段码显示2,再延迟一会儿,不断循环,直到显示到第五个数码管,再次选中第一个数码管….,这样就可以在数码管上看到89C51了。9实验三:键盘输入实验1.实验任务在键盘上按K1、K2、K3、K4后分别在数码管上显示1、2、3、4。2.实验原理图3.系统板上硬件连接4.程序设计内容1)先准备好要显示的数据,放入相应的显示存储单元中。2)判断是否有按键按下,有则逐个检查那个按键。3)根据按下的键值,送显示数据到数码管105.程序框图6.C语言源程序#includereg52.h#defineucharunsignedcharucharcodedisplay[]={0xf9,0xa4,0xb0,0x99};sbitk1=P1^4;sbitk2=P1^5;sbitk3=P1^6;sbitk4=P1^7;voiddelayms(ucharms)//延时子函数,ms{uchari;while(ms--){YYYYYYNNNN开始储存显示数据数码管初始化按键按下?!K1?!K2?!K3?!K4?P0=display[1]P0=display[0]P0=display[3]P0=display[2]按键松开?N11for(i=0;i114;i++);}}voidmain(void){P2=0xFE;//数码管初始化P0=~(0x40);P1=0xFF;//按键初始化while(1){if(P1!=0xFF){delayms(20);if(P1!=0xFF){if(!k1)P0=display[0];elseif(!k2)P0=display[1];elseif(!k3)P0=display[2];elseP0=display[3];while(P1!=0xFF);}}}}7.数据分析程序判断是否有按键按下,有则延迟一段时间后重新判断,有按键按下进入键值判断,否则返回。进入判断键值后,把相应的键值转为数值再转为段码送入数码管显示,进入一个“死循环”,直到按键松开后弹出。12实验四:定时/计数器1.实验任务设置一个定时器/计数器,分辨率为0.1S,并在数码管上显示2.实验原理图3.系统板上硬件连接4.程序设计内容1)先准备好要显示的数据,放入相应的显示存储单元中。2)调整定时器初始值,每隔0.1S向时间累加器加一。3)根据时间累加器的值分别取毫秒、秒、十秒等位并送入相应寄存器储存。4)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。5)查表将要显示的数据转换为能使数码管正确显示相对应的段码。6)分时送段码和位码,数码管开始循环显示。135.程序框图6.C语言源程序#includereg52.hunsignedcharcodedisplay[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//设置位码unsignedcharcodedig[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//设置段码unsignedcharnum[9]={0,0,0,0,0,0,0,0};unsignedchari,j,once=1;voiddelayms(unsignedcharms){chari;NYYN开始储存段码储存位码定时器2使能中断使能数码管初始化j=0P2=~(dig[(j)]);P0=display[num[j]];j++;j==8?中断响应t=2?TF2=0;t++;timer++;时间分权位储存num[7];t=0;结束j=0;14while(ms--){for(i=0;i80;i++);}}voidmain(void){RCAP2H=0x4C;//定时器2载入初始值,时长50msRCAP2L=0x00;TR2=1;ET2=1;EA=1;P2=0xFF;//数码管初始化P0=0xFF;while(1){for(i=0;i7;i++){P0=0xFF;//关显示去除“鬼影”P2=~(dig[(j)]);//送位码P0=display[num[j]];送段码delayms(1);j++;if(j==8)j=0;}}}timer()interrupt5//中断服务{staticunsignedlongtimer=0;TF2=0;P2=0xFF;//关显示,消除显示抖动if(once==2)//中断两次,累加一次{once=0;timer++;num[0]=timer%10;//个num[1]=timer/10%10;//十num[2]=timer/100%10;//百num[3]=timer/1000%10;//千num[4]=timer/10000%10;//万15num[5]=timer/100000%10;//十万num[6]=timer/1000000%10;//百万num[7]=timer/10000000%10;//千万}once++;P2=~(dig[(j)]);//恢复显示}7.数据分析上电复位后可以在数码管上看到程序从零开始计时,精度为0.1S。这里显示数字的方法同实验二的数码管动态扫描显示实验的原理一样,所不同的是程序根据一定的时序改变送入数码管的段码。程序每隔0.1S更新一次显示数据,即在循环显示的时候通过中断服务程序,累加时间,取各权值数值换成段码。16实验五:音频控制实验1.实验任务上电复位后在蜂鸣器上响起音乐。2.实验原理图3.系统板上硬件连接4.程序设计内容1)储存产生不同频率的中断初始值。2)乐谱解释函数:遇到拍子分隔符和空格跳过,判断是否高低音,读音符,调整为高低音音符,读音符后的升半个音符的“#”,读延长音“-”“.”,读缩短一半音长的“_”,字符串结束符“0x00”3)音乐播放函数:将音符频率的序号数组对应的频率送入定时器预置数中,再延时对应音符播放的时间。4)乐谱书写规则:1234567为7个基本音阶前面加逗号','表示这是低音17前面加上点号'`'表示这是高音后面加'#',表示这个音符升半个音阶后面加'.',表示这个音符要再加长自身一半的延时后面加一个或多个'-',每个表示延时一拍后面加一个或多个'_',表示这个音符要缩短自身一半的时长,最多支持2个'_'。5.程序框图6.C语言源程序#defineucharunsignedchar//定义一下方便使用#defineuintunsignedint#defineulongunsignedlong#includereg52.h//包括一个52标准内核的头文件charcodedx516[3]_at_0x003b;//仿真头中断用sbitBEEP=P1^7;//喇叭输出脚ucharth0_f;//在中断中装载的T0的值高8位ucha
本文标题:61单片机实验报告
链接地址:https://www.777doc.com/doc-6007207 .html