版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机实验考试题:1、 用Proteus打开“简易电子琴.DSN”,按图编写程序,设计一个简易电子琴。按数字键17,分别发“斗”、“来”、“米”音(频率见实验指导书),按键抬起则发音停止,不考虑高八度和低八度音,按下17以外的其它键不发音。2、 用Proteus打开文件“计数器.DSN”,当按下键盘上的0F十六个键时,能将键值以十六进制形式在四个数码管上滚动显示。在LED上显示字符AF的形式分别为:。3、 用Proteus打开文件“频率计.DSN”,图中,在单片机的外部中断0脚接有一个脉冲信号源,编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。 程序调试时可以修改信号源的频率,比较测
2、量值与设定值的差距,仿真时一般误差在10%内就算正常。修改信号源频率的方法是,右击信号源图标后再左击,打开信号源的属性对话框,修改其中的频率(frequncy),不要改变其它属性值,频率可以在1Hz到10000Hz之间设定。(提示:可以设置一个外部中断0的中断服务程序,每次中断时给某个变量加一;再设置一个定时器中断服务程序,用于计时。每秒钟读一次脉冲数,并将其清零,然后将脉冲数显示在数码管上,每秒钟内的脉冲数就是频率。)4、 用Proteus打开文件“电子秒表.DSN”,开机时显示00.00,单位是秒,精确到10毫秒,按“SW1”键启动或暂停,按“SW2”键时间清零。 提示:关于点亮小数点,每
3、5mS刷新LED时,判断当刷新到第2个LED时将笔划代码中与小数点对应的位(bit7)清零。5、 用Proteus打开文件“播放音乐.DSN”,按图设计一个开机就能播放<康定情歌>的程序,并将其简谱在数码管上同步滚动显示。此程序也可以下载到实验板上运行。6、 用Proteus打开文件“流水灯.DSN”,可以看到在单片机89C52的P2口接有8个发光二极管。编写流水灯的程序,使8个发光二极管每隔约0.5秒依次点亮(每次亮一个),要求开始时从左往右点亮,每按一次按钮SW1后,改变流水的方向。7、用Proteus打开文件“计数器.DSN”,当按下键盘上的09十个数字键时,能将键值在四个数
4、码管上滚动显示。若按了AF六个字母键,则在数码管上显示(Over)。8、用Proteus打开文件“电子秒表.DSN”,开机时显示00.00,单位是分、秒,按“SW1”键启动/暂停计时,在暂停状态按“SW2”键分秒清零。在计时状态分和秒之间的小数点闪烁(每秒钟亮半秒,熄半秒),暂停状态常亮。提示:关于小数点闪烁,每5mS刷新LED时,判断当刷新到第2个LED并且时间是前半秒时将笔划代码中与小数点对应的位清零。9. 用Proteus打开文件“定时关灯控制器.DSN”,按图编写程序设计一个定时关灯控制器。从键盘输入时间(单位:秒,最大9999秒,最小1秒),按一下A键灯亮,时间每秒减1,减到0时停止
5、,灯熄灭。可以再次输入时间并启动定时过程。013163639南北方向东西方向红灯亮16秒绿灯亮20秒黄灯亮3秒绿灯亮13秒黄灯亮3秒红灯亮23秒秒10. 用Proteus打开文件“交通信号灯.DSN”,编程实现时间倒计时及绿黄红三色灯的切换。切换方式为:如此周而复始。(提示:图中数码管与单片机之间的连接方式与实验指导书中相同)11. 用Proteus打开文件“多路开关指示.DSN”,可以看到图中有八个按钮、八个发光二极管和一个数码管。编写程序实现如下功能:当按一下某一按钮时,该按钮的编号显示在数码管上,同时点亮对应编号的发光二极管。12. 用Proteus打开文件“数字钟.DSN”,编写程序实
6、现如下功能:开机时显示00.00.00 (时分秒),按钮“SW1”控制“时”的调整,每按一次加1小时;按钮“SW2”控制“分”的调整,每按一次加1分钟;按钮“SW3”控制“秒”的调整,每按一次加1秒钟,按“SW4”启动数字钟从设定的时间开始计时。当按SW1、SW2或SW3键时,时钟进入暂停状态,再一次按SW4键启动计时。13实验板上有4个发光二极管,与单片机的连接如右所示。编写流水灯的程序,使4个发光二极管每隔1秒依次点亮(每次亮一个),要求每个发光二极管逐渐点亮然后熄灭,再点亮下一个发光二极管。程序在实验板上调试通过。(提示:通过改变加在单片机引脚上脉冲的占空比来改变发光二极管的亮度,可以在
7、一个定时中断中点亮发光二极管,同时启动在另一个定时中断,在该中断过程中关闭发光二极管,两个中断之间的时间间隔逐渐加大,二极管就慢慢亮起来了。)(本题无法在Proteus中仿真)14用Proteus打开文件“流水灯.DSN”,可以看到在单片机89C52的P2口接有8个发光二极管。编写流水灯的程序,使8个发光二极管从左往右依次点亮(每次亮一个),当按一下按钮SW1并抬起后,流水暂停,再按一下按钮SW1后,从暂停的位置继续流水,如此反复。15用Proteus打开文件“电子打铃器.DSN”,编写程序实现定时打铃功能。要求如下:开机时显示00.00.00 (时分秒),按钮“SW1”控制“时”的调整,每按
8、一次加1小时;按钮“SW2”控制“分”的调整,每按一次加1分钟;按钮“SW3”控制“秒”的调整,每按一次加1秒钟,按“SW4”启动数字钟从设定的时间开始计时。当按SW1、SW2或SW3键时,时钟进入暂停状态,再一次按SW4键启动计时。在程序中设定,8点10分00秒和8点20分00秒各打一次铃,打铃时间长度为10秒钟。图中用一发光二极管模拟电铃。程序调试时可将时间调到打铃前几秒再启动时钟。16用Proteus打开文件“拨盘开关.DSN”,可以看到图中有一个6位拨盘开关、六个发光二极管和一个数码管。编写程序实现如下功能:当转动拨盘开关时,拨盘开关的编号显示在数码管上,同时点亮对应编号的发光二极管。
9、17用Proteus打开文件“流水灯.DSN”,可以看到在单片机89C52的P2口接有8个发光二极管。编写流水灯的程序,使8个发光二极管从左往右依次点亮,每次亮相邻两个,如先是D1、D2亮,然后是D2、D3亮, D7、D8亮,D8、D1亮,如此周而复始。当按一下按钮SW1后,流水暂停,再按一下按钮SW1后,从暂停的位置继续流水。说明:用自己学号的最后四位数加题号作为源程序文件名,同时将自己的完整学号、班级、姓名、第几题等信息放在源程序的第一行,如1052号同学考第3题,其源程序文件名应为“1052_03.C”(题号必须为两位数),源程序的第一行为:/* 完整学号 班级 姓名 第X题 */程序要
10、正确缩进,否则扣5分;考试完毕,不要关闭开发环境MedWin和Proteus,不拆除实验板,千万不要关闭计算机。1、简易电子琴参考答案:/1-简易电子琴#include <REG51.h>#define U8 unsigned char#define key_port P3code U8 kcode=0xEE,0xDE,0xBE,0xED,0xDD,0xBD,0xEB,0xDB,0xBB,0xE7,0xD7,0xB7;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A Bcode unsigned int cyc=1800,1600,1440,1351,1200,1079
11、,960;/音阶1-7的半周期数U8 H0,L0,cnt,err;void cntint0(void) interrupt 1 / 定时器0中断用于产生音阶方波TH0=H0;TL0=L0;P2_0=P2_0; / P2.3是音乐信号输出脚,P2.3反相,产生方波void cntint1(void) interrupt 3 / 定时器1中断用于产生节拍延时 或显示cnt+;void delay_ms(U8 ms)U8 i,j;for(i=0;i<100;i+) for(j=0;j<ms;j+);U8 key(void)U8 a,r;delay_ms(20);/ 延时20毫秒,消除按键
12、抖动if(key_port = 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r <= 11;r+) if(a = kcoder) break;if(r > 11) r = 0xff;/0xff表示无效rn:key_port = 0xf0;return r;void main(void)U8 i,k,a;unsigned int b;TMOD=0x11;EA=1;ET0=1;ET1=1;cnt=0;TR1=1;i=0;key_port = 0xf0;delay_
13、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=cyck-1; / 根据基本音阶,求出半周期数H0=(65536-b)/256; / 根据半周期数,计算T0初值的高字节和低字节L0=(65536-b)%256;TR0=1; / 启动定时器0发音while(key_port != 0xf0);delay_ms(20);TR0=0;while(key_port != 0xf0); 2、参考答案:/2-用P
14、roteus打开文件"计算器.DSN",当按下键盘上的0F十六个键时,能将键值以十六进制形式在四个/ 数码管上滚动显示。#include <REG51.H>#define U8 unsigned char#define key_port P3U8 code tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;code U8 kcode=0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x
15、7B,0xE7,0xD7,0xB7,0x77;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A B C D E FU8 scn=0xf7,0xfb,0xfd,0xfe;/ 先点亮左边一个数码管U8 buf4=0,0,0,0;/ 显示缓冲区,开机先显示"0000" U8 cnt = 0;/ 扫描计数void delay_ms(U8 ms)U8 i,j;for(i=0;i<100;i+) for(j=0;j<ms;j+);U8 key(void)U8 a,r = 0xff;delay_ms(20);/ 延时20毫秒,消除按键抖动if(key_port =
16、 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r <= 15;r+) if(a = kcoder) break;if(r > 15) r = 0xff;/0xff表示无效rn:key_port = 0xf0;return r;void main(void) U8 k,i;EA = 1; / 允许中断TMOD = 0x01;/ 设定时器0为模式1(16位) ET0 = 1; / 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592MHz,5mS TL0
17、 = 0; TR0 = 1;/ 开始计数 while(1) if (key_port != 0xf0) k = key(); if (k < 16) for(i=1;i<=3;i+) bufi-1=bufi;/ 数字左移一位 buf3 = k;/ 在个位显示刚按的数字 while(key_port != 0xf0);/ 等待按键抬起 delay_ms(20); while(key_port != 0xf0); void timeint(void) interrupt 1 / 定时器0中断服务程序char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i =
18、cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = tabbufi;/ 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口cnt+;3、参考答案/*3、用Proteus打开文件"频率计.DSN",图中,在单片机的外部中断0脚INT0接有一个脉冲信号源,编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。 程序调试时可以修改信号源的频率,看测量值与设 定值有多大的差距,仿真时一般误差在10%内就算正常。修改信号源频率的方法是,右击信号源图标后再 左击,打开信号源的属性对话框,在其中修改其频率(frequncy),不要改
19、变其它属性值,频率可以在1Hz 到10000Hz之间设定。(提示:可以设置一个外部中断0的中断服务程序,每次中断时给某个变量加一; 再设计一个定时器中断服务程序,用于计时。每秒钟读一次脉冲数,并将其清零,然后将脉冲数显示在 数码管上,每秒钟内的脉冲数就是频率。)*/#include <REG51.H>#define U8 unsigned charU8 code tab=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;U8 code scn=0x7f,0xbf,0xdf,0xef;/先点亮左边一个数码管U8 buf4=0,0,0,
20、0;/ 显示缓冲区 U8 cnt = 0;/ 扫描计数unsigned int freq = 0;unsigned int F;void main(void) EA = 1; / 允许中断TMOD = 0x01;/ 设定时器0为模式1(16位) ET0 = 1; / 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1;/ 开始计数 PX0 = 1;/ 外部中断优先级高EX0 = 1;/ 允许外部中断 IT0 = 1;/ 外部中断下降沿触发while(1); void exint0(void) interrupt 0 / 外部中断0 服
21、务程序freq+;void timeint(void) interrupt 1 / 定时器0中断服务程序char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = tabbufi;/ 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口cnt+;if(cnt=200) cnt=0;/ 到1秒钟,显示的数字加一F = freq; freq = 0;buf0 = F / 1000;buf1 = (F / 100) % 10;buf2 = (F / 10) % 10;bu
22、f3 = F % 10;4、参考答案/4-用Proteus打开文件"电子秒表.DSN",开机时显示00.00,单位是秒,精确到10毫秒, / 按"SW1"键启动或暂停,在暂停时按"SW2"键时间清零。计时超过99.99秒以后,显示(Over)。#include <REG51.H>#define U8 unsigned charU8 code tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC1,0x86,0xAF;/ 0 1 2 3 4 5 6 7 8 9 V
23、 E r U8 scn=0xf7,0xfb,0xfd,0xfe;/ 先点亮左边一个数码管U8 buf4=0,0,0,0;/ 显示缓冲区,开机先显示"0000" U8 cnt = 0;/ 扫描计数bit Run = 0;bit Stop = 0;void delay_ms(U8 ms)U8 i,j;for(i=0;i<100;i+) for(j=0;j<ms;j+);void main(void) EA = 1; / 允许中断TMOD = 0x01;/ 设定时器0为模式1(16位) ET0 = 1;/ 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592
24、MHz,5mS TL0 = 0;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; else Run = 0;if(P3_3 = 0 && Run = 0)buf0 = 0 ;buf1 = 0;buf2 = 0 ;buf3 = 0;Stop = 0; while(P3_0 = 0 | P3_3 = 0);/ 等待按键抬起 delay_ms(20); while(P3_0 = 0 | P3_3 = 0);
25、 void timeint(void) interrupt 1 / 定时器0中断服务程序char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; if(buf0=9 && buf1=9 && buf2=9 && buf3=9)buf0=0; buf1=10; buf2=11; buf3=12;Run = 0;Stop = 1;if(Run=1 && (cnt&1)=1 && Stop = 0)for(i=3;i>=0;i-) bufi+; if(bufi=10) bufi=0;/
26、 加到10向前进位 else break;i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)if(i=1 && Stop = 0) P0 = tabbufi & 0x7f;/ 笔划代码送P0口else P0 = tabbufi;P2 = scni;/ 控制扫描码送P2口cnt+;5、参考答案/*5用Proteus打开文件"播放音乐.DSN",按图设计一个开机就能播放康定情歌的程序, 并将其简谱在数码管上同步滚动显示。此程序也可以下载到实验板上运行。*/#include <REG51.H>#def
27、ine U8 unsigned charbit sn;code U8 tab=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0x64,0x37,0x23,0x7f,0xff;/ 0 1 2 3 4 5 6 7 8 9 E n d - 无显示code U8 scn=0x7f,0xbf,0xdf,0xef;/先点亮左边一个数码管U8 buf4=14,14,14,14;/ 显示缓冲区,开机不显示code unsigned int cyc=1800,1600,1440,1351,1200,1079,960;/音阶1-7的半周期数code U8 to
28、ne=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;/ 乐曲康定情歌的简谱表code U8 time=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;/ 康定情歌
29、的节拍表U8 H0,L0,cnt=0,tm=0,sd=0;void cntint0(void) interrupt 1 / 定时器0中断用于产生音阶方波TH0=H0;TL0=L0;P2_3 = sd & 1; / P2.3是音乐信号输出脚sn = sd & 1; / 记住P2.3脚的状态sd+;void cntint1(void) interrupt 3 / 定时器1中断用于产生节拍延时char i,k;EA = 1;TH1 = 0xee; / 设置定时器时间常数 TL1 = 0; i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)P
30、0 = tabbufi;/ 笔划代码送P0口k = scni;if(sn = 0) k=k&0xf7;/恢复P2.3脚的状态P2 = k; / 控制扫描码送P2口cnt+;if(cnt>11)cnt=0;tm+;void main(void)U8 i,j,a,t;unsigned int b;next:TMOD=0x11;EA = 1;ET1 = 1;TR1 = 1;PT0 = 1;ET0 = 1; / 定时器0中断允许 TH1 = 0xee;/ 晶振11.0592MHz,5mS TL1 = 0; i=0;while(1)t=tonei; / 读音调for(j=0;j<3;
31、j+)bufj=bufj+1;buf3=t%10;if(t>50) break; / 0xff是结束符if(t!=0) / 0 是休止符b=cyct%10-1; / 根据基本音阶,求出半周期数if(t<10) b=b*2; / 若是低八度音阶,半周期数加倍if(t>20) b=b/2; / 若是高八度音阶,半周期数减半H0=(65536-b)/256; / 根据半周期数,计算T0初值的高字节和低字节L0=(65536-b)%256;TR0=1; / 启动定时器0发音tm=0;cnt=0;a=timei; / 读节拍while(a>tm);TR0=0;i+;for(b=0
32、;b<1000;b+); / 稍加延时,增强节奏感P2_3=1; / 关闭喇叭buf0=10;buf1=11;buf2=12;buf3=13;while(P3_2=1); / 等待按INT键goto next; / 重放一遍6、参考答案/*6.用Proteus打开文件"流水灯.DSN",可以看到在单片机89C52的P2口接有8个发光二极管。 编写流水灯的程序,使8个发光二极管每隔约0.5秒依次点亮(每次亮一个),要求开始时 从左往右点亮,每按一次按钮SW1后,改变流水的方向。*/#include <REG51.H>#define U8 unsigned c
33、harU8 code tab=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;U8 cnt = 0;/ 扫描计数bit next = 0;bit dri = 0;void main(void) EA = 1; / 允许中断TMOD = 0x01;/ 设定时器0为模式1(16位) ET0 = 1; / 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1;/ 开始计数 P2 = 0xff;while(1)if(P3_2=0)dri = !dri;while(P3_2=0); void timeint(voi
34、d) interrupt 1 / 定时器0中断服务程序static char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; P2 = tabi;cnt+;if(cnt=100)cnt=0;if(dri=0) i+;else i-;if(i<0) i = 7;else if(i>7) i = 0;7、参考答案/7-用Proteus打开文件"计数器.DSN",当按下键盘上的09十个数字键时,/ 能将键值在四个数码管上滚动显示。若按了AF六个字母键,则在数码管上显示(Over)。#include <REG51.H>#define U
35、8 unsigned char#define key_port P3U8 code tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC1,0x86,0xAF;/ 0 1 2 3 4 5 6 7 8 9 V E r U8 code kcode=0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A B C D E FU8 scn=0xf7,0xfb,0xfd,0xfe;
36、/ 先点亮左边一个数码管U8 buf4=0,0,0,0;/ 显示缓冲区,开机先显示"0000" U8 cnt = 0;/ 扫描计数void delay_ms(U8 ms)U8 i,j;for(i=0;i<100;i+) for(j=0;j<ms;j+);U8 key(void)U8 a,r = 0xff;delay_ms(20);/ 延时20毫秒,消除按键抖动if(key_port = 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r <
37、;= 15;r+) if(a = kcoder) break;if(r > 15) r = 0xff;/0xff表示无效rn:key_port = 0xf0;return r;void main(void) U8 k,i;EA = 1; / 允许中断TMOD = 0x01;/ 设定时器0为模式1(16位) ET0 = 1; / 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1;/ 开始计数 while(1) if (key_port != 0xf0) k = key(); if (k < 10) for(i=1;i<
38、;=3;i+) bufi-1=bufi;/ 数字左移一位 buf3 = k;/ 在个位显示刚按的数字else if(k<16)buf0 = 0 ;buf1 = 10;buf2 = 11;buf3 = 12; while(key_port != 0xf0);/ 等待按键抬起 delay_ms(20); while(key_port != 0xf0); void timeint(void) interrupt 1 / 定时器0中断服务程序char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为
39、 0,1,2,3)P0 = tabbufi;/ 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口cnt+;8、参考答案/8-用Proteus打开文件"电子秒表.DSN",开机时显示00.00,单位是分.秒,按"SW1"键启动/暂停计时,/ 在暂停状态按"SW2"键时分清零。在计时状态分和秒之间的小数点闪烁(每秒钟亮半秒,熄半秒),/ 暂停状态常亮。#include <REG51.H>#define U8 unsigned charU8 code tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,
40、0x82,0xF8,0x80,0x90,0xC1,0x86,0xAF;/ 0 1 2 3 4 5 6 7 8 9 V E r U8 scn=0xf7,0xfb,0xfd,0xfe;/ 先点亮左边一个数码管U8 buf4=0,0,0,0;/ 显示缓冲区,开机先显示"0000" U8 cnt = 0;/ 扫描计数bit Run = 0;bit Stop = 0;void delay_ms(U8 ms)U8 i,j;for(i=0;i<100;i+) for(j=0;j<ms;j+);void main(void) EA = 1; / 允许中断TMOD = 0x01;
41、/ 设定时器0为模式1(16位) ET0 = 1;/ 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592MHz,5mS TL0 = 0;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; else Run = 0;if(P3_3 = 0 && Run = 0)buf0 = 0 ;buf1 = 0;buf2 = 0 ;buf3 = 0;Stop = 0; while(P3_0 = 0 | P3
42、_3 = 0);/ 等待按键抬起 delay_ms(20); while(P3_0 = 0 | P3_3 = 0); void timeint(void) interrupt 1 / 定时器0中断服务程序char i;unsigned char c;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)c = tabbufi;if(i=1 && Stop = 0 && (Run = 0 | cnt<100) c = c & 0x7f;/ 笔划代
43、码送P0口P0 = c;P2 = scni;/ 控制扫描码送P2口cnt+;if(Run=1 && Run=1 && Stop = 0 && cnt=200)buf3+;if(buf3<10) return;buf3=0;buf2+;if(buf2<6) return;buf2=0;buf1+;if(buf1<10) return;buf1=0;buf0+;if(buf2<6) return;buf0 = 0;cnt = 0;9、定时关灯控制器参考答案/9-用Proteus打开文件"定时关灯控制器.DSN&quo
44、t;,按图编写程序设计一个定时关灯控制器。 / 从键盘输入时间(单位:秒,最大9999秒,最小1秒),按一下A键灯亮,时间每秒减1, / 减到0时停止,灯熄灭,可以再次输入时间并启动。#include <REG51.H>#define U8 unsigned char#define key_port P1bit run = 0;sbit Lamp = P37;code U8 kcode=0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A Bcode U8
45、 disp=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff;U8 buf4=0,0,0,0; U8 cnt=0;U8 scn=0x7f,0xbf,0xdf,0xef;/ 先点亮左边一个数码管void delay_ms(U8 ms)U8 i,j;for(i=0;i<100;i+) for(j=0;j<ms;j+);U8 key(void)U8 a,r=0xff;delay_ms(20);/ 延时20毫秒,消除按键抖动if(key_port = 0xf0) goto rn;a = key_port;key_port = a
46、| 0x0f;delay_ms(20);a = key_port;for (r = 0;r <= 11;r+) if(a = kcoder) break;if(r > 11) r = 0xff;/0xff表示无效rn:key_port = 0xf0;return r;void main(void) U8 k,i;TMOD = 0x01; / 设定时器0为模式1(16位) TH0 = 0xee; / 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1; / 开始计数 EA = 1; / 允许中断ET0 = 1; / 定时器0中断允许 key_port = 0xf0;L
47、amp = 1; / 清除加号标志delay_ms(20);while(1) / 循环 if (key_port != 0xf0) k = key(); if (k < 10) if(run = 0) for(i=1;i<=3;i+) bufi-1=bufi;/ 数字左移一位buf3 = k;/ 在个位显示刚按的数字 else if(k = 10) run = 1; Lamp = 0; while(key_port != 0xf0);/ 等待按键抬起 delay_ms(20); while(key_port != 0xf0); void timeint(void) interrup
48、t 1 / 定时器0中断服务程序char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03; / 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = dispbufi; / 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口cnt+;if(cnt=200)cnt = 0;if(buf0+buf1+buf2+buf3=0)run = 0; Lamp = 1; return;if(run=1)for(i=3;i>=0;i-) bufi-;if(bufi>9) bufi = 9; else break;10、参考答案/*10-用Proteus打开文件"交通信号灯.DSN",编程实现时间倒计时及绿黄红三色灯的切换。切换方式为: 南北方向:红灯R1亮15秒,绿灯G1亮20秒,黄灯Y1亮2秒 东西方向:绿灯G2亮13秒,黄灯Y2亮2秒,红灯R2亮22秒 如此周而复始。(提示:图中数码管与单片机之间的连接方式与实验指导书中相同)*/#include <REG51.H>#define U8 unsigned charU8 code tab=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;U8 code
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供配电技术课件西安工业大学
- 企业员工培训课件挖掘潜能-共同成长
- 小学六年级科学课件教科版第4课 改变运输的车轮
- 《夜归鹿门歌真用》课件
- 如何写好课题申请系列课程03逐个击破(上)
- 《促销及广告促销》课件
- 七年级道德与法治下册单元练习题及答案-初中道德与法治【人教版】道法七年级下册课件说课稿教案测试题真题
- 2022年湖北省黄冈市公开招聘警务辅助人员(辅警)笔试专项训练卷(1)含答案
- 2021年四川省成都市公开招聘警务辅助人员(辅警)笔试模拟自测题(B)卷含答案
- 2023年黑龙江省齐齐哈尔市公开招聘警务辅助人员(辅警)笔试冲刺自测题一卷含答案
- 自然辩证法学习通超星期末考试答案章节答案2024年
- 病句的辨析与修改-2023年中考语文一轮复习(原卷版)
- 幼儿园视频监控管理制度
- 主动脉瓣关闭不全
- 2024国家开放大学《企业信息管理》形成性考核1-4答案
- 2024年北师大版八年级上册全册数学单元测试题含答案
- 民办学校竞业限制合同文本
- 六年级下册心理健康教案-第三十三课 有你有我真温暖|北师大版
- 第15课 我们不乱扔 一年级道德与法治上册(2024版)教学设计
- 《ISO 55013-2024 资产管理-数据资产管理指南》解读和实施指导材料(雷泽佳编制-2024)
- GB/T 18314-2024全球导航卫星系统(GNSS)测量规范
评论
0/150
提交评论