单片机一键多功能控制(八个灯)c语言程序

合集下载

此程序是用单片机的p1口接八个led灯作跑马灯试验

此程序是用单片机的p1口接八个led灯作跑马灯试验

拆字程序Org 0000hMov A , 2000HAdd A ,#F0HMOV 2001H ,AMOV A ,2000HADD A , #0FHMOV 2002H , AMOV A , 2001HADD A , 2002HEND拆分BCD 码?***************************************************************************;此程序是用单片机的p1口接八个led灯作跑马灯试验,八个led依次亮了又熄灭,形成漂亮;的跑马灯。

本人已经试验成功。

;单片机教程网 原创;该8路单片机跑马灯程序代码简单,电路也容易搭建,只需把led接在p1口上就可以了,希望大家能试验成功顺利的完成跑马灯报告;***************************************************************************org 0000hloop0:cjne r0 ,#01h,rel,loop0 ;判断开关打开情况ajmp start;跳转到程序开始org 0030h;定义起始汇编地址start:mov a,#0ffh ;clr c ;mov r2,#08h ;循环八次。

loop: rlc a ;带进位左移。

mov p1,a ;此时led灯开始有反映了。

call delay ;延时djnz r2,loop ;循环(djnz条件判断)mov r2,#07h ;loop1: rrc a ;带进位右移mov p1,a ;此时led灯开始有反映了。

call delay ;djnz r2,loop1 ;反复循环jmp start ;回到程序的开头delay: mov r3,#20 ;延时子程序d1: mov r4,#20d2: mov r5,#248djnz r5,$djnz r4,d2```````````````````````````````````````````````---------3路单片机跑马灯程序---------------------------------------ORG 0000HLJMP MAINORG 030HMAIN: MOV P1,#0DBH ;化为2进制为11011011--0状态时led灯亮ACALL DELayMOV P1,#06DH ;化为2进制为01101101ACALL DELay ;MOV P1,#0B6H ;化为2进制为10110110ACALL DELayAJMP MAINdelay: mov r7,#255d1: mov r6,#255d2: djnz r6,d2djnz r7,d1retend。

项目二:8位流水灯的单片机控制

项目二:8位流水灯的单片机控制

三 、程序PROTUES仿真与调试
4
电容
电阻
30pF
22uF 200Ω 10kΩ
2只
1只 8只 1只
瓷片电容
电解电容 碳膜电阻 碳膜电阻
5
6
7 8
按键
40脚IC座 导线
1只
1只 1片 若干
无自锁
带自锁 安装AT89C51芯片
二、 控制程序的编写
(一)绘制程序流程图 本控制使用简单程序设计中的顺序结构形式实现,程序结 构流程图如下图。
A.7
A.7 CY CY A.7 A.7
A.0
A.0 A.0 A.0
RLC A
RRC A
后两条指令,影响P标志和CY。
例:
若A=5CH,CY=1,执行RLC A后, 结果:A=B9H,CY=0,P=1
0 1 1011 1100 1001 0101
对RLC、RRC指令,在CY=0时 RLC相当于乘以2 RRC相当于除以2
0F00H
R7,#10 R6,#100 R5,#200 R5,D2 R6,D1 R7,D0
; 延时程序从0F00H开始
;将立即数10送通用寄存器R7 ;将立即数100送通用寄存器R6 ;将立即数200送通用寄存器R5 ;根据R5减1后的内容判断程序执行方向 ;根据R6减1后的内容判断程序执行方向 ;根据R7减1后的内容判断程序执行方向 ;子程序返回指令 ;程序结束标记
项目预备知识:清0与取反指令
CLR A 将累加器A中的数据清零
CPL
A
将累加器A中的数据取反
取反:CPL A ;/A→A 例:若A=5CH,执行CPL 结果:A=A3H 清0:CLR A ;0→A

单片机课程设计—8个按键控制8个LED自动设定控制流水灯

单片机课程设计—8个按键控制8个LED自动设定控制流水灯

东北石油大学之袁州冬雪创作实习总结陈述实习类型生产实习实习单位东北石油大学实习基地实习起止时间 2018 年 7 月 7 日至 2018 年 7 月 16 日指导教员刘东明、孙鉴所在院(系) 电子迷信学院班 级电子迷信与技术 15-2学生姓名学 号 1509012402 2018 年 7 月 16 日目录第 1 章 按键节制流水灯设计 1 1.1 实习目标错误!未定义书签。

1.2 实习要求错误!未定义书签。

