单片机实验例题及答案.docx

上传人:b****0 文档编号:9805458 上传时间:2023-05-21 格式:DOCX 页数:39 大小:357.17KB
下载 相关 举报
单片机实验例题及答案.docx_第1页
第1页 / 共39页
单片机实验例题及答案.docx_第2页
第2页 / 共39页
单片机实验例题及答案.docx_第3页
第3页 / 共39页
单片机实验例题及答案.docx_第4页
第4页 / 共39页
单片机实验例题及答案.docx_第5页
第5页 / 共39页
单片机实验例题及答案.docx_第6页
第6页 / 共39页
单片机实验例题及答案.docx_第7页
第7页 / 共39页
单片机实验例题及答案.docx_第8页
第8页 / 共39页
单片机实验例题及答案.docx_第9页
第9页 / 共39页
单片机实验例题及答案.docx_第10页
第10页 / 共39页
单片机实验例题及答案.docx_第11页
第11页 / 共39页
单片机实验例题及答案.docx_第12页
第12页 / 共39页
单片机实验例题及答案.docx_第13页
第13页 / 共39页
单片机实验例题及答案.docx_第14页
第14页 / 共39页
单片机实验例题及答案.docx_第15页
第15页 / 共39页
单片机实验例题及答案.docx_第16页
第16页 / 共39页
单片机实验例题及答案.docx_第17页
第17页 / 共39页
单片机实验例题及答案.docx_第18页
第18页 / 共39页
单片机实验例题及答案.docx_第19页
第19页 / 共39页
单片机实验例题及答案.docx_第20页
第20页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机实验例题及答案.docx

《单片机实验例题及答案.docx》由会员分享,可在线阅读,更多相关《单片机实验例题及答案.docx(39页珍藏版)》请在冰点文库上搜索。

单片机实验例题及答案.docx

单片机实验例题及答案

单片机实验考试题

1、用Proteus打开“简易电子琴.DSN',按图编写程序,设计一个简易电子琴。

按数字键1〜7,分

别发“斗”、“来”、“米”……音(频率见实验指导书),按键抬起则发音停止,不考虑高八度和低八度音,按下1〜7以外的其它键不发音。

2、用Proteus打开文件“计数器.DSN',当按下键盘上的0〜F十六个键时,能将键值以十六进制形式在四个数码管上滚动显示。

在LED上显示字符A〜F的形式分别为:

3、用Proteus打开文件“频率计.DSN',图中,在单片机的外部中断0脚接有一个脉冲信号源,

编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。

程序调试时可以修改信号源的频率,比较测量值与设定值的差距,仿真时一般误差在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.

用Proteus打开文件“交通信号灯.DSN',编程实现时间倒计时及绿黄红三色灯的切换。

切换方式为:

如此周而复始。

(提示:

图中数码管与单片机之间的连接方式与实验指导书中相同)

11.用Proteus打开文件“多路开关指示.DSN',可以看到图中有八个按钮、八个发光二极管和一个数码管。

编写程序实现如下功能:

当按一下某一按钮时,该按钮的编号显示在数码管上,同时点亮对应编号的发光二极管。

12.用Proteus打开文件“数字钟.DSN',编写程序实现如下功能:

开机时显示00.00.00(时分秒),按钮“SW1控制“时”的调整,每按一次加1小时;按钮“SW2控制“分”的调整,每按一次加1分钟;按钮“SW3控制“秒”的调整,每按一次加1秒钟,按“SW4启动数字钟从设定的时间开始计时。

当按SW1SW2或SW3键时,时钟进入暂停状态,再一次按

13.

P3-4P35P3.6P3.7

AT89C51

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启动数字钟从设定的时间开始计时。

当按SW1SW2或SW3键时,时钟进入暂停状态,再一次按SW4

键启动计时。

在程序中设定,8点10分00秒和8点20分00秒各打一次铃,打铃时间长度为10秒钟。

图中用一发光二极管模拟电铃。

程序调试时可将时间调到打铃前几秒再启动时钟。

16•用Proteus打开文件“拨盘开关.DSN',可以看到图中有一个6位拨盘开关、六个发光二极管和一个数码管。

编写程序实现如下功能:

当转动拨盘开关时,拨盘开关的编号显示在数码管上,同时点亮对应编号的发光二极管。

17•用Proteus打开文件“流水灯.DSN',可以看到在单片机89C52的P2口接有8个发光二极管。

编写流水灯的程序,使8个发光二极管从左往右依次点亮,每次亮相邻两个,如先是D1、D2亮,然

后是D2、D3亮,……D7、D8亮,D8D1亮,如此周而复始。

