ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:665.79KB ,
资源ID:6609272      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6609272.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最新版单片机实验报告2814596.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

最新版单片机实验报告2814596.docx

1、最新版单片机实验报告2814596单片机原理实验报告学 年: _学 期: _专 业: 09电子信息工程班 级: _姓 名: _Pred_学 号: _指导老师:_日期: 年 月 日目录 contents1. I/O输入、输出实验 32. 数码管动态扫描显示实验. 63. 键盘输入实验. 94. 定时/计数器 125. 音频控制实验. 166. 串行口通信. 22说明:1. 6个实验程序均在伟纳电子ME830单片机实验板上调试成功。Mcu是AT89S52。 2.音频控制实验源码来自网上,若想在晶振11.0592mhz上运行,只需更改输出频率表格的定时器初值即可。同时,由于程序占用233字节data

2、,写入普通51mcu是运行不了的,这里我是用ICE52仿真器运行。 3.串行口通信实验中上位机使用伟纳电子的串口调试软件,可以到其官方网站下载。 4.由于本次实验旨在达到实验目的,程序本身存在很多不完善的地方,如:定时计数器实验中取位运算中耗费大量时间,导致显示过程出现闪烁现象。 5.电路原理图在prorel99se上画的,不能保证原理图的正确。(我还没学呢.)实验一:I/O口输入/输出实验1. 实验任务流水灯单循环,P0口接八个共阳发光二极管,分别为D0、D1D7。程序先点亮D0,延时一段时间(1秒钟),再顺序点亮D1D7,然后又是D0。同时只能有一个灯亮。设晶振频率fosc=11.0592

3、MHz,要求亮灯1秒后下一个灯点亮。2. 实验原理图3. 系统板上硬件连接4. 程序设计内容1) 先计算好定时器初值,并载入TH0,TL02) 等待定时器中断响应,响应后累次叠加到1s时,设置标志位3) 检测标志位,点灭上一个灯,点亮点一个灯4) 判断是否点亮第七个灯,是则下一个点亮第零个灯,否则跳过5. 程序框图6. C语言源程序#include#define uchar unsigned char#define LEDPORT P0bit ledturn=0; /设置亮灯标志char i=0;uchar code ledlight8=0xFE,0xFD,0xFB,0xF7,0xEF,0xD

4、F,0xBF,0x7F; /led亮起顺序void main()RCAP2H=0x4C; /定时器2 ,晶振11.0592MHz,单次定时50msRCAP2L=0x00;ET2=1; /定时器2中断允许EA=1; /中断允许TR2=1; /开始计时while(1) /进入死循环 if(ledturn) ledturn=0; LEDPORT=ledlighti ; i+; if(i=8)i=0; timer2() interrupt 5 /定时器2终端服务程序static uchar t; TF2=0; /溢出清0t+;if(t=20) t=0; /取消标志 ledturn=1; /设置亮灯标志

5、 7. 数据分析这里实现流水灯单循环的方法是,依次灭掉前一个灯和点亮后一个灯,再延时一会,不断循环,当点亮到D07时候,下一个是点亮D00。如此,就可以看到流水灯单循环的效果了。实验二:数码管动态扫描显示实验1. 实验任务在动态共阳数码管上显示89C51字样2. 实验原理图3. 系统板上硬件连接4. 程序设计内容1)先准备好要显示的数据,放入相应的显示存储单元中。 2)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。 3)根据使用数码管的个数来确定扫描的位数。 4)查表将要显示的数据转换为能使数码管正确显示相对应的段码。 5)分时送段码和位码,数码管开始循环显示。5. 程序框图6. C语

6、言源程序#include#define uchar unsigned charuchar code dig=0x10,0x08,0x04,0x02,0x01; /位码uchar code display=0x80,0x90,0xC6,0x92,0xF9; /段码uchar i=0;void delayms( unsigned int ms ) unsigned char k; while (ms-) for (k = 0; k 114; k+) ; void main()P2=0xFF;P0=0xFF;while(1) P2=0xff; P0=displayi; P2=digi ; delay

7、ms(1) ; i+; if(i=5) i=0; 7. 数据分析显示89C51字样主要依靠人的视觉停留效应,先选中第一个数码管,送入段码显示1,延迟一段时间后关闭段码,选中第二个数码管,送入段码显示2,再延迟一会儿,不断循环,直到显示到第五个数码管,再次选中第一个数码管.,这样就可以在数码管上看到89C51了。实验三:键盘输入实验1. 实验任务在键盘上按K1、K2、K3、K4后分别在数码管上显示1、2、3、4。2. 实验原理图3. 系统板上硬件连接4. 程序设计内容1) 先准备好要显示的数据,放入相应的显示存储单元中。2) 判断是否有按键按下,有则逐个检查那个按键。3) 根据按下的键值,送显示