第 2 章 电路工作原理 22.5 本章小结 6 第 3 章 C 程序设计 73.1 程序设计流程图 73.3 本章小结 9 总结及体会 10 参考文献 11 附录 12第1章 按键节制流水灯设计1.1 实习目标本次实习以 STC89C52 单片机为节制核心.通过它实现对八盏 LED 灯的亮灭停 止设定,并在设定完成之后可以依照之前的设定实现流水灯效果.外部电路为按键 节制流水灯.P0 口节制八盏灯,P1 口节制矩阵键盘,P2 口节制独立按键,程序操 纵单片机外部计时器中断实现流水效果.要求流水灯可以自行设定、暂停、复位, 工作稳定,靠得住性高.生产实习的主要目标是培养实际接洽实际的才能,提高实际动手操纵才能.本 专业的生产实习旨在广泛懂得实际单片机电子产品工作的全过程,熟悉电子产品 的主要技术管理形式,并在实习的操纵过程中学习掌握电子产品的焊接装置调试 的实际操纵技能.巩固和加深懂得所学的实际,坦荡眼界,提高潜力,为培养高素 质大学本科人才打下需要的基础.透过学习,是实际与实际相连系,可以使学生加 深对所学知识的懂得,并为后续专业课的学习带给需要的感性知识,同时直接懂 得本业的生产过程和生产资料,为将来走上工作岗位带给需要的实际生产知识.1.2 实习要求1.深入学习单片机开辟软件 Keil 的使用,熟悉单片机电路设计,根据实际应 用电路对程序停止调试.2.熟悉单片机硬件开辟平台的应用,掌握单片机编程器、仿真器的使用,能 检查和分析软硬件故障.3.体会单片机外部资源的功能使用,以单片机开辟板现有资源停止应用性设 计.掌握单片机常常使用外围器件的使用.4.对去年生产实习焊接的 51 开辟板的程序有更深入的懂得.第2章 电路工作原理2.1 STC89C52 单片机工作原理单片机(Microcontrollers)是一种集成电路芯片,是采取超大规模集成电路技 术把具有数据处理才能的中央处理器 CPU、随机存储器 RAM、只读存储器 ROM、 多种 I/O 口和中断系统、定时器/计数器等功能(可以还包含显示驱动电路、脉宽 调制电路、摹拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个 小而完善的微型计算机系统.例如 STC89C52 单片机是通过 32 个输入输出口的高低电平变更来实现对外部 电路的节制,痛过相应的程序实现对 32 个输入输出口的节制,这就是单片机工作 的最基来历根基理.如图 2-1 所示为 STC89C52 单片机工作的最小系统电路图.图 2-1 STC89C52 最小工作系统 整个电路使用 5V 直流电源供电,其中复位电路可以使单片机复位;晶振电路 相当于单片机的心脏,为单片机提供 12MHz 的高频脉冲使单片机正常工作; MAX232 是将单片机输出的 TTL 电平转换成 PC 机能接纳的 232 电平或将 PC 机输 出的 232 电平转换成单片机能接纳的 TTL 电平,实现单片机与 PC 机之间的通信, 以便于下载程序.2.2 LED 工作原理LED(light-emitting diode),即发光二极管,俗称 LED 小灯,51 开辟板使用 的是普通贴片发光二极管.这种二极管通常的正向导通电压是 1.8~2.2V 之间,工作 电流一般在 1~20mA 之间.其中当电流在 1~5mA 之间变更时,随着通过 LED 的电 流越来越大,肉眼会感觉到这个灯越来越亮,而当电流从 5~20mA 变更时,看到 的发光二极管的亮度变更不分明了.当电流超出 20mA 时,LED 就有烧坏的危险. 所以在 51 开辟板的使用中需要根据相应的电流参数设计一个与 LED 串联的限流 电阻.如图 2-2 所示为单片机 I/O 口节制 LED 的电路原理图.图 2-2 单片机节制 LED 电路图 图中 PR2 为排阻,在电路中起到限流作用,防止 LED 被烧毁.因为单片机是可 以编程节制的,即 P00~P07 的高低电平也是可以节制的,所以对应的 8 个 LED 的 亮灭状态也是可以节制的,这就达到了单片机节制 LED 的目标.2.3 按键工作原理 2.3.1 独立按键工作原理独立式按键比较简单,它们各自与独立的输入线相毗连,如图 2-3 所示.图 2-3 独立式按键原理图 4 条输人线接到单片机的 I/O 口上,当按健 K1 按下时,+5V 通过电阻然后再 通过按键 K1 最终进人 GND 形成一条通路,这条线路的全部电压都加到这个电阻 上,P20 这个引脚就是个低电平.当松开按健后,线路断开,就不会有电值通过, P20 和+5V 就应该是等电位,是个高电平.我们便可以通过 P20 这个 10 口的高低电 平来断定是否有按键按下.2.3.2 矩阵按键工作原理在某一个系统设计中,如果需要使用很多按键时,做成独立按键会占用大量 I/O 口,因此引用了矩阵键盘的设计.如图 2-4 所示为 51 开辟板上的矩阵按键电路 原理图,使用 8 个 I/O 口来实现 16 个按键.图 2-4 矩阵按键原理图 在程序设计中分别用四个 I/O 口扫描 4 行,别的 4 个扫描 4 列,确定了按键在 哪行哪列也就确定了按键的详细位置.2.4 整体电路图如图 2-5 所示为键盘节制 LED 流水灯整体电路图.图 2-5 总电路原理图2.5 本章小结本章主要先容了单片机最小系统、LED 工作原理、按键工作原理.并从硬件电 路的设计出发,简单分析单片机节制 LED 的工作过程.实际分析基本完成,接下来 就是详细的程序设计与调试,通过详细的程序来实现相应的功能,这也是单片机 开辟中最具技术含量的环节之一.第3章 C 程序设计3.1 程序设计流程图如图 3-1 所示为主程序流程图.开端 开计时器中断K1 是否按下 否是扫描矩阵键盘选 择需要点亮的 LED是K2 是否按下 否K3 是否按下 否是保管选择的数据 择需要点亮的 LED计时器中断程序选择 数据实现 LED 流水灯图 3-1 程序设计框图 主程序由 3 个独立按键节制,K1,K2 和 K3.开端从主函数执行程序语句,不 竭循环扫描按键,当 K1 按下时,进入选择状态,程序会不竭地扫描矩阵键盘,通 过矩阵键盘选择需要点亮的 LED;选择竣事后按下 K2,程序会将选定后的数据送 入中断程序,中断程序根据接纳的数据选泽对应的 LED 实现流水灯效果;当按下K3 后程序又会进入矩阵键盘扫描重新选择 LED.3.2 实验成果如图 3-2 所示,当按下 K1 后进入选择定状态.图 3-2 选择 LED 如图 3-2,节制矩阵键盘分别选择了第 1,6,8 盏灯. 再按下 K2 键,让选择的第 1,6,8 盏灯实现流水灯效果.如图 3-3 所示.图 3-3 流水灯 如图 3-3,按下 K2 之后,LED 由之前第 1,6,8 盏灯亮变成第 1,2,7 盏灯 亮,实现了流水灯右移的效果. 当按下 K3 键,实验成果如图 3-4 所示.图3-4回到初始状态由图3-4可知,当按下K3键之后,程序又回到了设定LED的状态.3.3本章小结由实验成果可以看出,本次单片机课程设计已达到预期要求,电路工作稳定,知足设计要求.在整个设计过程中,程序设计与调试最为复杂,出现过按键灯不亮,没有出现滚动流水等现象等一系列程序问题.但最终在不竭地检查、调试之后,问题也逐渐得到处理.最终实现按键节制流水灯的效果.总结及体会本次设计通过对单片机停止编程节制,进而节制外部电路,成功地设计了八个按键节制八盏灯亮灭实现流水灯的效果.深入懂得到单片机开辟软件Keil的使用,熟悉单片机电路设计,根据实际应用电路对程序停止调试.熟悉单片机硬件开辟平台的应用,掌握了单片机编程器、仿真器的使用,能检查和分析软硬件故障.体会到单片机外部资源的功能使用,以单片机开辟板现有资源停止应用性设计.通过这次实习使我进一步弄懂所学到的讲义知识,巩固和深化对单片机的布局、指令系统、中断系统、键盘/显示系统、接口技术、系统扩大、定时/节制、程序设计、应用开辟、等基本实际知识的懂得,提高单片机应用于技术的实践操纵技能,掌握单片机应用系统设计、研制的方法,培养操纵单片机停止科技革新、开辟和创新的基天性力,为毕业后从事与单片机相关的工作打下一定的基础.参考文献[1]童诗白,华成英.摹拟电子技术基础(第四版)[M].北京:高等教导出版社,2006.[2]阎石.数字电子技术基础(第五版)[M].北京:高等教导出版社,2006.[3]韩建,全星慧,周围.电子技术课程设计指导[M].哈尔滨:哈尔滨工程大学出版社,2014.[4]黎小桃.数字电子电路分析与应用[M].北京:北京理工大学出版社,2014.[5]高吉祥. 电子技术基础实验与课程设计[M].北京:电子工业出版社,2002.[6]陈明义.电子技术课程设计实用教程(第3版) [M]. 长沙:中南大学出版社,2010.[7]程春雨. 摹拟电子技术实验与课程设计[M].北京:电子工业出版社,2016.[8]宋雪松,李东明,崔长胜. 手把手教你学51单片机(C语言版)[M]. 北京:清华大学出版社,2014.附录:#include <reg52.h>#include <intrins.h>#define KEY P1sbit k1=P2^0;sbit k2=P2^1;sbit k3=P2^2;sbit k4=P2^3;unsigned char LED=0x00,LED1=0x00;unsigned char x=0;unsigned char KeyValue;unsigned char A1=0x00,A2=0x00,A3=0x00,A4=0x00,A5=0x00,A6=0x00,A7=0x00,A8=0x00;void Delay10ms(unsigned int c);void KeyDown(); //矩阵键盘检测void kongzhil();void kongzhi2();void main(void){ TMOD=0x01; //定时器工作状态为1 TH0=(65536-50000)/256;TL0=(65536-50000)%6;EA=1; //开总中断ET0=1; //开定时器中断TR0=1; //开启定时器while(1){ int n=0;if(k1==0){Delay10ms(1);if(k1==0)n=1;}if(k3==0){Delay10ms(1);if(k3==0)n=3;}if(k4==0){Delay10ms(1);if(k4==0)n=4;}switch(n){case 1:KeyDown();break;case 3:kongzhil();break;case 4:kongzhi2();break;default:break;}}}void KeyDown(void){ int k=1;while(k){char a=0;KEY=0x0f;if(KEY!=0x0f){Delay10ms(1); //延时消抖if(KEY!=0x0f){KEY=0X0F;switch(KEY) //扫描行{case(0X07): KeyValue=0;break;case(0X0b): KeyValue=4;break;case(0X0d): KeyValue=8;break;case(0X0e): KeyValue=12;break;}KEY=0XF0;switch(KEY) //扫描列{case(0X70): KeyValue=KeyValue+3;break;case(0Xb0): KeyValue=KeyValue+2;break;case(0Xd0): KeyValue=KeyValue+1;break;case(0Xe0): KeyValue=KeyValue;break;}while((a<50) && (KEY!=0xf0)) //松手检测{Delay10ms(1);a++;}switch(KeyValue) //选择需要亮的灯{case(0):A1=~A1;break;case(1):A2=~A2;break;case(2):A3=~A3;break;case(3):A4=~A4;break;case(4):A5=~A5;break;case(5):A6=~A6;break;case(6):A7=~A7;break;case(7):A8=~A8;break;default:break;}}}if (A1==0xff) //保管数据(LED1=LED1|0x80);else if(A1==0x00)(LED1=LED1&0x7f);if (A2==0xff)(LED1=LED1|0x40);else if(A2==0x00)(LED1=LED1&0xbf);if (A3==0xff)(LED1=LED1|0x20);else if(A3==0x00)(LED1=LED1&0xdf);if (A4==0xff)(LED1=LED1|0x10);else if(A4==0x00)(LED1=LED1&0xef);if (A5==0xff)(LED1=LED1|0x08);else if(A5==0x00)(LED1=LED1&0xf7);if (A6==0xff)(LED1=LED1|0x04);else if(A6==0x00)(LED1=LED1&0xfb);if (A7==0xff)(LED1=LED1|0x02);else if(A7==0x00)(LED1=LED1&0xfd);if (A8==0xff)(LED1=LED1|0x01);else if(A8==0x00)(LED1=LED1&0xfe);LED=LED1;if(k2==0){Delay10ms(1);if(k2==0){k=0;LED=LED1;};};if(k4==0){Delay10ms(1);if(k4==0){k=0;kongzhi2();};};}}void kongzhil(void){int m=1;LED1=LED,LED=0x00;while(m){if(k3==0){Delay10ms(1);if(k3==0){m=0,LED=LED1;};}}}void kongzhi2(void){LED1=0x00;LED=0x00;A1=0;A2=0;A3=0;A4=0;A5=0;A6=0;A7=0;A8=0;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%6;x++;if(x==6) //6*50MS=300MS{x=0;P0=LED;LED = _crol_(LED,1);//if(++i==8) i=0;}}void Delay10ms(unsigned int c) {unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}。

单片机课程设计—8个按键控制8个LED自动设定控制流水灯

单片机课程设计—8个按键控制8个LED自动设定控制流水灯

西南石油年夜学之迟辟智美创作实习总结陈说 实习类型生产实习 实习单元 西南石油年夜学实习基地 实习起止时间 2018 年 7 月 7 日至 2018 年 7 月 16 日 指导教师刘东明、孙鉴 所在院(系) 电子科学学院 班 级电子科学与技术 15-2 学生姓名 学 号 15090124022018 年 7 月 16 日目录第 1 章 按键控制流水灯设计 1 1.1 实习目的错误!未定义书签。

1.2 实习要求错误!未定义书签。

第 2 章 电路工作原理 22.5 本章小结 6 第 3 章 C 法式设计 73.1 法式设计流程图 73.3 本章小结 9 总结及体会 10 参考文献 11 附录 12第1章 按键控制流水灯设计1.1 实习目的本次实习以 STC89C52 单片机为控制核心.通过它实现对八盏 LED 灯的亮灭进 行设定,并在设定完成之后能够依照之前的设定实现流水灯效果.外部电路为按键 控制流水灯.P0 口控制八盏灯,P1 口控制矩阵键盘,P2 口控制自力按键,法式利 用单片机内部计时器中断实现流水效果.要求流水灯能够自行设定、暂停、复位, 工作稳定,可靠性高.生产实习的主要目的是培养理论联系实际的能力,提高实际入手把持能力.本 专业的生产实习旨在广泛了解实际单片机电子产物工作的全过程,熟悉电子产物 的主要技术管理模式,并在实习的把持过程中学习掌握电子产物的焊接装置调试 的实际把持技能.巩固和加深理解所学的理论,开阔眼界,提高潜力,为培养高素 质年夜学本科人才打下需要的基础.透过学习,是理论与实际相结合,能够使学生 加深对所学知识的理解,并为后续专业课的学习带给需要的感性知识,同时直接 了解本业的生产过程和生产资料,为将来走上工作岗位带给需要的实际生产知识.1.2 实习要求1.深入学习单片机开发软件 Keil 的使用,熟悉单片机电路设计,根据实际应 用电路对法式进行调试.2.熟悉单片机硬件开发平台的应用,掌握单片机编程器、仿真器的使用,能 检查和分析软硬件故障.3.体会单片机内部资源的功能使用,以单片机开发板现有资源进行应用性设 计.掌握单片机经常使用外围器件的使用.4.对去年生产实习焊接的 51 开发板的法式有更深入的了解.第2章 电路工作原理2.1 STC89C52 单片机工作原理单片机(Microcontrollers)是一种集成电路芯片,是采纳超年夜规模集成电路 技术把具有数据处置能力的中央处置器 CPU、随机存储器 RAM、只读存储器 ROM、 多种 I/O 口和中断系统、按时器/计数器等功能(可能还包括显示驱动电路、脉宽 调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个 小而完善的微型计算机系统.例如 STC89C52 单片机是通过 32 个输入输出口的高低电平变动来实现对外部 电路的控制,痛过相应的法式实现对 32 个输入输出口的控制,这就是单片机工作 的最基来源根基理.如图 2-1 所示为 STC89C52 单片机工作的最小系统电路图.图 2-1 STC89C52 最小工作系统 整个电路使用 5V 直流电源供电,其中复位电路能够使单片机复位;晶振电路 相当于单片机的心脏,为单片机提供 12MHz 的高频脉冲使单片机正常工作; MAX232 是将单片机输出的 TTL 电平转换成 PC 机能接收的 232 电平或将 PC 机输 出的 232 电平转换成单片机能接收的 TTL 电平,实现单片机与 PC 机之间的通信, 以便于下载法式.2.2 LED 工作原理LED(light-emitting diode),即发光二极管,俗称 LED 小灯,51 开发板使用 的是普通贴片发光二极管.这种二极管通常的正向导通电压是 1.8~2.2V 之间,工作 电流一般在 1~20mA 之间.其中当电流在 1~5mA 之间变动时,随着通过 LED 的电 流越来越年夜,肉眼会感觉到这个灯越来越亮,而当电流从 5~20mA 变动时,看 到的发光二极管的亮度变动不明显了.当电流超越 20mA 时,LED 就有烧坏的危险. 所以在 51 开发板的使用中需要根据相应的电流参数设计一个与 LED 串连的限流 电阻.如图 2-2 所示为单片机 I/O 口控制 LED 的电路原理图.图 2-2 单片机控制 LED 电路图 图中 PR2 为排阻,在电路中起到限流作用,防止 LED 被烧毁.因为单片机是可 以编程控制的,即 P00~P07 的高低电平也是能够控制的,所以对应的 8 个 LED 的 亮灭状态也是能够控制的,这就到达了单片机控制 LED 的目的.2.3 按键工作原理 2.3.1 自力按键工作原理自力式按键比力简单,它们各自与自力的输入线相连接,如图 2-3 所示.图 2-3 自力式按键原理图 4 条输人线接到单片机的 I/O 口上,当按健 K1 按下时,+5V 通过电阻然后再 通过按键 K1 最终进人 GND 形成一条通路,这条线路的全部电压都加到这个电阻 上,P20 这个引脚就是个低电平.当松开按健后,线路断开,就不会有电值通过, P20 和+5V 就应该是等电位,是个高电平.我们就可以通过 P20 这个 10 口的高低电 平来判断是否有按键按下.2.3.2 矩阵按键工作原理在某一个系统设计中,如果需要使用很多按键时,做成自力按键会占用年夜 量 I/O 口,因此引用了矩阵键盘的设计.如图 2-4 所示为 51 开发板上的矩阵按键电 路原理图,使用 8 个 I/O 口来实现 16 个按键.图 2-4 矩阵按键原理图 在法式设计中分别用四个 I/O 口扫描 4 行,另外 4 个扫描 4 列,确定了按键在 哪行哪列也就确定了按键的具体位置.2.4 整体电路图如图 2-5 所示为键盘控制 LED 流水灯整体电路图.图 2-5 总电路原理图2.5 本章小结本章主要介绍了单片机最小系统、LED 工作原理、按键工作原理.并从硬件电 路的设计动身,简单分析单片机控制 LED 的工作过程.理论分析基本完成,接下来 就是具体的法式设计与调试,通过具体的法式来实现相应的功能,这也是单片机 开发中最具技术含量的环节之一.第3章 C 法式设计3.1 法式设计流程图如图 3-1 所示为主法式流程图.开始 开计时器中断K1 是否按下 否是扫描矩阵键盘选 择需要点亮的 LED是K2 是否按下 否K3 是否按下 否是保管选择的数据 择需要点亮的 LED计时器中断法式选择 数据实现 LED 流水灯图 3-1 法式设计框图 主法式由 3 个自力按键控制,K1,K2 和 K3.开始从主函数执行法式语句,不 竭循环扫描按键,当 K1 按下时,进入选择状态,法式会不竭地扫描矩阵键盘,通 过矩阵键盘选择需要点亮的 LED;选择结束后按下 K2,法式会将选定后的数据送 入中断法式,中断法式根据接收的数据选泽对应的 LED 实现流水灯效果;当按下K3 后法式又会进入矩阵键盘扫描重新选择 LED.3.2 实验结果如图 3-2 所示,当按下 K1 后进入选择定状态.图 3-2 选择 LED 如图 3-2,控制矩阵键盘分别选择了第 1,6,8 盏灯. 再按下 K2 键,让选择的第 1,6,8 盏灯实现流水灯效果.如图 3-3 所示.图 3-3 流水灯 如图 3-3,按下 K2 之后,LED 由之前第 1,6,8 盏灯亮酿成第 1,2,7 盏灯 亮,实现了流水灯右移的效果. 当按下 K3 键,实验结果如图 3-4 所示.图3-4回到初始状态由图3-4可知,当按下K3键之后,法式又回到了设定LED的状态.3.3本章小结由实验结果可以看出,本次单片机课程设计已到达预期要求,电路工作稳定,满足设计要求.在整个设计过程中,法式设计与调试最为复杂,呈现过按键灯不亮,没有呈现滚动流水等现象等一系列法式问题.但最终在不竭地检查、调试之后,问题也逐渐获得解决.最终实现按键控制流水灯的效果.总结及体会本次设计通过对单片机进行编程控制,进而控制外部电路,胜利地设计了八个按键控制八盏灯亮灭实现流水灯的效果.深入了解到单片机开发软件Keil的使用,熟悉单片机电路设计,根据实际应用电路对法式进行调试.熟悉单片机硬件开发平台的应用,掌握了单片机编程器、仿真器的使用,能检查和分析软硬件故障.体会到单片机内部资源的功能使用,以单片机开发板现有资源进行应用性设计.通过这次实习使我进一步弄懂所学到的课本知识,巩固和深化对单片机的结构、指令系统、中断系统、键盘/显示系统、接口技术、系统扩展、按时/控制、法式设计、应用开发、等基本理论知识的理解,提高单片机应用于技术的实践把持技能,掌握单片机应用系统设计、研制的方法,培养利用单片机进行科技革新、开发和立异的基天性力,为结业后从事与单片机相关的工作打下一定的基础.参考文献[1]童诗白,华成英.模拟电子技术基础(第四版)[M].北京:高等教育出书社,2006.[2]阎石.数字电子技术基础(第五版)[M].北京:高等教育出书社,2006.[3]韩建,全星慧,周围.电子技术课程设计指导[M].哈尔滨:哈尔滨工程年夜学出书社,2014.[4]黎小桃.数字电子电路分析与应用[M].北京:北京理工年夜学出书社,2014.[5]高吉祥. 电子技术基础实验与课程设计[M].北京:电子工业出书社,2002.[6]陈明义.电子技术课程设计实用教程(第3版) [M]. 长沙:中南年夜学出书社,2010.[7]程春雨. 模拟电子技术实验与课程设计[M].北京:电子工业出书社,2016.[8]宋雪松,李东明,崔长胜. 手把手教你学51单片机(C语言版)[M]. 北京:清华年夜学出书社,2014.附录:#include <reg52.h>#include <intrins.h>#define KEY P1sbit k1=P2^0;sbit k2=P2^1;sbit k3=P2^2;sbit k4=P2^3;unsigned char LED=0x00,LED1=0x00;unsigned char x=0;unsigned char KeyValue;unsigned char A1=0x00,A2=0x00,A3=0x00,A4=0x00,A5=0x00,A6=0x00,A7=0x00,A8=0x00;void Delay10ms(unsigned int c);void KeyDown(); //矩阵键盘检测void kongzhil();void kongzhi2();void main(void){ TMOD=0x01; //按时器工作状态为1 TH0=(65536-50000)/256;TL0=(65536-50000)%6;EA=1; //开总中断ET0=1; //开按时器中断TR0=1; //开启按时器while(1){ int n=0;if(k1==0){Delay10ms(1);if(k1==0)n=1;}if(k3==0){Delay10ms(1);if(k3==0)n=3;}if(k4==0){Delay10ms(1);if(k4==0)n=4;}switch(n){case 1:KeyDown();break;case 3:kongzhil();break;case 4:kongzhi2();break;default:break;}}}void KeyDown(void){ int k=1;while(k){char a=0;KEY=0x0f;if(KEY!=0x0f){Delay10ms(1); //延时消抖if(KEY!=0x0f){KEY=0X0F;switch(KEY) //扫描行{case(0X07): KeyValue=0;break;case(0X0b): KeyValue=4;break;case(0X0d): KeyValue=8;break;case(0X0e): KeyValue=12;break;}KEY=0XF0;switch(KEY) //扫描列{case(0X70): KeyValue=KeyValue+3;break;case(0Xb0): KeyValue=KeyValue+2;break;case(0Xd0): KeyValue=KeyValue+1;break;case(0Xe0): KeyValue=KeyValue;break;}while((a<50) && (KEY!=0xf0)) //松手检测{Delay10ms(1);a++;}switch(KeyValue) //选择需要亮的灯{case(0):A1=~A1;break;case(1):A2=~A2;break;case(2):A3=~A3;break;case(3):A4=~A4;break;case(4):A5=~A5;break;case(5):A6=~A6;break;case(6):A7=~A7;break;case(7):A8=~A8;break;default:break;}}}if (A1==0xff) //保管数据(LED1=LED1|0x80);else if(A1==0x00)(LED1=LED1&0x7f);if (A2==0xff)(LED1=LED1|0x40);else if(A2==0x00)(LED1=LED1&0xbf);if (A3==0xff)(LED1=LED1|0x20);else if(A3==0x00)(LED1=LED1&0xdf);if (A4==0xff)(LED1=LED1|0x10);else if(A4==0x00)(LED1=LED1&0xef);if (A5==0xff)(LED1=LED1|0x08);else if(A5==0x00)(LED1=LED1&0xf7);if (A6==0xff)(LED1=LED1|0x04);else if(A6==0x00)(LED1=LED1&0xfb);if (A7==0xff)(LED1=LED1|0x02);else if(A7==0x00)(LED1=LED1&0xfd);if (A8==0xff)(LED1=LED1|0x01);else if(A8==0x00)(LED1=LED1&0xfe);LED=LED1;if(k2==0){Delay10ms(1);if(k2==0){k=0;LED=LED1;};};if(k4==0){Delay10ms(1);if(k4==0){k=0;kongzhi2();};};}}void kongzhil(void){int m=1;LED1=LED,LED=0x00;while(m){if(k3==0){Delay10ms(1);if(k3==0){m=0,LED=LED1;};}}}void kongzhi2(void){LED1=0x00;LED=0x00;A1=0;A2=0;A3=0;A4=0;A5=0;A6=0;A7=0;A8=0;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%6;x++;if(x==6) //6*50MS=300MS{x=0;P0=LED;LED = _crol_(LED,1);//if(++i==8) i=0;}}void Delay10ms(unsigned int c) {unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}。

单片机课程报告 从P1.0到P1.7依次点亮八个LED灯

单片机课程报告 从P1.0到P1.7依次点亮八个LED灯

实验报告内容:一、设计功能描述,指明基本要求及提高要求的实现内容;二、实验材料清单(包括:软件工具名称、仪器设备名称、元器件等);三、实验实施过程描述,要点包括:(1)设计功能描述;(2)描述原理图设计思路,并画出电路图;(3)描述程序设计思路,并画出程序流程图;(4)写出源程序及其必要注释;(5)片内RAM的地址及I/O端口分配表;(6)子程序列表(名称、功能描述、出入口);(7)调试结果描述;(8)出现问题及其学习情境1一实验目的:点亮LED灯二实验任务:从P1.0到P1.7依次点亮八个LED灯三实验材料及器件四设计功能描述利用单片机的P1口,依次循环点亮1个灯,使人们感觉到亮灯的位置在依次顺序移动,可产生一种动态显示的效果。

四实验原理图五程序设计思路及程序流程图要依次点亮八盏灯,根据点亮的位置及从哪一个开始点亮,向P1口传递如下数据11111110(FEH)——点亮P1.0连接的LED, MOV P1,#0FEH 11111101(FDH)——点亮P1.1连接的LED, MOV P1,#0FDH ……….01111111(7FH)——点亮P1.7连接的LED, MOV P1,#07FH 分析如上数据可以发现,他们它们后面穿送的数据依次是前面数据左移一位的结果,因此我们可以利用循环程序来实现这个功能,程序流程图如下所示六实验源程序org 0000hstart: mov r2,#08h ;设置循环次数mov a,#0feh ;送显示模式字next: mov p1,a ;点亮连接P1.0的发光二极管acall delayrr a ;左移一位,改变显示模式字djnz r2,next ;循环次数减1不为0,继续点亮下面一个LEDsjmp start ;重复上述过程delay: mov r3,#0efhdel2: mov r4,#0ffhdel1: nopdjnz r4,del1djnz r3,del2retend七子程序列表(名称、功能描述、出入口);delay: mov r3,#0efhdel2: mov r4,#0ffhdel1: nopdjnz r4,del1djnz r3,del2ret该程序为典型的双重循环的延时子程序,他通过子程序入口delay: mov r3,#0efh进入程序,当程序运行至djnz r4,del1时进入第一重循环,当第一重循环结束时,进入djnz r3,del2第二重循环,最后经过ret退出子程序七调试结果描述程序下载成功后,LED灯从左到右来回一个一个亮灭亮灭八出现问题及其解决办法前面把送显示模式写成07fh,后面载入系统板的时候才发现原来十六进制排列方法为P1.7-P1.0,要写成0feh然后依次循环左移,才能实现led从左到右的流水。

51单片机8个发光二极管闪烁设计方案

51单片机8个发光二极管闪烁设计方案

51单片机8个发光二极管闪烁设计方案1. 方案目标本方案旨在设计一个基于51单片机的电路和程序,实现8个发光二极管的闪烁效果。

具体目标如下:1.实现8个发光二极管的交替闪烁。

2.控制每个发光二极管的亮灭时间和频率。

3.确保方案具有可行性和高效性。

2. 实施步骤2.1 硬件设计根据目标需求,我们需要以下硬件组件:1.51单片机(如STC89C52):作为主控芯片,负责控制8个发光二极管的亮灭状态。

2.8个发光二极管:用于显示亮灭状态。

3.8个电流限流电阻:用于限制发光二极管的工作电流,防止过流损坏。

4.连接线:用于连接主控芯片、发光二极管和电流限流电阻。

硬件连接步骤如下:1.将主控芯片与发光二极管之间通过连接线连接起来。

2.将每个发光二极管与对应的电流限流电阻连接起来,确保电流在安全范围内。

2.2 软件设计软件设计包括编写主控芯片的程序代码,实现对8个发光二极管的控制。

以下是一个基本的软件设计思路:1.定义8个IO口用于连接发光二极管,并设置为输出模式。

2.定义一个变量ledState表示当前发光二极管的亮灭状态,初始值为0。

3.在主循环中,通过改变ledState的值来控制发光二极管的亮灭状态。

4.使用延时函数或定时器来控制每个发光二极管的亮灭时间和频率。

具体步骤如下:1.初始化IO口:将8个IO口设置为输出模式。

2.定义变量:定义一个整型变量ledState用于记录当前发光二极管的亮灭状态,默认为0。

3.进入主循环:–设置第一个发光二极管为亮,其他7个发光二极管为灭。

–延时一段时间(如200ms)。

–设置第一个发光二极管为灭,第二个发光二极管为亮,其他6个发光二极管为灭。

–延时一段时间(如200ms)。

–重复以上步骤,依次控制每个发光二极管的亮灭状态。

4.返回主循环。

2.3 预期结果通过上述硬件和软件设计,我们可以实现8个发光二极管的交替闪烁效果。

具体预期结果如下:1.8个发光二极管按照顺序交替亮灭。

四、实现8个LED流水灯

四、实现8个LED流水灯

/***************项目名称:实现8个LED流水灯***************/ #include<reg52.h> //引用S52单片机头文件/***************定义8个LED引脚***************************/ sbit LED1=P1^0; //定义一个LED的引脚sbit LED2=P1^1; //定义另一个LED的引脚sbit LED3=P1^2;sbit LED4=P1^3;sbit LED5=P1^4;sbit LED6=P1^5;sbit LED7=P1^6;sbit LED8=P1^7;void Delay(void); //子函数的声明,后面要加分号。

void main() //主程序main函数{while(1) //在主程序中设置死循环"while(1)"{LED1=0; //P1.0口输出低电平,使LED1灯亮Delay(); //延时字函数的调用LED1=1; //P1.0口输出高电平,使LED1灯灭LED2=0; //P1.1口输出低电平,使LED2灯亮Delay(); //延时字函数的调用LED2=1; //P1.1口输出高电平,使LED2灯灭LED3=0; //P1.2口输出低电平,使LED3灯亮Delay(); //延时字函数的调用LED3=1; //P1.2口输出高电平,使LED3灯灭LED4=0; //P1.3口输出低电平,使LED4灯亮Delay(); //延时字函数的调用LED4=1; //P1.3口输出高电平,使LED4灯灭LED5=0; //P1.4口输出低电平,使LED5灯亮Delay(); //延时字函数的调用LED5=1; //P1.4口输出高电平,使LED5灯灭LED6=0; //P1.5口输出低电平,使LED6灯亮Delay(); //延时字函数的调用LED6=1; //P1.5口输出高电平,使LED6灯灭LED7=0; //P1.6口输出低电平,使LED7灯亮Delay(); //延时字函数的调用LED7=1; //P1.6口输出高电平,使LED7灯灭LED8=0; //P1.7口输出低电平,使LED8灯亮Delay(); //延时字函数的调用LED8=1; //P1.7口输出高电平,使LED8灯灭}}void Delay(void) //子函数的建立,延时一段时间的子函数{unsigned int i=50000; //声明一个int型的变量,即"int"的范围为0~65536 while(--i); //延时一段时间}。

单片机控制LED灯点亮(C语言)

单片机控制LED灯点亮(C语言)

将0xfe赋给P1口,然后使用移位函数来改变P1口的值,达到流水灯的效果 移位函数: _crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回 。 _crol_,_cror_: c51中的intrins.h库函数
程序如下:
随后会弹出一个对话框,要求选择单片机的型号。在该对话框中显示了Vision2的器件数据库,从中可以根据使用的单片机来选择。
PART ONE
AT89S52
8051 based Full Static CMOS controller with Three-Level Program Memory Lock, 32 I/O lines, 3 Timers/Counters, 8 Interrupts Sources, Watchdog Timer, 2 DPTRs(DATA POINTER REGISTERS ), 8K Flash Memory, 256 Bytes On-chip RAM 基于8051全静态CMOS控制器、 三级加密程序存储器 、 32个I/O口 、三个定时器/计数器 、八个中断源 、看门狗定时器、2 个数据指针 寄存器、8k字节Flash,256字节片内RAM
十六进制整常数
十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。 以下各数是合法的十六进制整常数: 0X2A(十进制为42) 0XA0 (十进制为160) 0XFFFF (十进制为65535) 以下各数不是合法的十六进制整常数: 5A (无前缀0X) 0X3H (含有非十六进制数码)
各种进位制的对应关系
十进制
二进制
十六进制
十进制
二进制
十六进制
0
0
0
9
1001

单片机八个流水灯左右依次点亮实验

单片机八个流水灯左右依次点亮实验
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int //加黑的都是定义头文件
void DelayMS(uint x) /Leabharlann 延时{uchar i;
while(x--)
{
for(i=0;i<120;i++);
掌握单片机的去抖原理及处理办法二实验仪器与设备1
单片机八个流水灯左右依次点亮实验
一、实验目的
1.掌握keilC51软件与PROTEUS软件联合仿真调试的方法;
2.掌握单片机的去抖原理及处理办法
二、实验仪器与设备
1.微机1台2. keilC51集成开发环境3.Proteus仿真软件
三、实验内容
实验程序:
}
}
} //利用循环移位函数_crol_(左循环)和_cror_(右循环)形成来回滚动的效果
实验结果图片:
}
}
void main() //主程序
{
uchar i;
P2=0x01;
while(1)
{
for(i=0;i<7;i++)
{
P2=_crol_(P2,1); //左循环移动
DelayMS(150);
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1); //右循环移动
DelayMS(150);

单片机课程设计-8个LED灯来回点亮

单片机课程设计-8个LED灯来回点亮
第一章绪论
课题简介
当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品。而电子LED灯已跨入了我们生活的众多电子领域。在众多场合随处可见的闪光灯,流水灯不仅大方美观而且十分节能。然而控制它们的单片机却是一个不能被忽视的角色。
单片机简介
第二章设计目的及要求
2.1设计目的
通过本次课题设计,应用《单片机原理及应用》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。
通过本次设计的训练,可以使我在基本思路和基本方法上对基于89C51单片机的系统设计有一个比较感性的认识,并具备一定程度的设计能力。
5.2编辑源程序--------------------------------------------------14
第六章系统调试与仿真结果--------------------------------16
6.1系统调试-----------------------------------------------------16
4.5工作电路------------------------------------------------------12
第五章软件设计------------------------------------------------13
5.1程序流程图--------------------------------------------------13
培养实践技能,提高分析和解决实际问题的能力。
2.2设计要求
(1)认真研究设计任务书,明确设计要求、条件、内容和步骤;复习课程有关内容,熟悉有关单元电路的设计方法和步骤;搜集、分析、消化相关资料、软件等;掌握微型计算机应用系统软件设计方法;准备好设计需要的图书、资料和工具;拟定设计计划等

用51控制8个LED灯的亮灭

用51控制8个LED灯的亮灭

用51控制8个LED灯的亮灭本来以为这个程序很简单的,没想到写了快三个小时。

哎学艺不精啊。

贴出来给你研究吧。

我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样,1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态程序中使用了P1口与8个发光二极管相连,具体电路图你百度一下吧,还有使用了一个按键,该按键与P3.7相连,低电平为按下状态。

程序如下:#include#include/*变量声明:i、j、k都是记录计时器溢出次数的变量,stat是记录当前显示状态的变量,由按键key控制temp是状态2中保护P1口状态的变量*/unsigned char i=0,j=0,k=0,stat=0,temp;bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯sbit key=P3^7; //按键控制void init(); //初始化函数void delay(unsigned int N); //延时函数void keyscan(); //键盘扫描函数void main(){init();while (1){switch (stat){case 0: //0方案if(i==20&&flag){i=0;P1=P1<<1; //依次亮灯temp=P1;if(temp==0){flag=0;}}if(i==20&&!flag){i=0;if(P1==0xff){flag=1;P1=0xfe;}if(!flag){P1=P1<<1; //依次灭灯temp=P1;P1=temp+1;}}break;case 1: //2方案if(i==20){i=0;P1=~P1; //去反后亮灯状态为灭灯,P1初值取0x55或0xaa,奇偶交替亮灯}break;case 2: //3方案if(j==60){P1=temp;P1=_crol_(P1,1);temp=P1; //保护P1口亮灯状态k=0;j=0;}//闪烁部分,应该可以优化if(k<5){P1=0xff;}else if(k>=5&&k<10){P1=temp;}else if(k>=10&&k<15){P1=0xff;}else if(k>=15&&k<20){P1=temp;}else if(k>=20&&k<25){P1=0xff;}else if(k>=30&&k<35){P1=temp;}else if(k>=35&&k<40){P1=0xff;}//----------------------------------- break;}keyscan();}}void init(){TH0=0x3c; //定时器赋初值定时时间50ms TL0=0xB0;TMOD=0x01; //设置定时器工作方式为方式1 EA=1; //开总中断ET0=1; //开中断允许位TR0=1; //定时器计数P1=0xfe; //这里假设led灯与P1口相连并且//低电平有效}void delay(unsigned int N){int i,j;for (i=0;i<n;i++);for (j=0;j<110;j++);}void keyscan(){if(!key){delay(10); //消抖if(!key); //确认有键按下stat++;if(stat==3){stat=0;}//右键按下复位i=0;j=0;k=0;TH0=0x3c;TL0=0xB0;switch (stat){case 0:P1=0xfe;flag=1;stat=0;break;case 1:P1=0x55;break;case 2:P1=0xfe;temp=P1;break;}//-----------------------------------while(!key) //此循环中的函数和主函数中的显示函数是同一个//用于长按键的显示,可以去掉,去掉长按键不会正常显示,松开按键后正常{switch (stat){case 0:if(i==20&&flag){i=0;P1=P1<<1;temp=P1;if(temp==0){flag=0;}}if(i==20&&!flag){i=0;if(P1==0xff){flag=1;P1=0xfe;}if(!flag){P1=P1<<1;temp=P1;P1=temp+1;}break;case 1:if(i==20){i=0;P1=~P1;}break;case 2:if(j==60){P1=temp;P1=_crol_(P1,1); temp=P1;k=0;j=0;}if(k<5){P1=0xff;}else if(k>=5&&k<10) {P1=temp;}else if(k>=10&&k<15)P1=0xff;}else if(k>=15&&k<20){P1=temp;}else if(k>=20&&k<25){P1=0xff;}else if(k>=30&&k<35){P1=temp;}else if(k>=35&&k<40){P1=0xff;}break;}}}}void timer0() interrupt 1 {TH0=0x3c;TL0=0xB0; //溢出后重新赋初值//定时器中断时间为50msi++; //20次中断时间为1s j++; //40次中断时间为2s k++; //60次中断时间为3s }</n;i++);。

【8个流水灯来回点亮设计程序】

【8个流水灯来回点亮设计程序】

单片机C语言如何实现8个LED流水灯来回流动?第一部分参考程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//--------------------------------void DelayMS(uint ms){uchar t;while(ms--) for (t=0;t<120;t++);}//----------------------------------void main(){P2= 0xfe;while (1){P2 =_crol_(P2,1);DelayMS(200);}}2012-06-14 17:06 芯DZ|分类:C/C++|浏览267次现在只能从左到右循环流动,怎么才能从左到右再从右到左流动呢?#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit beep=P2^3;uchar p1e;void delay(uint a);void main(){p1e=0xfe;P1=p1e;while(1){p1e=_crol_(p1e,1);delay(55);P1=p1e;beep=0;delay(55);beep=1;delay(55);}}void delay(uint a){uint x,y;for(x=a;x>0;x--)for(y=150;y>0;y--); }提问者采纳2012-06-14 17:51char i;while(1){for(i=0; i<7; i++){p1e=_crol_(p1e,1);delay(55);P1=p1e;beep=0;delay(55);beep=1;delay(55);}for(i=0; i<7; i++){p1e=_cror_(p1e,1);delay(55);P1=p1e;beep=0;delay(55);beep=1;delay(55);}}CYF0316|六级p1e=_cror_(p1e,1);追问这个只是向右移吧...我是说向左移动到第8个LED后再从第8个向左移,实现来回流动回答1,赋值2,右移动3,再赋值4,左移动你程序都写出了只是把程序COPy 粘帖到下面把p1e=_crol_(p1e,1); 改成p1e=_cror_(p1e,1); 就好了呀第二部分参考、归纳、总结得正确程序(仅供参考)#include <AT89X51.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned intvoid DelayMS(uint ms) {uchar t;while(ms--) for (t=0;t<120;t++);}void main(){ char i;P2= 0xfe;while (1){for(i=0; i<7; i++){P2 =_crol_(P2,1);DelayMS(200);}for(i=0; i<7; i++){P2 =_cror_(P2,1);DelayMS(200);}}}以下是附加文档,不需要的朋友下载后删除,谢谢班主任工作总结专题8篇第一篇:班主任工作总结小学班主任特别是一年级的班主任,是一个复合性角色。

单片机跑马灯p0引脚对8盏灯的控制

单片机跑马灯p0引脚对8盏灯的控制

单片机跑马灯输入引脚对8盏灯的控制1. 简介单片机跑马灯是一种常见的电子设计,通过程序控制多个灯的亮灭顺序,实现灯光闪烁的效果。

在这个设计中,我们将着重讨论单片机跑马灯中输入引脚对8盏灯的控制方法。

2. 单片机跑马灯的原理单片机跑马灯的设计原理是通过单片机的输出引脚控制LED灯的亮灭。

通过程序控制输出引脚的电平变化,可以控制LED灯的亮度,从而实现不同的灯光效果。

3. 输入引脚对8盏灯的控制方法在单片机跑马灯中,一般使用输入引脚来控制灯光的亮灭顺序。

对于8盏灯的控制,我们可以通过以下方法实现:3.1 使用二进制控制可以通过单片机的IO口输出8位二进制数,然后通过这个二进制数的变化来控制8盏灯的亮灭顺序。

可以通过循环移位的方法来实现灯光的顺序变化,从而实现跑马灯的效果。

3.2 使用计数器可以通过单片机上的定时器或者计数器来控制灯光的亮灭顺序。

通过定时器的中断生成,可以实现灯光的循环控制,从而实现跑马灯的效果。

3.3 使用外部输入还可以通过外部的输入引脚来控制灯光的亮灭顺序。

可以通过按键或者其他传感器来控制灯光的变化,从而实现跑马灯的效果。

4. 实际案例以下是一个使用输入引脚对8盏灯进行控制的实际案例:4.1 案例描述我们使用STM32单片机来设计一个跑马灯程序,通过外部引脚控制8盏LED灯的亮灭顺序。

我们设计了一个简单的电路,将8盏LED灯连接到单片机的8个引脚上,然后通过外部的输入引脚来控制LED灯的亮灭。

4.2 实现方法我们首先编写了一个简单的程序,通过外部输入引脚来控制LED灯的亮灭顺序。

我们使用定时器的中断功能,以固定的时间间隔来控制LED灯的亮灭,从而实现跑马灯的效果。

4.3 测试结果经过测试,我们成功实现了通过外部输入引脚控制8盏LED灯的跑马灯效果。

我们可以通过外部的按键来控制LED灯的亮灭顺序,从而实现不同的灯光效果。

5. 结论通过上述案例,我们可以看到,通过输入引脚控制8盏LED灯的跑马灯效果是可行的。

用PIC单片机驱动按键控制8个数码管的显示的C程序

用PIC单片机驱动按键控制8个数码管的显示的C程序

用PIC16F877A单片机驱动按键控制8个数码管的显示的C程序经典按键控制数码管C程序#include <htc.h>#define HC595_SER RB7#define HC595_SCK RB6#define HC595_RCK RB5#define key_164_data RB3#define key_164_clk RB2#define key_com1 RB1#define key_com0 RB0#define TURE 1bit key_finish; //定义的位变量,这是PICmate仿真软件环境的特有的地方unsigned int sample_key;unsigned int sample_keyBuf[2];unsigned int key_value;unsigned char key_row_sel;unsigned char key_number;//键号unsigned int T100ms;unsigned char disbuf[8];const unsigned char seven_seg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5 e,0x79,0x71};//----------------------------------------------void disbuf_update(void){if(key_number>=16){disbuf[0]=0xff;disbuf[1]=0xff;disbuf[2]=0xff;disbuf[3]=0xff;disbuf[4]=0xff;disbuf[5]=0xff;disbuf[6]=0xff;disbuf[7]=0xff;return;}disbuf[0]=seven_seg[key_number];disbuf[1]=seven_seg[key_number];disbuf[2]=seven_seg[key_number];disbuf[3]=seven_seg[key_number];disbuf[4]=seven_seg[key_number];disbuf[5]=seven_seg[key_number];disbuf[6]=seven_seg[key_number];disbuf[7]=seven_seg[key_number];}//----------------------------------------------void inite_time0(void) //对timer0中断进行初始化{PSA=0;T0CS=0;T0IF=0;GIE=1;T0IE=1;TMR0=0xf0;PS0=1;PS1=1;PS2=1;}//----------------------------------------------//发送一个字节void s_pData(unsigned char key) //形参key对应着实参disbuf[i]{unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))HC595_SER=1;else HC595_SER=0;HC595_SCK=0;HC595_SCK=1;}}//----------------------------------------------//发送一个字节void Key_s_pData(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))key_164_data=1;elsekey_164_data=0;key_164_clk=0;key_164_clk=1;}}//---------------------------------------------- void display (void){unsigned char i;for(i=0;i<8;i++)s_pData(disbuf[i]);HC595_RCK=0;HC595_RCK=1;}//---------------------------------------------- void key_process(void){unsigned char i;for(i=0;i<16;i++){if( (key_value&(0x0001<<i)) ){key_number=i;return;}}}//---------------------------------------------- //主程序int main(void){PORTB=0;TRISB=0x03;inite_time0();key_number=0xff;while(1){if(key_finish==TURE){//按键扫描成功key_process();key_finish=0;}if(T100ms<10)continue;T100ms=0;disbuf_update();display();}}//---------------------------------------------- void scan_key(void){sample_key =sample_key<<1;if(key_com1)sample_key |=0x0001;sample_key =sample_key<<1;if(key_com0)sample_key |=0x0001;key_row_sel++;if(key_row_sel<8){Key_s_pData(1<<key_row_sel);return;}key_row_sel=0;Key_s_pData(1<<key_row_sel);sample_keyBuf[0]=sample_key;if(sample_keyBuf[1]!=sample_keyBuf[0]){sample_keyBuf[1]=sample_keyBuf[0];return;}key_value=sample_keyBuf[0];if(key_value!=0)key_finish=TURE;}//-------------------------------------------- //2ms中断interruptvoid time_int(void){if(T0IF==1){T0IF=0;TMR0=0xf0;T100ms++;scan_key();}}它的电路图可以参考用PIC16F877A单片机驱动按键控制8个数码管的显示电路图.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档