当按一下按钮SW1后,流水暂停,再按一下按钮SW1后,从暂停的位置继续流水。

说明:

用自己学号的最后四位数加题号作为源程序文件名,同时将自己的完整学号、班级、姓名、第几题等信息放在源程序的第一行,如1052号同学考第3题,其源程序文件名应为“1052_03.C”

(题号必须为两位数),源程序的第一行为:

/*完整学号班级姓名第X题*/

程序要正确缩进,否则扣5分;

考试完毕,不要关闭开发环境MedWir和Proteus,不拆除实验板,千万不要关闭计算机。

1、简易电子琴参考答案

//1--简易电子琴

#include

if(key_port==0xf0)gotorn;a=key_port;key_port=a|0x0f;

delay_ms(20);

a=key_port;

for(r=0;r<=11;r++)

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

if(r>11)r=0xff;//0xff表示无效

rn:

key_port=0xf0;

returnr;

}

voidmain(void)

{U8i,k,a;

unsignedintb;

TMOD=0x11;

EA=1;

ET0=1;

ET1=1;

cnt=0;

TR1=1;

i=0;key_port=0xf0;

delay_ms(20);

while

(1)

{

if(key_port!

=0xf0)

{delay_ms(20);

k=key();

if((k<8)&&(k>0))

{err=0;

TR0=0;

P2=0xff;//关闭显示

b=cyc[k-1];//根据基本音阶,求出半周期数

H0=(65536-b)/256;//根据半周期数,计算TO初值的高字节和低字节

L0=(65536-b)%256;

TRO=1;//启动定时器O发音

while(key_port!

=OxfO);

delay_ms(2O);

TRO=O;

while(key_port!

=OxfO);

}

}

}

}

2、参考答案:

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

//数码管上滚动显示。

#include

#defineU8unsignedchar

#definekey_portP3

U8codetab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

U8

code

kcode[]={0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77};

//反转码对应键值0123456789ABCDEF

U8scn[]={0xf7,0xfb,0xfd,0xfe};//先点亮左边一个数码管

U8buf[4]={0,0,0,0};//显示缓冲区,开机先显示"0000"

U8cnt=0;//扫描计数

voiddelay_ms(U8ms)

{U8i,j;

for(i=0;i<100;i++)

{for(j=0;j

}

U8key(void)

{U8a,r=0xff;

delay_ms(20);//延时20毫秒,消除按键抖动

if(key_port==0xf0)gotorn;

a=key_port;

key_port=a|0x0f;

delay_ms(20);

a=key_port;

for(r=0;r<=15;r++)

//0xff表示无效

{if(a==kcode[r])break;};if(r>15)r=0xff;

rn:

key_port=0xf0;returnr;

voidmain(void)

{U8k,i;EA=1;

TMOD=0x01;ET0=1;

TH0=0xee;TL0=0;

TR0=1;

}

//允许中断

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

//定时器0中断允许

//晶振11.0592MHz,5mS

//开始计数

while

(1)

{if(key_port!

=0xf0){k=key();

if(k<16)

{for(i=1;i<=3;i++)buf[i-1]=buf[i];//数字左移一位buf[3]=k;//在个位显示刚按的数字while(key_port!

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

while(key_port!

=0xf0);

}

3、参考答案

/*3、用Proteus打开文件”频率计.DSN",图中,在单片机的外部中断0脚INTO接有一个脉冲信号源,编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。

程序调试时可以修改信号源的频率,看测量值与设定值有多大的差距,仿真时一般误差在10%内就算正常。

修改信号源频率的方法是,右击信号源图标后再

左击,打开信号源的属性对话框,在其中修改其频率(frequncy),不要改变其它属性值,频率可以在1Hz到10000Hz之间设定。

(提示:

可以设置一个外部中断0的中断服务程序,每次中断时给某个变量加一;

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

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

*/

#include

#defineU8unsignedchar

U8codetab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};

U8codescn[]={0x7f,0xbf,0xdf,0xef};//先点亮左边一个数码管

U8buf[4]={0,0,0,0};//显示缓冲区

U8cnt=0;//扫描计数

unsignedintfreq=0;

unsignedintF;

 

voidmain(void)

{EA=1;

TMOD=0x01;

ET0=1;

TH0=0xee;

TL0=0;

TR0=1;

PX0=1;

EX0=1;IT0=1;while

(1);

//允许中断

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

//定时器0中断允许

//晶振11.0592MHz,5mS

//开始计数

//外部中断优先级高

//允许外部中断

//外部中断下降沿触发

外部中断0服务程序

定时器0中断服务程序

设置定时器时间常数

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

笔划代码送P0口

控制扫描码送P2口

}

voidexint0(void)interrupt0//

{freq++;

}

voidtimeint(void)interrupt1//{chari;

TH0=0xee;//

TL0=0;

i=cnt&0x03;//

P0=tab[buf[i]];//

P2=scn[i];//

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)。

#include#defineU8unsignedchar

U8codetab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC1,0x86,0xAF};

//0123456789VEr

U8scn[]={0xf7,0xfb,0xfd,0xfe};//先点亮左边一个数码管

U8buf[4]={0,0,0,0};//

U8cnt=0;

显示缓冲区,开机先显示"0000"//扫描计数

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;ET0=1;

TH0=0xee;

TL0=0;

}

//允许中断

//设定时器0为模式1(16位)//定时器0中断允许

//晶振11.0592MHz,5mS

TR0=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[1]=0;

buf[2]=0;buf[3]=0;

Stop=0;

}

