单片机实验例题及答案docx.docx
- 文档编号:3680945
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:34
- 大小:108.11KB
单片机实验例题及答案docx.docx
《单片机实验例题及答案docx.docx》由会员分享,可在线阅读,更多相关《单片机实验例题及答案docx.docx(34页珍藏版)》请在冰豆网上搜索。
单片机实验例题及答案docx
单片机实验考试题:
1、用Proteus打开“简易电子琴.DSN”,按图编写程序,设计一个简易电子琴。
按数字键1〜7,分别发“斗”、“来”、"米”……音(频率见实验指导书),按键抬起则发音停止,不考虑高八度和低八度音,按下1〜7以外的其它键不发音。
2、用Proteus打开文件“计数器.DSN”,当按下键盘上的0〜F十六个键时,能将键值以十六进制形式在四个数码管上滚动显示。
在LED上显示字符A-F的形式分别为:
FlbLdEF.
3、用Proteus打开文件“频率计.DSN”,图中,在单片机的外部中断。
脚面而接有一个脉冲信号源,编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。
程序调试时可以修改信号源的频率,比较测量值与设定值的差距,仿真时一般误差在10%内就算正常。
修改信号源频率的方法是,右击信号源图标后再左击,打开信号源的属性对话框,修改其中的频率(frequncy),不要改变其它属性值,频率可以在1Hz到10000Hz之间设定。
(提示:
可以设置一个外部中断0的中断服务程序,每次中断时给某个变量加一;再设置一个定时器中断服务程序,用于计时。
每秒钟读一次脉冲数,并将其清零,然后将脉冲数显示在数码管上,每秒钟内的脉冲数就是频率。
)
4、用Proteus打开文件“电子秒表.DSN”,开机时显示00.00,单位是秒,精确到10毫秒,按“SW1”键启动或暂停,按“SW2”键时间清零。
提示:
关于点亮小数点,每5mS刷新LED时,判断当刷新到第2个LED时将笔划代码中与小数点对应的位(bit7)清零。
5、用Proteus打开文件“播放音乐.DSN”,按图设计一个开机就能播放〈康定情歌〉的程序,并将其简谱在数码管上同步滚动显示。
此程序也可以下载到实验板上运行。
6、用Proteus打开文件“流水灯.DSN”,可以看到在单片机89C52的P2口接有8个发光二极管。
编写流水灯的程序,使8个发光二极管每隔约0.5秒依次点亮(每次亮一个),要求开始时从左往右点亮,每按一次按钮SW1后,改变流水的方向。
7、用Proteus打开文件“计数器.DSN”,当按下键盘上的0〜9十个数字键时,能将键值在四个数码管上滚动显示。
若按了A〜F六个字母键,则在数码管上显示厂(Over)。
8、用Proteus打开文件“电子秒表.DSN”,开机时显示00.00,单位是分、秒,按“SW1”键启动/暂停计时,在暂停状态按“SW2”键分秒清零。
在计时状态分和秒之间的小数点闪烁(每秒钟亮半秒,熄半秒),暂停状态常亮。
提示:
关于小数点闪烁,每5mS刷新LED时,判断当刷新到第2个LED并且时间是前半秒时将笔划代码中与小数点对应的位清零。
9.用Proteus打开文件“定时关灯控制器.DSN”,按图编写程序设计一个定时关灯控制器。
从键盘输入时间(单位:
秒,最大9999秒,最小1秒),按一下A键灯亮,时间每秒减1,减到0时停止,灯熄灭。
可以再次输入时间并启动定时过程。
10.
10.
用Proteus打开文件“交通信号灯.DSN”,编程实现时间倒计时及绿黄红三色灯的切换。
切换方式为:
如此周而复始。
(提示:
图中数码管与单片机之间的连接方式与实验指导书中相同)
11.用Proteus打开文件“多路开关指示.DSN”,可以看到图中有八个按钮、八个发光二极管和一个数码管。
编写程序实现如下功能:
当按一下某一按钮时,该按钮的编号显示在数码管上,同时点亮对应编号的发光二极管。
12.
用Proteus打开文件“数字钟.DSN”,编写程序实现如下功能:
开机时显示00.00.00(时分秒),按钮“SW1”控制“时”的调整,每按一次加1小时;按钮“SW2”控制“分”的调整,每按一次加1分钟;按钮“SW3”控制“秒”的调整,每按一次加1秒钟,按“SW4”启动数字钟从设定的时间开始计时。
当按SW1、SW2或SW3键时,时钟进入暂停状态,再一次按SW4键启动计时。
13.实验板上有4个发光二极管,与单片机的连接如右所示。
编写流水灯的程序,使4个发光二极管每隔1秒依次点亮(每次亮一个),要求每个发光二极管逐渐点亮然后熄灭,再点亮下一个发光二极管。
程序在实验板上调试通过。
(提示:
通过改变加在单片机引脚上脉冲的占空比来改变发光二极管的亮度,可以在一个定时中断中点亮发光二极管,同时启动在另一个定时中断,在该中断过程中关闭发光二极管,两个中断之间的时间间隔逐渐加大,二极管就慢慢亮起来了。
)(本题无法在Proteus中仿真)
14.用Proteus打开文件“流水灯.DSN”,可以看到在单片机89C52的P2口接有8个发光二极管。
编写流水灯的程序,使8个发光二极管从左往右依次点亮(每次亮一个),当按一下按钮SW1并抬起后,流水暂停,再按一下按钮SW1后,从暂停的位置继续流水,如此反复。
15.用Proteus打开文件“电子打铃器.DSN”,编写程序实现定时打铃功能。
要求如下:
开机时显示00.00.00(时分秒),按钮“SW1”控制“时”的调整,每按一次加1小时;按钮“SW2”控制“分”的调整,每按一次加1分钟;按钮“SW3”控制“秒”的调整,每按一次加1秒钟,按“SW4”启动数字钟从设定的时间开始计时。
当按SWKSW2或SW3键时,时钟进入暂停状态,再一次按SW4键启动计时。
在程序中设定,8点10分00秒和8点20分00秒各打一次铃,打铃时间长度为10秒钟。
图中用一发光二极管模拟电铃。
程序调试时可将时间调到打铃前几秒再启动时钟。
16.用Proteus打开文件“拨盘开关.DSN”,可以看到图中有一个6位拨盘开关、六个发光二极管和一个数码管。
编写程序实现如下功能:
当转动拨盘开关时,拨盘开关的编号显示在数码管上,同时点亮对应编号的发光二极管。
17,用Proteus打开文件“流水灯.DSN”,可以看到在单片机89C52的P2口接有8个发光二极管。
编写流水灯的程序,使8个发光二极管从左往右依次点亮,每次亮相邻两个,如先是Dl、D2亮,然后是D2、D3亮,……D7、D8亮,D8、D1亮,如此周而复始。
当按一下按钮SW1后,流水暂停,再按一下按钮SW1后,从暂停的位置继续流水。
说明:
用自己学号的最后四位数加题号作为源程序文件名,同时将自己的完整学号、班级、姓名、第几题等信息放在源程序的第一行,如1052号同学考第3题,其源程序文件名应为“1052_03.C”(题号必须为两位数),源程序的第一行为:
/*完整学号班级姓名第X题*/
程序要正确缩进,否则扣5分;
考试完毕,不要关闭开发环境MedWin和Proteus,不拆除实验板,千万不要关闭计算机。
1、简易电子琴参考答案:
〃1--简易电子琴
^include
^defineU8unsignedchar
^definekey_portP3
codeU8kcode[]=(0xEE,OxDE,OxBE,OxED,OxDD,OxBD,OxEB,OxDB,OxBB,0xE7,0xD7,0xB7);
〃反转码对应键值0123456789AB
codeunsignedinteye□={1800,1600,1440,1351,1200,1079,960);〃音阶1-7的半周期数U8HO,LO,ent,err;
voidcntintO(void)interrupt1//定时器0中断用于产生音阶方波
{THO二H0;
TLO二L0;
P2_0=~P2_0;//P2.3是音乐信号输出脚,P2.3反相,产生方波
}
voidcntintl(void)interrupt3//定时器1中断用于产生节拍延时或显示
(cnt++;
}
voiddelay_ms(U8ms)
{U8i,j;
for(i=0;i<100;i++)
(for(j=0;j }; } U8key(void) {U8a,r; delay_ms(20);//延时20毫秒,消除按键抖动 if(key_port==OxfO)gotorn; a=keyport; key_port=a|OxOf; delay_ms(20); a=keyport; for(r=0;r<=11;r++) (if(a=kcode[r])break;); if(r>11)r=Oxff;//Oxff表示无效 rn: key_port=OxfO; returnr; } voidmain(void) {U8i,k,a; unsignedintb; TM0D=0xll; EA=1; ETO二1; ET1=1; cnt=O; TR1=1; i=0; key_port=OxfO; delay_ms(20);while (1){ if(key_port! =OxfO) (delay_ms(20);k=key(); if((k<8)&&(k>0)) {err=0; TRO=O; P2=0xff;//关闭显示 b=cyc[k-l];//根据基本音阶,求出半周期数H0二(65536-b)/256;//根据半周期数,计算TO初值的高字节和低字节L0二(65536-b)%256; TRO二1;//启动定时器0发音 while(key_port! =OxfO);delay_ms(20);TRO=O;while(key_port! =OxfO); 2、参考答案: 〃2-用Proteus打开文件〃计算器.DSN〃,当按下键盘上的0〜F十六个键时,能将键值以十六进制形式在四个 //数码管上滚动显示。 ^include #defineU8unsignedchar ^definekey_portP3 U8codetab[]=(OxCO,0xF9,0xA4,OxBO,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,OxAl,0x86,0x8E); codeU8 kcode[]=(0xEE,OxDE,OxBE,0x7E,OxED,OxDD,OxBD,0x7D,OxEB,OxDB,OxBB,0x7B,0xE7,0xD7,0xB7,0x77); 〃反转码对应键值0123456789ABCDEF U8scn[]=(0xf7,Oxfb,Oxfd,Oxfe);//先点亮左边一个数码管 U8buf[4]-{0,0,0,0);//显示缓冲区,开机先显示"0000” U8ent=0;//扫描计数 voiddelay_ms(U8ms) {U8i,J; for(i=0;i<100;i++) {for(j=0;j } U8key(void) {U8a,r=Oxff; delay_ms(20);//延时20毫秒,消除按键抖动 if(key_port=OxfO)gotorn; a=keyport; OxOf; key_port= delay_ms(20); a=key_port; for(r=0;r<=15;r++) (if(a==kcode[r])break;}; if(r>15)r=Oxff;//Oxff表示无效 rn: key_port=OxfO; returnr; } (if(key_port! =OxfO) (k=key(); if(k<16) {for(i=l;i<=3;i++)buf[i-l]=buf[i];//数字左移一位buf[3]=k;//在个位显示冈I派的数字 while(key_port! =OxfO);//等待按键抬起delay_ms(20); while(key_port! =OxfO); } } voidtimeint(void)interrupt1//定时器0中断服务程序 chari; THO =Oxee; // 设置定时器时间常数 TLO =o; i二 ent&0x03; // 求应点亮的LED号(从左到右依次为0,1,2,3) P0= tab[buf[i]]; // 笔划代码送P0口 P2= scn[i]; // 控制扫描码送P2口 cnt++; 3、参考答案 /*3、用Proteus打开文件〃频率计.DSN〃,图中,在单片机的外部中断0脚INTO接有一个脉冲信号源,编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。 程序调试时可以修改信号源的频率,看测量值与设定值有多大的差距,仿真时一般误差在10%内就算正常。 修改信号源频率的方法是,右击信号源图标后再左击,打开信号源的属性对话框,在其中修改其频率(frequncy),不要改变其它属性值,频率可以在1Hz到10000Hz之间设定。 (提示: 可以设置一个外部中断0的中断服务程序,每次中断时给某个变量加一;再设计一个定时器中断服务程序,用于计时。 每秒钟读一次脉冲数,并将其清零,然后将脉冲数显示在数码管上,每秒钟内的脉冲数就是频率。 ) */ ^include ^defineU8unsignedchar U8codetab[]=(0xa0,Oxbb,0x62,0x2a,0x39,0x2c,0x24,Oxba,0x20,0x28}; U8codescn[]=(0x7f,Oxbf,Oxdf,Oxef);//vte点亮左边一个数码管 U8buf[4]=(0,0,0,0);//显示缓冲区 U8ent=0;//扫描计数 unsignedintfreq=0; unsignedintF;voidmain(void) { EA二 1; //允许中断 TMOD =0x01; //设定时器0为模式1(16位) ETO= 1; //定时器0中断允许 THO= TLO= Oxee: 0; //晶振11.0592MHz,5mS TRO= 1; //开始计数 PXO= 1; 〃外部中断优先级高 EXO= 1; //允许外部中断 } ITO=1;while (1); //外部中断下降沿触发 voidexintO(void) interrupt0//夕卜部中断0服务程序 {freq++; } voidtimeint(void)interrupt1//定时器0中断服务程序 chari; THO二Oxee;//设置定时器时间常数 TLO=0; i=ent&0x03;//求应点亮的LED号(从左到右依次为0,1,2,3) P0=tab[buf[i]];//笔划代码送P0口 P2=scn[i];//控制扫描码送P2口 cnt++; if(cnt=200) (cnt=0;//到1秒钟,显示的数字加一 F=freq;freq=0; buf[0]=F/1000; buf[1]= =(F/100)%10; buf[2]: =(F/10)%10; buf[3]= -F%10; 4、参考答案 〃4-用Proteus打开文件〃电子秒表.DSN〃,开机时显示00.00,单位是秒,精确到10毫秒, //按〃SW1〃键启动或暂停,在暂停时按〃SW2〃键时间清零。 计时超过99.99秒以后,显示(Over)o ^include ^defineU8unsignedchar U8codetab[]=(0xC0,0xF9,0xA4,OxBO,0x99,0x92,0x82,0xF8,0x80,0x90,OxCl,0x86,OxAF}; //0123456789VEr U8scn[]=(0xf7,Oxfb,Oxfd,Oxfe);//先点亮左边一个数码管 U8buf[4]=(0,0,0,0);//显示缓冲区,开机先显示"0000〃 U8ent=0;//扫描计数 bitRun=0; bitStop=0; voiddelay_ms(U8ms) {U8i,j; for(i二0;i<100;i++) (for(j=0;j ) voidmain(void) EA二 1; // 允许中断 TMOD =0x01; // 设定时器0为模式1(16位) ETO二 : 1; // 定时器0中断允许 THO二 ;Oxee: // 晶振11.0592MHz,5mS TLO= =0; TRO=1;//开始计数 while (1) (if(P3_0=0||P3_3=0) {delay_ms(20); if(P3_0==0&&Stop==0) (if(Run二二0)Run=1; elseRun=0; } if(P3_3==0&&Run==0) (buf[0]=0;buf[l]=0; buf[2]=0;buf[3]=0; Stop=0; } while(P3_0==0||P3_3==0);//等待按键抬起 delay_ms(20); while7P3_0二二0||P3_3二二0); } } } voidtimeint(void)interrupt1//定时器0中断服务程序 (chari; TH0二Oxee;//设置定时器时间常数 TLO=0; if(buf[0]==9&&buf[1]==9&&buf[2]==9&&buf[3]==9) (buf[0]=0;buf[l]=10;buf[2]=11;buf[3]=12; Run=0;Stop=1; ) if(Run==l&&(cnt&l)==l&&Stop==0) (for(i=3;i>=0;i—) {buf[i]++; if(buf[i]==10)buf[i]=0;//加到10向前进位 elsebreak; } } i=ent&0x03;//求应点亮的LED号(从左到右依次为0,1,2,3) if(i==l&&Stop==0)P0=tab[buf[i]]&0x7f;//笔划代码送P0口 elseP0=tab[buf[i]]; P2二scn[i];//控制扫描码送P2口 cnt++; 5、参考答案 /*5.用Proteus打开文件〃播放音乐.DSN〃,按图设计一个开机就能播放康定情歌的程序, 并将其简谱在数码管上同步滚动显示。 此程序也可以下载到实验板上运行。 */ ttinclude ^defineU8unsignedchar bitsn; codeU8tab[]=(0xa0,Oxbb,0x62,0x2a,0x39,0x2c,0x24,Oxba,0x20,0x28,0x64,0x37,0x23,0x7f,Oxff); //0123456789End-无显示 codeU8scn[]=(0x7f,Oxbf,Oxdf,Oxef);//先点亮左边一个数码管 U8buf[4]=(14,14,14,14);//显示缓冲区,开机不显示 codeunsignedinteye□={1800,1600,1440,1351,1200,1079,960);//音阶1-7的半周期数 codeU8tone□={13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13,13,15,16, 16,15,16,13,12,12,15,13,12,13,12,11,12,6,6,12,15,13,12,6,6,15,13,12,13,12,11, 12,6,5,6,Oxff);//乐曲《康定情歌》的简谱表 codeU8time[]={8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,8,8,12,4,8,8,4,4, 4,4,8,24,8,24,8,24,8,16,8,8,8,4,4,4,4,8,16,8,32);//《康定情歌》的节拍表 U8HO,LO,cnt=0,tm=0,sd=O; voidcntintO(void)interrupt1//定时器0中断用于产生音阶方波{THO=HO; TLO=LO; P2_3=sd&1; sn=sd&1; sd++; //P2.3是音乐信号输出脚 //记住P2.3脚的状态 voidcntintl(void)interrupt3//定时器1中断用于产生节拍延时(chari,k; EA二1; TH1=Oxee; //设置定时器时间常数 TL1=0; i=ent&0x03;//求应点亮的LED号(从左到右依次为0,1,2,3) P0二tab[buf[i]];//笔划代码送P0口k=scn[i]; if(sn==0)k=k&0xf7;//恢复P2.3脚的状态 P2=k;//控制扫描码送P2口 cnt++; if(cnt>ll) (cnt=0; tm++; voidmain(void) {U8i,j,a,t; unsignedintb; next: TM0D=0xll; EA=1; ET1=1; TRI=1; PTO=1; ETO=1;//定时器0中断允许 TH1二Oxee;//晶振11.0592MHz,5mS TL1=0; i-0; while (1) (t=tone[i];//读音调 for(j=0;j<3;j++) (buf[j]=buf[j+1]; } buf[3]=t%10; if(t>50)break;//Oxff是结束符 if(t! =O)//0是休止符 (b=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 例题 答案 docx
![提示](https://static.bdocx.com/images/bang_tan.gif)