8、数据到数码管5. 程序框图6. C语言源程序#include#define uchar unsigned charuchar code display=0xf9,0xa4,0xb0,0x99; sbit k1=P14;sbit k2=P15;sbit k3=P16;sbit k4=P17;void delayms(uchar ms) /延时子函数,msuchar i;while(ms-) for(i=0;i114;i+); void main(void)P2=0xFE; /数码管初始化P0=(0x40); P1=0xFF; /按键初始化 while(1) if(P1!=0xFF) delaym

9、s(20); if(P1!=0xFF) if(!k1)P0=display0; else if(!k2)P0=display1; else if(!k3)P0=display2; else P0=display3; while(P1!=0xFF) ; 7. 数据分析程序判断是否有按键按下,有则延迟一段时间后重新判断,有按键按下进入键值判断,否则返回。进入判断键值后,把相应的键值转为数值再转为段码送入数码管显示,进入一个“死循环”,直到按键松开后弹出。实验四:定时/计数器1. 实验任务设置一个定时器/计数器,分辨率为0.1S,并在数码管上显示2. 实验原理图3. 系统板上硬件连接4. 程序设计内

10、容1)先准备好要显示的数据,放入相应的显示存储单元中。 2)调整定时器初始值,每隔0.1S向时间累加器加一。 3)根据时间累加器的值分别取毫秒、秒、十秒等位并送入相应寄存器储存。4)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。 5) 查表将要显示的数据转换为能使数码管正确显示相对应的段码。 6)分时送段码和位码,数码管开始循环显示。5. 程序框图6. C语言源程序#includeunsigned char code display = 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90; /设置位码unsigned c

11、har code dig=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; /设置段码unsigned char num9= 0,0;unsigned char i,j,once=1;void delayms(unsigned char ms)char i;while(ms-)for(i=0;i80;i+);void main(void)RCAP2H=0x4C; /定时器2载入初始值,时长50msRCAP2L=0x00;TR2=1;ET2=1;EA=1;P2=0xFF; /数码管初始化P0=0xFF; while(1) for(i=0;i7;i+) P0=0xF

12、F; /关显示去除“鬼影” P2=(dig(j); /送位码 P0=displaynumj; 送段码 delayms(1) ; j+; if(j=8)j=0; timer() interrupt 5 /中断服务 static unsigned long timer=0;TF2=0;P2=0xFF; /关显示,消除显示抖动 if(once=2) /中断两次,累加一次 once=0; timer+; num0=timer%10; /个 num1=timer/10%10; /十 num2=timer/100%10; /百 num3=timer/1000%10; /千 num4=timer/10000

13、%10; /万 num5=timer/100000%10; /十万 num6=timer/%10; /百万 num7=timer/%10; /千万once+; P2=(dig(j); /恢复显示7. 数据分析上电复位后可以在数码管上看到程序从零开始计时,精度为0.1S。这里显示数字的方法同实验二的数码管动态扫描显示实验的原理一样,所不同的是程序根据一定的时序改变送入数码管的段码。程序每隔0.1S更新一次显示数据,即在循环显示的时候通过中断服务程序,累加时间,取各权值数值换成段码。实验五:音频控制实验1. 实验任务上电复位后在蜂鸣器上响起音乐。2. 实验原理图3. 系统板上硬件连接4. 程序设计

14、内容1) 储存产生不同频率的中断初始值。2) 乐谱解释函数:遇到拍子分隔符和空格跳过,判断是否高低音,读音符,调整为高低音音符,读音符后的升半个音符的“#”,读延长音“-”“.”,读缩短一半音长的“_”,字符串结束符“0x00”3) 音乐播放函数:将音符频率的序号数组对应的频率送入定时器预置数中,再延时对应音符播放的时间。4)乐谱书写规则:1 2 3 4 5 6 7 为 7 个基本音阶 前面加逗号,表示这是低音 前面加上点号表示这是高音 后面加#,表示这个音符升半个音阶 后面加.,表示这个音符要再加长自身一半的延时 后面加一个或多个-,每个表示延时一拍 后面加一个或多个_,表示这个音符要缩短自

15、身一半的时长,最多支持 2 个_。5. 程序框图6. C语言源程序#define uchar unsigned char /定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include /包括一个 52 标准内核的头文件 char code dx5163 _at_ 0x003b;/仿真头中断用 sbit BEEP=P17; /喇叭输出脚 uchar th0_f; /在中断中装载的 T0 的值高 8 位 uchar tl0_f; /在中断中装载的 T0 的值低 8 位/T0 的值,及输出频率对照表 uchar co

16、de freq36*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,/0044

