版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。每点亮一个LED,采用软件延时一段时间。2、简单键控的流水灯 不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。松手后,又按正序点亮流水灯。3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。二、实验方案1、总体方案设计 考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。 所用硬件:AT89C52、BUTTON、LED-BLUE、电源 输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。低电平有效 输出:P0.0~P0.7-D0~D7。LED组连线采用共阳极,低电平有效 软件设计: 软件延时采用延时函数delay(t),可调整延迟时间: voiddelay(uintt){ uinti; while(t--) for(i=0;i<1000;i++){ if(P2!=oldK&&P2!=K[0]) break; //按下了其他键退出循环 } } 由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。 按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。 为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。 主要算法:1、全局变量的定义:ucharD[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f}; //单个LED亮ucharAllOff=0xff; //LED全灭ucharAllOn=0x00; //LED全亮ucharK[]={0xff,0xfe,0xfd,0xfb,0xf7}; //按键开关ucharoldK; //记录已按键intn; 2、顺序、逆序点亮流水灯:voidforward(){ for(n=0;n<=7;n++){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}voidbackward(){ for(n=7;n>=0;n--){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:voidhold(){ n=8; while(1){ if(P2==K[4]){ //一直按着K4键,逆序点亮跑马灯 oldK=K[4]; if(n==-1) n=7; //D0灯亮后点亮D7 while(n>=0){ out=D[n]; n--; if(delay4(15)) break; } } if(P2==K[0]){ //未按下K4键,一直正序点亮跑马灯 oldK=K[0]; if(n==8) n=0; //D7灯亮后点亮D0 while(n<=7){ out=D[n]; n++; if(delay4(15)) break; } } if(P2!=K[4]&&P2!=K[0]){ //按下了其他键,退出hold函数 break; } }}4、 对应实验内容第一项,开机顺序点亮流水灯:while(1){ //开机即正序点亮流水灯 forward(); if(P2!=K[0]){ break; } }2、实验原理图图21实验原理图3、程序流程图图22程序流程图三、源程序#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineoutP0ucharD[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f}; //单个LED亮ucharAllOff=0xff; //LED全灭ucharAllOn=0x00; //LED全亮ucharK[]={0xff,0xfe,0xfd,0xfb,0xf7}; //按键开关ucharoldK; //记录已按键intn; //记录当前亮的灯号voiddelay(uintt){ uinti; while(t--) for(i=0;i<1000;i++){ if(P2!=oldK&&P2!=K[0]) break; //按下了其他键退出循环 }}voiddelay10ms(){ uinti; for(i=0;i<10000;i++);}voidforward(){ for(n=0;n<=7;n++){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}voidbackward(){ for(n=7;n>=0;n--){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}intdelay4(uintt){ uinti; while(t--) for(i=0;i<1000;i++){ if(P2!=oldK){ //按键变化退出循环 return1; } } return0;}voidhold(){ n=8; while(1){ if(P2==K[4]){ //一直按着K4键,逆序点亮跑马灯 oldK=K[4]; if(n==-1) n=7; //D0灯亮后点亮D7 while(n>=0){ out=D[n]; n--; if(delay4(15)) break; } } if(P2==K[0]){ //未按下K4键,一直正序点亮跑马灯 oldK=K[0]; if(n==8) n=0; //D7灯亮后点亮D0 while(n<=7){ out=D[n]; n++; if(delay4(15)) break; } } if(P2!=K[4]&&P2!=K[0]){ //按下了其他键,退出hold函数 break; } }} voidmain(){ oldK=K[0]; while(1){ //开机即正序点亮流水灯 forward(); if(P2!=K[0]){ break; } } while(1){ out=AllOff; if((P2&0x0f)!=0x0f){ //检测有键按下 delay10ms(); //延时10ms再去检测 //P2.0_K1键按下正序点亮流水灯 if(P2==K[1]){ oldK=K[1]; while(1){ forward(); if(P2!=K[1]&&P2!=K[0]){ //按下了其他键,退出 break; } } } //P2.1_K2键按下逆序点亮流水灯 if(P2==K[2]){ oldK=K[2]; while(1){ backward(); if(P2!=K[2]&&P2!=K[0]){ //按下了其他键,退出 break; } } } //P2.2_K3键按下关闭全部LED if(P2==K[3]){ oldK=K[3]; out=AllOff; } //P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止 if(P2==K[4]){ hold(); } } }}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。(如图4-1)图41基本的流水灯2、简单键控的流水灯:按下K4键即点亮D7灯,若一直按着K4键逆序点亮流水灯,松开则顺序点亮流水灯,且按键状态改变时送当前已亮的灯开始变换顺序而不是从D0或D7灯开始亮灯。(如图4-2)图4-2简单键控的流水灯3、键控的流水灯:K1键按下顺序点亮流水灯,K2键按下逆序点亮流水灯,K3键按下全局灭灯。(如图4-3)图43键控的流水灯五、实验思考题1、采用I/O口作为输出口时要考虑哪些因素?为什么实验装置中LED要串联一个电阻?当作为输出口时候就是单片机向外发出数据,或者再产生拉电流,单片机的拉电流一般要比灌电流小,基本上就能点亮2,3个LED,功率很有限,所以一般时候必须用驱动芯片来驱动单片机的外围器件。串联电阻是为了保护电路。2、采用I/O口作为输入口时要注意什么?键控的流水灯时为什么要在延时程序中检测是否按键?当作为输入口时候是单片机接收IC的数据信息,或者是灌电流,这时候要考虑电流的大小是否在单片机的承受范围内。为了防止在延时程序中间有按键按下却检测不到的情况,即放在延时中检测间隔时间短,反应快。3、为什么延时程序要做一个函数?可以具体事情具体处理,方便灵活的调用。六、总结 通过本次实验,我不仅更熟悉了Protues及Keil软件的使用,对C51编程的使用也更上一层楼,对于C51的编程语句与传统的C语言编程有一些区别,其中的无符号字符型是我在C语言中从未使用过的,在C51编程中会经常用到,用来给单片机的端口赋值或判断端口的值。对于C51
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026秋招:美的置业集团笔试题及答案
- 2026秋招:金利金铅集团试题及答案
- 2026秋招:江西盐业集团笔试题及答案
- 数字素养与中学英语写作教学的融合策略探究教学研究课题报告
- 做账实操-预制菜公司成本核算实例
- 数据中心环境参数监测规则
- 2026年大学(给排水科学与工程)期末阶段测试试题及答案
- 2026年大学(车辆工程)数据处理实训试题及答案
- 2026年大学(财务报表分析)企业财务诊断阶段测试试题及答案
- 2025全国青少年“学宪法、讲宪法”网络活动知识竞赛题库及答案
- 2026长治日报社工作人员招聘劳务派遣人员5人备考题库及答案1套
- 河道清淤作业安全组织施工方案
- 2025年国家开放大学《公共经济学》期末考试备考试题及答案解析
- 2025年河北省职业院校技能大赛高职组(商务数据分析赛项)参考试题库(含答案)
- 情绪的作文400字五篇
- 【蓝光】蓝光电梯的调试资料
- NY/T 682-2003畜禽场场区设计技术规范
- GB/T 33725-2017表壳体及其附件耐磨损、划伤和冲击试验
- FZ/T 01057.1-2007纺织纤维鉴别试验方法 第1部分:通用说明
- 实习协议模板(最新版)
- 不同GMP法规间的区别
评论
0/150
提交评论