1设计一个单片机系统,实现如下功能:使用1个按键S2,8个1ed灯,1个数码管,-|||-(

1个回答
展开全部
摘要 对于这个单片机系统的设计,我们可以考虑使用一块8051单片机及其相关的外围电路来实现。以下是该系统的功能及其实现方法: 1. 通过按键S2切换LED灯的亮灭状态,实现半加器的功能。如果LED灯亮,则按下按键后LED灯熄灭;如果LED灯熄灭,则按下按键后LED灯亮起。 2. 使用8个LED灯实现数字1到8的显示,其中每个LED灯代表一个数字。例如,当需要显示数字3时,第3个LED灯亮起。
咨询记录 · 回答于2023-06-08
1设计一个单片机系统,实现如下功能:使用1个按键S2,8个1ed灯,1个数码管,-|||-(
1、设计一个单片机系统,实现如下功能:使用1个按键S2,8个led灯,1个数码管。(1)当没有按键按下时,8个led灯熄灭,同时数码管也熄灭:(12分)(2)当按键S2第1次按下时,实现流水灯效果,同时数码管显示数字0; (12分)(3)按键S2第2次按下时,8个led灯交叉亮,同时数码管显示数字2。
对于这个单片机系统的设计,我们可以考虑使用一块8051单片机及其相关的外围电路来实现。以下是该系统的功能及其实现方法: 1. 通过按键S2切换LED灯的亮灭状态,实现半加器的功能。如果LED灯亮,则按下按键后LED灯熄灭;如果LED灯熄灭,则按下按键后LED灯亮起。 2. 使用8个LED灯实现数字1到8的显示,其中每个LED灯代表一个数字。例如,当需要显示数字3时,第3个LED灯亮起。
3. 使用1个数码管显示当前的时间。我们可以通过外接振荡器产生定时脉冲,然后通过计时器控制数码管的显示动作。 下面是单片机系统的详细设计: 1. 硬件连接: - 按键S2接在P1.0引脚,需要通过上拉电阻连接到5V电源。 - 8个LED灯分别接在P1.1 ~ P1.8引脚,需要通过限流电阻连接到GND电源。 - 数码管的8个引脚分别连接到P2.0 ~ P2.7引脚和P3.7引脚,需要通过限流电阻连接到GND电源。 - 振荡器接在P1.1和P1.2引脚,通过相应的电容连接到GND电源。
ORG 0HSTART: MOV P1, #0FFH ; P1口输出高电平,从而关闭全部LED灯 MOV TMOD, #01H ; 定时器0工作在模式1(13位定时器) MOV TH0, #0 ; 定时器0初值为0 MOV TL0, #0 ; 定时器0初值为0 SETB TR0 ; 启动定时器0 MOV TMOD, #0B00000010 ; 定时器1工作在模式2(8位自动重装载定时器),将T1脚设置为输出模式 CLR TR1 ; 停止定时器1 MOV R7, #0 ; 将R7寄存器清零,用于存储计数值 ACALL SWITCH ; 调用按键处理子程序 ACALL DISPLAY ; 调用数码管显示子程序 SJMP START ; 一直执行主程序SWITCH: ; 按键处理子程序 CPL P1.1 ; 切换第1个LED灯的亮灭状态 SETB ACC.7 ; 将ACC.7寄存器置1,用于辅助处理延时 SETB P3.7 ; 将数码管的DP引脚置1,表示数码管显示小数点 DJNZ R7, $ ; 延时,等待按键弹起,同时将
要代码的
DJNZ R7, $ ; 延时,等待按键弹起,同时将ACC.7寄存器减1 CLR P3.7 ; 将数码管的DP引脚清零,表示数码管不显示小数点 CLR ACC.7 ; 将ACC.7寄存器清零 CJNE P1.0, #0, $ ; 判断按键是否被按下,如果没有被按下则跳回SWITCH子程序开头 MOV R7, #10 ; 将R7寄存器数值设置为10,用于控制LED灯的切换速度 RET ; 结束子程序 DISPLAY: ; 数码管显示子程序 MOV TH1, #0FEH ; 计时器1初值为0FEH MOV TL1, #0 ; 将计时器1的初值清零 SETB TR1 ; 启动计时器1 MOV A, R7 ; 将R7寄存器的值复制到A寄存器 MOV P2, #0 ; P2口输出低电平,将数码管置于选择位 MOV P2.7, #1 ; 将P2.7引脚输出高电平,控制数码管显示DP引脚 MOV P0, #0 ; 将P0口输出低电平,清空数码管的控制线 MOV R6, #0 ; 将R6寄存器清零,用于存储当前数码管需要显示的数字 MOV R5, #0 ; 将R5寄存器清零,用于辅助处理延时 DELA
: DJNZ R5, $ ; 延时,等待计时器1溢出,同时将R5寄存器减1 CLR TR1 ; 停止计时器1 MOV TH1, #0FEH ; 计时器1初值为0FEH MOV TL1, #0 ; 将计时器1的初值清零 SETB TR1 ; 启动计时器1 MOV A, R6 ; 将R6寄存器存储的数字复制到A寄存器 MOV P0, A ; 将A寄存器的值输出到P0口,控制数码管的段选引脚 MOV P2, #1 ; 将P2口输出高电平,选择下一个数码管显示 DJNZ R7, DISPLAY ; 如果还没有显示完所有数码管,则再次调用DISPLAY子程序 CLR R7 ; 将R7寄存器清零,准备下一次显示 RET ; 结束子程序
不是这个,是c语言
这个就是代码,因为字数限制我得分开发送。一下子发不过去
是这种
else { t=0; } if(keyi==1) //初始状态 { P2=0; //关闭8个led灯 num=0; //数码管初始值为0 keyi=0; //重置按键次数 }
L4=0; L5=1; delay(500); L5=0; L6=1; delay(500); L6=0; L7=1; delay(500); L7=0; L8=1; delay(500); L8=0; num=0; //数码管显示数字0 Keyi=0; //重置按键次数 } }
if(keyi==3) //当按键S2第2次按下时 { while(1) { L1=1; //交叉亮LED灯 L2=0; L3=1; L4=0; L5=1; L6=0; L7=1; L8=0; delay(500); L1=0; L2=1; L3=0; L4=1; L5=0; L6=1; L7=0; L8=1; delay(500);
num=2; //数码管显示数字2 Keyi=0; //重置按键次数 } }
#include //头文件#define uint unsigned int#define uchar unsigned charsbit KEY=P1^0; //定义按键口sbit L1=P2^0; //定义8个led口sbit L2=P2^1;sbit L3=P2^2;sbit L4=P2^3;sbit L5=P2^4;sbit L6=P2^5;sbit L7=P2^6;sbit L8=P2^7;sbit DU=P2^6; //数码管段选sbit WE=P2^7; //数码管位选
void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); } void main() { uint t, keyi=0; uchar num=0; while(1) { if(KEY==0) //按键S2是否按下 { t++; if(t>=1000) //消抖处理 { t=0; keyi++; } }
else { t=0; } if(keyi==1) //初始状态 { P2=0; //关闭8个led灯 num=0; //数码管初始值为0 keyi=0; //重置按键次数 } if(keyi==2) //当按键S2第1次按下时 { while(1) {
L1=1; //依次点亮8个led delay(500); L1=0; L2=1; delay(500); L2=0; L3=1; delay(500); L3=0; L4=1; delay(500); L4=0; L5=1; delay(500); L5=0; L6=1; delay(500); L6=0; L7=1; delay(500); L7=0;
num=0; //数码管显示数字0 keyi=0; //重置按键次数 } } if(keyi==3) //当按键S2第2次按下时 { while(1) { L1=1; //交叉亮LED灯 L2=0; L3=1; L4=0; L5=1; L6=0; L7=1;
L8=0; delay(500); L1=0; L2=1; L3=0; L4=1; L5=0; L6=1; L7=0; L8=1; delay(500); num=2; //数码管显示数字2 keyi=0; //重置按键次数 } }
//数码管显示 P0=num; DU=1; delay(1); DU=0; }}
2、设计一个单片机系统,实现如下功能:(1)用单片机控制两个LED数码管,数码管显示00~99计数,时间间隔为1s。(14分)(2)使用一个按键S2,当按键S2按下时,数码管显示00。(8分)(3)使用一个按键S3,当按键S3按下时,数码管开始计数。(8分)(4)使用一个按键S4,当按键S4按下时,数码管暂停计数。(8分)
#include //头文件#define uint unsigned int#define uchar unsigned charsbit S2=P1^0; //定义按键S2口sbit S3=P1^1; //定义按键S3口sbit S4=P1^2; //定义按键S4口sbit L1=P2^0; //定义LED数码管sbit L2=P2^1;sbit L3=P2^2;sbit L4=P2^3;sbit L5=P2^4;sbit L6=P2^5;sbit L7=P2^6;sbit L8=P2^7;uchar code tabel[]={ //共阴极数码管显示0~9及空格 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00};
void delay(uint ms){ uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--);}这是实现延时的函数
void main() { uchar x=0, y=0, start=0, pause=0, key=0; while(1) { if(S2==0) //S2按键被按下 { delay(5); //消抖延时 if(S2==0) //再次判断S2是否按下 { x=0; y=0; //数码管显示00 start=0; pause=1; //重置计数值并暂停计数 key=0; //重置按键标志位 } while(S2==0); //等待S2被释放 } if(S3==0) //S3按键被按下 {
delay(5); //消抖延时 if(S3==0) //再次判断S3是否按下 { start=1; pause=0; //开始计数,恢复计数 key=0; //重置按键标志位 } while(S3==0); //等待S3被释放 } if(S4==0) //S4按键被按下 { delay(5); //消抖延时 if(S4==0) //再次判断S4是否按下 { pause=!pause; //切换计数状态,恢复/暂停计数 key=0; //重置按键标志位 } while(S4==0); //等待S4被释放 }
if(!pause) //计数状态打开 { key=1; if(key) //防止重复计数 { x++; //计数器自增1 if(x==10) //满10进1 { x=0; y++; if(y==10) { y=0; } } key=0; }
L1=tabel[y%10]; L2=tabel[y/10]; L3=0x40; //小数点 L4=tabel[x%10]; L5=tabel[x/10]; delay(1000); //延时1秒 } else //计数状态关闭 { L1=0; L2=0; L3=0x00; L4=0; L5=0; //关闭LED数码管 } }}
#include //头文件#define uint unsigned int#define uchar unsigned charsbit S2=P1^0; //定义按键S2口sbit S3=P1^1; //定义按键S3口sbit S4=P1^2; //定义按键S4口sbit L1=P2^0; //定义LED数码管sbit L2=P2^1;sbit L3=P2^2;sbit L4=P2^3;sbit L5=P2^4;sbit L6=P2^5;sbit L7=P2^6;sbit L8=P2^7;uchar code tabel[]=
{ //共阴极数码管显示0~9及空格 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00};void delay(uint ms){ uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--);}void main(){
uchar x=0, y=0, start=0, pause=0, key=0; while(1) { if(S2==0) //S2按键被按下 { delay(5); //消抖延时 if(S2==0) //再次判断S2是否按下 { x=0; y=0; //数码管显示00 start=0; pause=1; //重置计数值并暂停计数 key=0; //重置按键标志位 } while(S2==0); //等待S2被释放 } if(S3==0) //S3按键被按下 {
delay(5); //消抖延时 if(S3==0) //再次判断S3是否按下 { start=1; pause=0; //开始计数,恢复计数 key=0; //重置按键标志位 } while(S3==0); //等待S3
已赞过
你对这个回答的评价是?
评论 收起
下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消