while(P3_0==0||P3_3==0);//等待按键抬起

delay_ms(20);

while(P3_0==0||P3_3==0);

}

}

}

voidtimeint(void)interrupt1//定时器0中断服务程序

{chari;

TH0=0xee;//设置定时器时间常数

TL0=0;

if(buf[0]==9&&buf[1]==9&&buf[2]==9&&buf[3]==9)

{buf[0]=0;buf[1]=10;buf[2]=11;buf[3]=12;

Run=0;Stop=1;

}

if(Run==1&&(cnt&1)==1&&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==1&&Stop==0)P0=tab[buf[i]]&0x7f;//笔划代码送P0口

elseP0=tab[buf[i]];

P2=sen[i];//控制扫描码送P2口

ent++;

}

5、参考答案

/*5.用Proteus打开文件"播放音乐.DSN",按图设计一个开机就能播放康定情歌的程序,并将其简谱在数码管上同步滚动显示。

此程序也可以下载到实验板上运行。

*/

#inelude

#defineU8unsignedehar

bitsn;

eodeU8tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2e,0x24,0xba,0x20,0x28,0x64,0x37,0x23,0x7f,0xff};

无显示

//0123456789End-

eodeU8sen[]={0x7f,0xbf,0xdf,0xef};//先点亮左边一个数码管

U8buf[4]={14,14,14,14};//显示缓冲区,开机不显示

eodeunsignedinteye[]={1800,1600,1440,1351,1200,1079,960};//音阶1-7的半周期数

eodeU8tone[]={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,0xff};//乐曲《康定情歌》的简谱表

eodeU8time[]={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};//《康定情歌》的节拍表

U8H0,L0,cnt=0,tm=0,sd=0;

 

*/

#include#defineU8unsignedchar

//扫描计数

U8codetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};U8cnt=0;

bitnext=0;

bitdri=0;voidmain(void){

dri=!

dri;while(P3_2==0);

7、参考答案

//7-用Proteus打开文件”计数器.DSN",当按下键盘上的0〜9十个数字键时,

//能将键值在四个数码管上滚动显示。

若按了A〜F六个字母键,则在数码管上显示(Over)。

#include

#defineU8unsignedchar

#definekey_portP3

U8codetab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC1,0x86,0xAF};

//0123456789VEr

code

U8kcode[]={0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77};//反转码对应键值0123456789ABCDEF

U8scn[]={0xf7,0xfb,0xfd,0xfe};//先点亮左边一个数码管

U8buf[4]={0,0,0,0};//显示缓冲区,开机先显示"0000"

U8cnt=0;//扫描计数voiddelay_ms(U8ms){U8i,j;

for(i=0;i<100;i++)

{for(j=0;j

}

U8key(void)

{U8a,r=0xff;

delay_ms(20);//延时20毫秒,消除按键抖动if(key_port==0xf0)gotorn;

a=key_port;key_port=a|0x0f;delay_ms(20);

voidmain(void)

{U8k,i;EA=1;

TMOD=0x01;ET0=1;

TH0=0xee;TL0=0;

TR0=1;

a=key_port;for(r=0;r<=15;r++){if(a==kcode[r])break;};

if(r>15)r=0xff;

//0xff表示无效

rn:

key_port=0xf0;

returnr;

}

//允许中断

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

//定时器0中断允许

//晶振11.0592MHz,5mS

//开始计数

while

(1)

{if(key_port!

=0xf0)

{k=key();

if(k<10)

{for(i=1;i<=3;i++)buf[i-1]=buf[i];//数字左移一位

buf[3]=k;//在个位显示刚按的数字

}

elseif(k<16)

cnt++;

8、参考答案

118-用Proteus打开文件”电子秒表.DSN",开机时显示00.00,单位是分.秒,按"SW1'键启动/暂停计时,//在暂停状态按"

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2