单片机实验例题及答案docxWord文档下载推荐.docx

上传人:b****4 文档编号:16585786 上传时间:2022-11-24 格式:DOCX 页数:34 大小:108.11KB
下载 相关 举报
单片机实验例题及答案docxWord文档下载推荐.docx_第1页
第1页 / 共34页
单片机实验例题及答案docxWord文档下载推荐.docx_第2页
第2页 / 共34页
单片机实验例题及答案docxWord文档下载推荐.docx_第3页
第3页 / 共34页
单片机实验例题及答案docxWord文档下载推荐.docx_第4页
第4页 / 共34页
单片机实验例题及答案docxWord文档下载推荐.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

单片机实验例题及答案docxWord文档下载推荐.docx

《单片机实验例题及答案docxWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机实验例题及答案docxWord文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。

单片机实验例题及答案docxWord文档下载推荐.docx

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<

REG51.h>

^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<

ms;

j++);

};

U8key(void)

{U8a,r;

delay_ms(20);

//延时20毫秒,消除按键抖动

if(key_port==OxfO)gotorn;

a=keyport;

key_port=a|OxOf;

delay_ms(20);

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;

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!

2、参考答案:

〃2-用Proteus打开文件〃计算器.DSN〃,当按下键盘上的0〜F十六个键时,能将键值以十六进制形式在四个

//数码管上滚动显示。

REG51.H>

#defineU8unsignedchar

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;

//扫描计数

{U8i,J;

{for(j=0;

j++);

};

{U8a,r=Oxff;

if(key_port=OxfO)gotorn;

OxOf;

key_port=

a=key_port;

=15;

(if(a==kcode[r])break;

15)r=Oxff;

(if(key_port!

(k=key();

if(k<

16)

{for(i=l;

i<

=3;

i++)buf[i-l]=buf[i];

//数字左移一位buf[3]=k;

//在个位显示冈I派的数字

=OxfO);

//等待按键抬起delay_ms(20);

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之间设定。

再设计一个定时器中断服务程序,用于计时。

每秒钟读一次脉冲数,并将其清零,然后将脉冲数显示在数码管上,每秒钟内的脉冲数就是频率。

*/

U8codetab[]=(0xa0,Oxbb,0x62,0x2a,0x39,0x2c,0x24,Oxba,0x20,0x28};

U8codescn[]=(0x7f,Oxbf,Oxdf,Oxef);

//vte点亮左边一个数码管

U8buf[4]=(0,0,0,0);

//显示缓冲区

unsignedintfreq=0;

unsignedintF;

voidmain(void)

{

EA二

1;

//允许中断

TMOD

=0x01;

//设定时器0为模式1(16位)

ETO=

1;

//定时器0中断允许

THO=

TLO=

Oxee:

0;

//晶振11.0592MHz,5mS

TRO=

//开始计数

PXO=

〃外部中断优先级高

EXO=

//允许外部中断

ITO=1;

while

(1);

//外部中断下降沿触发

voidexintO(void)

interrupt0//夕卜部中断0服务程序

{freq++;

THO二Oxee;

//设置定时器时间常数

TLO=0;

i=ent&

//求应点亮的LED号(从左到右依次为0,1,2,3)

P0=tab[buf[i]];

//笔划代码送P0口

P2=scn[i];

//控制扫描码送P2口

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

U8codetab[]=(0xC0,0xF9,0xA4,OxBO,0x99,0x92,0x82,0xF8,0x80,0x90,OxCl,0x86,OxAF};

//0123456789VEr

0000〃

bitRun=0;

bitStop=0;

for(i二0;

(for(j=0;

允许中断

设定时器0为模式1(16位)

ETO二

:

定时器0中断允许

THO二

;

晶振11.0592MHz,5mS

=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);

//等待按键抬起

while7P3_0二二0||P3_3二二0);

(chari;

TH0二Oxee;

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&

(for(i=3;

i>

=0;

i—)

{buf[i]++;

if(buf[i]==10)buf[i]=0;

//加到10向前进位

elsebreak;

//求应点亮的LED号(从左到右依次为0,1,2,3)

if(i==l&

Stop==0)P0=tab[buf[i]]&

0x7f;

elseP0=tab[buf[i]];

P2二scn[i];

5、参考答案

/*5.用Proteus打开文件〃播放音乐.DSN〃,按图设计一个开机就能播放康定情歌的程序,

并将其简谱在数码管上同步滚动显示。

ttinclude<

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&

sd++;

//P2.3是音乐信号输出脚

//记住P2.3脚的状态

voidcntintl(void)interrupt3//定时器1中断用于产生节拍延时(chari,k;

EA二1;

TH1=Oxee;

//设置定时器时间常数

TL1=0;

P0二tab[buf[i]];

//笔划代码送P0口k=scn[i];

if(sn==0)k=k&

0xf7;

//恢复P2.3脚的状态

P2=k;

if(cnt>

ll)

tm++;

{U8i,j,a,t;

next:

EA=1;

ET1=1;

TRI=1;

PTO=1;

ETO=1;

//定时器0中断允许

TH1二Oxee;

//晶振11.0592MHz,5mS

i-0;

(t=tone[i];

//读音调

for(j=0;

3;

j++)

(buf[j]=buf[j+1];

buf[3]=t%10;

if(t>

50)break;

//Oxff是结束符

if(t!

=O)//0是休止符

(b=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

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

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