17、0HZ 1 /12 0x4D,0xF8,/00466HZ 1# /13 0xBD,0xF8,/00494HZ 2 /14 0x24,0xF9,/00523HZ 2# /15 0x87,0xF9,/00554HZ 3 /16 0xE4,0xF9,/00587HZ 4 /17 0x3D,0xFA,/00622HZ 4# /18 0x90,0xFA,/00659HZ 5 /19 0xDE,0xFA,/00698HZ 5# /20 0x29,0xFB,/00740HZ 6 /21 0x6F,0xFB,/00784HZ 6# /22 0xB1,0xFB,/00831HZ 7 /23 0xEF,0xFB,

18、/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() interrupt 1 TL0=tl0_f

19、;TH0=th0_f; /调入预定时值 BEEP=BEEP; /取反音乐输出 IO /* /音乐符号串解释函数 /入口:要解释的音乐符号串,输出的音调串,输出的时长串 changedata(uchar *song,uchar *diao,uchar *jie) uchar i,i1,j; char gaodi; /高低+/-12 音阶 uchar banyin;/有没有半个升音阶 uchar yinchang;/音长 uchar code jie78= ; /C 调的 7 个值 *diao=*song; for(i=0,i1=0;) gaodi=0; /高低=0 banyin=0;/半音=0

20、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=jie7j+gaodi; /加上高低音 yinc: switch(*(song+i) case #:

21、/有半音 j 加一个音阶 i+;j+; goto yinc; case -: /有一个音节加长 yinchang+=4; i+; goto yinc; case _: /有一个音节缩短 yinchang/=2; i+; goto yinc; case .: /有一个加半拍 yinchang=yinchang+yinchang/2; i+; goto yinc; *(diao+i1)=j; /记录音符 *(jie+i1)=yinchang; /记录音长 i1+; /* /奏乐函数 /入口:要演奏的音乐符号串 void play(uchar *songdata) uchar i,c,j=0; ui

22、nt n; uchar xdata diaodata112; /音调缓冲 uchar xdata jiedata112; /音长缓冲 changedata(songdata,diaodata,jiedata); /解释音乐符号串 TR0=1; for(i=0;diaodatai!=0;i+) /逐个符号演奏 tl0_f=freqdiaodatai*2; /取出对应的定时值送给 T0 th0_f=freqdiaodatai*2+1; for(c=0;cjiedatai;c+) /按照音长延时 for(n=0;n32000;n+); TR0=0; for(n=0;n500;n+); /音符间延时

23、TR0=1; TR0=0; /仙剑乐谱 uchar code xianjian= |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-| ; /乐谱方式输入的音乐播放,仙剑奇侠传 void main

24、(void) / 主程序 TMOD = 0x01; /使用定时器 0 的 16 位工作模 TR0 = 0; ET0 = 1; EA = 1; while(1) play(xianjian); 7. 数据分析实验中蜂鸣器响起的音乐是由单片机输出高、低电平上实现的。其中音调是由改变中断响应时间控制的,节拍是由改变中断循环次数实现的。实验前先在乐谱函数中保存所要播放的乐谱,编译运行后有乐谱解释函数逐字节解释乐谱的字符,音乐播放函数接受来自乐谱解释函数的值,控制循环中断次数、中断响应时间,中断响应后取反P3.7,进而实现蜂鸣器响起音乐。本实验用仿真头ICE52接在系统板上仿真,晶振22.1184MHz

25、。实验六:串行口通信1. 实验任务接受来自上位机的单字节十六进制数据,并在LED上通过二进制表示出来。2. 实验原理图3. 系统板上硬件连接4. 程序设计内容1) 设置串口工作方式,使用定时器1作为波特率发生器。2) 载入定时器初值,开启中断允许,定时器1使能。3) 进入循环程序,从上位机读数据,取反后赋值给LED端口。5. 程序框图6. C语言源程序#include void delayms(unsigned int ms) unsigned char k; while (ms-) for (k = 0; k 114; k+); unsigned char rxdata() /从上位机读数据

26、 unsigned char dat; while (!RI) /等待数据接收完 dat = SBUF; /接收数据 RI = 0; /清中断标志 return (dat);void main(void) P2 = 0xff; /初始化led显示 SCON = 0x50; /设定串口工作方式1,接收使能 PCON = 0x00; /波特率不倍增 TMOD = 0x20; /定时器1工作于8位自动重载模式, 用于产生波特率 EA = 1; TL1 = 0xfd; TH1 = 0xfd; /波特率9600 TR1 = 1; delayms(100); while (1) P2 = (rxdata(); /接收数据,并赋值给P2 7. 数据分析在上位机打开串口调试工具,调整波特率为9600,发送格式设置为16进制模式。输入4c,点击发送,可以在下位机系统板上看到P2口LED亮暗顺序为 暗亮暗暗 亮亮暗暗。即表示所发送数据十六进制的二进制格式。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1