80C51单片机流水灯设计
(完整版)51单片机流水灯程序

1.第一个发光管以间隔200ms 闪烁。
2.8 个发光管由上至下间隔1s 流动,其中每个管亮500ms, 灭500ms 。
3.8 个发光管来回流动,第个管亮100ms 。
4.用8 个发光管演示出8 位二进制数累加过程。
5.8 个发光管间隔200ms 由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms 间隔全部闪烁 5 次。
重复此过程。
6.间隔300ms 第一次一个管亮流动一次,第二次两个管亮流动,依次到8 个管亮,然后重复整个过程。
7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8 个全部闪烁 3 次;关闭发光管,程序停止。
1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p P1A0; uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a; delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay() {uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main() {uchar a,i;while(1)a=0xfe; for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a) { uint x,y; for(x=a;x>0;x--) for(y=110;y>0;y--);}void main() {uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main() { uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe; for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa; delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300); a=_crol_(a,1);}}P1=0xff; for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd; delay(300);P1=0xdb; delay(300);P1=0xe7; delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。
单片机最小系统实现花样流水灯

3.灯阵从由下顶点开始,以逆时针依次点亮,最后回到下顶点。
4.灯阵从由下顶点开始,以顺时针依次点亮,最后回到下顶点。
5.先奇数灯点亮,然后偶数灯点亮,呈交替状态。
6.所有灯先同时点亮,后同时熄灭,呈闪烁状态。
7.以上六种状态依次运行。
以上七种运行方式, 由外部中断(微动开关) 控制,即一次中断运行状态1, 两次中断运行状态2,… 当遇到第八此中断时,再次从状态1开始。
uchar ID;
uchar cnபைடு நூலகம்=0; uint j;
void main()
{SP=0x50;
P1=0x00;
//P0=0x00;
EA=1;
IT0=1;
EX0=1;
TMOD=0x10; TH1=15536/256;
TL1=15536%256;
ET0=1; TR0=1;
ID=1;cnt=0; while(1){if(ID>7)
功;最后用keil C编程软件及STC-ISP下载软件完成STC89C5单 片机对外围流水灯设计的整体控制。
三、设计需求
整个流水灯系统由按键控制,实现各种状态之间的转换,即按 键第一次压下,流水灯进入到第一种状态;按键第二次压下,流水 灯进入到第二种状态;以此类推。
四、设计材料
序号
器件
数量
功能
1
STC-89C52单片机最小系统板
基于STC-89C51的流水灯的设计与实现
一、设计目的
以STC-80C51单片机最小系统为核心,设计多样式流水灯。掌 握外围LED电路的设计方法,熟练掌握C51软件编程控制方法,实 现LED闪烁功能,最终完成单片机的应用与外围电路的开发任务。
基于51单片机的流水灯及点阵设计报告

目录1. 引言 (2)1.1 背景 (2)1.2 设计目的 (2)1.3 参考资料 (2)2. 方案设计与比较论证2.1 设计任务 (2)2.2 设计要求 (2)2.3 方案的选择 (3)3. 总体设计 (3)3.1 开发与运行环境 (3)3.2 系统软件工作流程图 (3)3.3 硬件结构 (4)4. 系统功能测试与整体指标 (6)4.1 系统各模块功能的性能测试 (6)4.1.1 LED小灯模块 (6)4.1.2 点阵模块 (9)4.1.3 按键模块 (10)4.2 系统功能测试 (12)4.3 系统误差与问题分析 (12)5. 总结 (13)附录1;详细程序 (14)1. 引言1.1 背景随着电子技术的飞速发展,电子行业和社会上的各行各业息息相关,从家用电器到航空航天,无一不与电子产业的发展密切相关。
当我们看到大街小巷都是变幻多彩的霓虹灯时,心中是否会感到很新奇?当我们看到绚丽多彩的广告牌时,心中是否会觉得很神奇?这些神奇的流水灯只是电子产业的冰山一角,更多的知识需要我们在以后的道路上慢慢探索。
在单片机上实现流水灯很简单,只需要几条指令就可以完成,大部分学生都可以完成任务。
于是我们就思考一个新的问题,能不能实现一个亮度渐变的、按规律移动的超酷流水灯?这就是本次设计的背景及意义。
1.2 设计目的本次基于51单片机的流水灯设计主要是为了让我们增进对80C51单片机电路的感性认识,加深对理论方面的理解。
了解软硬件的有关知识,并掌握软硬件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。
虽然本次设计较为简单,但是涵盖的内容较为丰富,运用了单片机的动态扫描、定时器、中断,用for循环来实现彗星灯的效果,PWM波控制LED的亮灭程度,独立按键的应用等等,另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。
1.3 参考资料【1】单片机原理及应用·马永杰主编·清华大学出版社 2011.8【2】51单片机C语言教程·郭天祥主编·电子工业出版社 2009.12【3】模拟电子技术基础·康华光主编·高等教育出版社 2006.012. 方案设计与比较论证2.1 设计任务(1)基于51单片机实现一个亮度渐变的、按规律移动的超酷流水灯;(2)基于51单片机实现在点阵上动态显示“心”型和依次显示“西北师大”;(3)通过独立按键实现流水灯和点阵显示的切换。
单片机流水灯课程设计

单片机流水灯课程设计第一篇:单片机流水灯课程设计单片机原理及系统课程设计报告基于AT89C51单片机的流水灯引言1.1 课题简介单片机全称叫单片微型计算机(Single Chip Microcomputer),是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:在智能仪器仪表上的应用,例如精密的测量设备;在工业控制中的应用,用单片机可以构成形式多样的控制系统、数据采集系统,例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等;在家用电器中的应用可从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
单片机在医用设备领域中的应用,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等;在各种大型电器中的模块化应用,如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。
本设计着重在于分析计算器软件和开发过程中的环节和步骤,并从实践经验出发对计算器设计做了详细的分析和研究。
80C51单片机可控流水灯的设计

西安文理学院机械电子工程系课程设计任务书学生姓名王鑫专业班级电信专业08级2班学号 0810*******指导教师朱继萍职称教研室电子信息工程课程单片机技术及应用题目 80C51单片机可控流水灯的设计任务与要求设计任务:使用80C51单片机的P2口和P3口控制LED1~LED16进行花样显示。
显示顺序规律为:①16个LED依次左移单个点亮;②16个LED依次左移逐个点亮;③ 16个LED依次左移逐个熄灭;④从①开始再次循环。
设计要求:1、利用80C51单片机和74LS373芯片设计硬件电路;2、运用汇编语言编写实现该任务的程序;3、使用Proteus ISIS软件和Keil C51软件进行仿真,验证设计。
开始日期 2011.12.19 完成日期 2011.12.302011年 12月 18 日80C51单片机可控流水灯的设计【设计任务】本设计将使用80C51单片机的P2口和P3口控制LED1~LED16进行花样显示。
预计显示顺序规律为:①16个LED依次左移单个点亮;②16个LED依次左移逐个点亮;③ 16个LED依次左移逐个熄灭;④从①开始再次循环。
【硬件设计】使用74LS373与单片机连接,进行数据锁存驱动,其连接方法为:由P2口输出数据,控制2片74LS373以驱动16个LED数码管;P3控制74LS373进行选择与锁存数据。
在桌面双击图标,打开ISIS 7 Professional窗口。
单击菜单命令“File” → “New Design”,新建一个DEFAULT模板,保存文件名为“80C51单片机可控流水灯. DSN”。
执行菜单命令“System” → “Set Sheet Size”,在弹出的“Sheet Size Configura…”对话框中选择“A4”选项,单击“OK”选项,完成图纸的设置。
执行菜单命令“Library” →“Pick Device/Symbol”,添加如表1所示的原件。
C51单片机实现呼吸灯和花样流水灯程序

C51单⽚机实现呼吸灯和花样流⽔灯程序1.⽤C51单⽚机实现花样流⽔灯,代码如下:#include <reg52.h>#define LED_A P1 //led灯所⽤的接⼝,是哪个⼝就写P⼏void delayms(){unsigned char x = 0; unsigned char i;unsigned char y = 0;while(y < 0.001) //定义led灯的切换的延时时间,越⼩越快。
{ //(y < 0.001);(x<100);(i<100)都可以修改x = 0;while(x<100){i = 0;while(i<100){i++;}x++;}y++;}}#define LED_NUM 8 //定义led灯的数量,可快速实现不同⽤途的修改;void main(){unsigned char k;unsigned char j;unsigned char LED_ALL[] = {0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //led灯亮灭的⼗六进制数组;unsigned char LED_ALL_2[] = {0XFC,0XF3,0XCF,0X3F}; while(1) { for(k=0;k<3;k++) //第⼀个for实现奇偶灯交叉闪烁三次,想闪烁⼏次就修改(K<3)中的数值; { LED_A = 0xAA; delayms(); LED_A = 0x55; delayms(); } for(k=3;k>0;k--) //实现⼀个流⽔灯左右三次(从左到右再从右到左算⼀次); { for(j=0;j<LED_NUM;j++) { LED_A = LED_ALL[j]; delayms(); } for(j=6;j>0;j--) { LED_A = LED_ALL[j]; delayms(); } } for(k=0;k<3;k++) //实现前四个灯亮后四个灯灭,交叉闪烁3次,修改次数同上; { LED_A = 0xf0; delayms(); LED_A = 0xf; delayms(); } for(k=3;k>0;k--) //实现两个灯依次流⽔3次; { for(j=0;j<4;j++) { LED_A = LED_ALL_2[j]; delayms(); } for(j=2;j>0;j--) { LED_A = LED_ALL_2[j]; delayms(); } } }}2.实现第⼀个灯呼吸,由暗变亮,再由亮变暗,程序如下;#include <reg52.h>sbit LED1 = P3^0;void delay(unsigned int a) //定义⼀个延时函数{ while(--a);}void main(){ unsigned int t,circle=800; //定义变量,circle=800为led灯呼吸的间隔长短,数值越⼩,间隔越短。
单片机流水灯原理图pcb

一、设计题目流水灯设计二、设计要求1、通过本次课程设计对80C51单片机对数据的处理和输出显示的认识和理解。
2、能够结合单片机对数据的处理输出显示了解单片机软件的应用。
3、将软、硬件有机地结合,软件系统采用汇编语言编写程序,并在WAVE中调试运行。
三、设计内容功能描述:1.功能要求:程序运行后,将依次循环出现8只LED依次逐个点亮,依次逐个叠加,依次逐个递减,从两边靠拢后分开,从两边叠加递减的流水灯效果。
2.使用说明:总体分三大部分(1)8个发光二极管(2)80C51单片机(3)软件部分按照硬件电路图把8个发光二极管依次连接P1.0~P1.7如图所示,EA (80C51 31脚) 为访问外部程序存储器控制信号,低电平有效当。
当EA端保持高电平时,单片机访问片内程序存储器的程序。
若超出该范围时,自动转去执行外部程序存储器的程序。
当EA端保持低电平时,无乱片内有无程序存储器,均只访问外部程序存储器,所以硬件电路要保持31脚高电平。
18 、19脚是接外部晶振的两脚,根据硬件电路图接上12MHz的外部晶振。
9脚是复位脚即为RESET,该引脚为单片机的上电复位端,当单片机晶体振荡器工作时,该引脚上出现两个机器周期的高电平,就可以实现复位操作,使单片机回复到初始状态。
图9脚就是上电复位电路连接图。
3.基础知识:80C51单片机的寻址方式包括寄存器寻址、直接寻址、寄存器间接寻址、立即寻址以及基址寄存器加变址寄存器间接寻址5种寻址方式。
其中基址寄存器加变址寄存器间接寻址方式一般用于访问程序存储器中的数据表格。
这种寻址方式是以DPTR 或PC作基址寄存器,以累加器作变址寄存器,并以两者内容相加成的16位地址作为操作数的地址,以达到访问数据表格的目的。
即熟悉运用查表指令编写程序。
查表指令可用于复杂代码转换显示,通过查表指令可以实现复杂的显示效果,并可以减少程序代码。
四、程序设计1、程序内容;----------------------------------------------- ;流水灯实例;功能:点亮发光管LED并闪烁;-----------------------------------------------ORG 0000H ;伪指令,指定程序从0000HLJMP MAIN ; 跳转指令,程序跳转到MAIN处ORG 0100H ; 伪指令,指定以下程序从0100H开始存放 MAIN:MOV SP ,#60H ; 给堆栈指针赋初值MOV P1,#0FFH ;给P1赋初值,LED全熄灭;以下为查表程序MOV DPTR,#LED TABLELIGHT :MOV R7, #42LOOP :MOV A , #42SUBB A , R7MOVC A ,@A+DPTRMOV P1 , A ; 输出显示LCALL DELAY ; 调延时子程序DJNZ R7 , LOOPSJMP LIGHT ;跳转,程序继续;延时子程序DELAY :MOV R7 ,#10HDELAY0 :MOV R6 ,#7FHDELAY1 :MOV R5 ,#7FHDJNZ R5 ,$DJNZ R6 ,DELA Y1DJNZ R7 ,DELA Y0RET; 表格数据LED TABLE :DB 0FFH ;全部熄灭DB 0FEH, 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH;依次逐个点亮DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H; 依次逐个叠加DB 080H,0C0H,0E0H,0F0H,0F8,0FCH,0FEH,0FFH; 依次逐个递减DB 07EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,07EH;两边靠拢后分开DB 07EH,03CH,018H,000H,000H,018H,03CH,07EH; 两边叠加后递减DB 000H ;全部点亮END六、成员分工七、心得体会这次这个单片机的课程设计我们完成的不太理想,我们小组有四个人。
51单片机流水灯实验报告

竭诚为您提供优质文档/双击可除51单片机流水灯实验报告篇一:51单片机流水灯实验报告51单片机流水灯试验一、实验目的1.了解51单片机的引脚结构。
2.根据所学汇编语言编写代码实现LeD灯的流水功能。
3.利用开发板下载hex文件后验证功能。
二、实验器材个人电脑,80c51单片机,开发板三、实验原理单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LeD灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的p2端口,对8个LeD灯进行控制,要实现逐个亮灯即将p2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。
使用rl或rra实现位的转换。
A寄存器的位经过rra之后转换如下所示:然后将A寄存器转换一次便送给p2即moVp2,A便将转换后的数送到了p2口,不断循环下去,便实现了逐位置一操作。
四、实验电路图五、通过仿真实验正确性代码如下:oRg0moVA,#00000001bLoop:moVp2,ARLAAcALLDeLAYsJmpLoopDeLAY:moVR1,#255DeL2:moVR2,#250DeL1:DJnZR2,DeL1DJnZR1,DeL2ReTend实验结果:六、实验总结这次试验我通过proteus仿真实现对流水灯功能的实现。
受益匪浅,对80c51的功能和结构有了深层次的了解,我深刻的明白,要想完全了解c51还有一定距离,但我会一如既往的同困难作斗争。
在实验中,我遇到了不少困难,比如不知道怎么将程序写进单片机中,写好程序的却总出错,不知道什么原因,原来没有生成hex文件。
这些错误令我明白以后在试验中要步步细心,避免出错。
篇二:实验(:51单片机流水灯实验报告)一51单片机流水灯实验实验报告“流水灯”实验报告一、实验目的1.了解单片机I/o口的工作原理。
2.掌握51单片机的汇编指令。
3.熟悉汇编程序开发,调试以及仿真环境。
二、实验内容通过汇编指令对单片机I/o进行编程(本实验使用p0口),以控制八个发光二极管以一定顺序亮灭。
51单片机常见的五种流水灯编写方式

For personal use only in study and research; not for commercial use51单片机常见的五种流水灯编写方式通过改变赋值实现流水灯void main(){while(1){P2=0xfe;delay1ms(500);P2=0xfd;delay1ms(500);P2=0xfb;delay1ms(500);P2=0xf7;delay1ms(500);P2=0xef;delay1ms(500);P2=0xdf;delay1ms(500);P2=0xbf;delay1ms(500);P2=0x7f;delay1ms(500);}}通过公式运算实现流水灯void main(){while(1){uint a,b=1;P2=0xfe;delayms(500);for(a=0;a<7;a++){P2-=b; // P2=P2-bdelayms(500);b=b*2; //都化为同一类型进制运算}}}通过操作符<<与“|”实现流水灯(通过移位实现流水灯)void main(){uchar a,i;while(1){a=0xfe; //点亮第一位LED灯for(i=0;i<8;i++){P2=a;a=a<<1; //左移一位a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500);}}}通过库函数_crol_(字符左移)实现流水灯void main(){uint a;a=0xfe;while(1){P2=a;a=_crol_(a,1);delay_ms(500);}}采用数组实现流水灯uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void main(void){uchar i;while (1){for(i=0;i<8;i++) //循环点亮8只LED灯{P2=table[i];delay_ms(500); //延时500毫秒}}}For personal use only in study and research; not for commercial use.Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文For personal use only in study and research; not for commercial use.Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文。
用单片机控制8位LED灯的流水点亮及其PROTEUS仿真

⽤单⽚机控制8位LED灯的流⽔点亮及其PROTEUS仿真⽤单⽚机控制8位LED灯的流⽔点亮及其PROTEUS仿真摘要:LED灯的流⽔控制可以由多种⽅式实现,这⾥选⽤80c51系列单⽚机作为CPU,采⽤函数型指针的⽅式编程,⽤Proteus进⾏电路图绘制和仿真,⽤keil进⾏编译和虚拟写⼊,得到了理想的仿真效果。
Abstract: LED lights from a variety of water control can be achieved, 80c51 chosen here as a series of single-chip CPU, the use of functional programming guide way, using Proteus for drawing circuit diagrams and simulation, carried out using keil compiler and virtual write, be an ideal simulation of the effect.1引⾔1.1 AT89C51简介AT89C51是⼀种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,⾼性能CMOS8位微处理器,俗称单⽚机。
AT89C2051是⼀种带2K字节闪烁可编程可擦除只读存储器的单⽚机。
单⽚机的可擦除只读存储器可以反复擦除100次。
该器件采⽤ATMEL⾼密度⾮易失存储器制造技术制造,与⼯业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯⽚中,ATMEL的AT89C51是⼀种⾼效微控制器,AT89C2051是它的⼀种精简版本。
AT89C单⽚机为很多嵌⼊式控制系统提供了⼀种灵活性⾼且价廉的⽅案1.2 Proteus简介Proteus(海神)的ISIS是⼀款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并⽀持单⽚机,元件库齐全,使⽤⽅便,是不可多得的专业的单⽚机软件仿真系统。
51单片机项目教程项目 4 流水灯实验

4.3 项目实施
4.3.1 流水灯开发实战环节
注意:J1接上才能开始做流水灯模块实验
图4- 6流水灯实物结果
实现延时通常有两种方法:一种是硬件延时,要用到定时器 /计数器,这种方法可以 提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用 循环体进行。
2、编写精确的延时函数 1)使用定时器/计数器实现精确延时
2)软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延 时。下面介绍几种软件延时的方法。 2.1 短暂延时 2.2 在C51中嵌套汇编程序段实现延时 2.3 使用示波器确定延时时间 2.4 使用反汇编工具计算延时时间
(216-初值)×振荡周期×12
例如:若晶振频率为12MHz,则最长的定时时间为(2160)×(1/12)×12us=65.536ms
4.2 技术准备
3. 方式2 THx作为常数缓冲器,当TLx计数溢出时,在置“1”溢出标志TFx 的同时,还自动的将THx中的初值送至TLx,使TLx从初值开始重新计 数。 其定时时间为:
例如:机器时钟频率为12MHZ,机器周期为1μs 时,
若工作在模式0,则最大定时值为:213×1μs =8.192ms 若工作在模式1,则最大定时值为: 216×1μs =65.536ms (2)置定时/计数器初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1;
(3)对TCON寄存器中的TR0或TR1置位,启动定时/计数器,置位以后,计数器 即按规定的工作模式和初值进行计数或开始定时。
4.2 技术准备
4.2.7定时器编程步骤 MCS-51单片机的定时器/计数器是可编程的,具体步骤如下: (1)对TMOD赋值,以确定定时器的工作模式; 初值计算: 设计数器的最大值为M,则置入的初值X为: 计数方式:X=M-计数值 定时方式:由(M-X)T=定时值,得X=M-定时值/T T为计数周期,是单片机的机器周期。 (模式0: M为213=8192 ,模式1: M为216=65536,模式2和3: M为28=256)
51单片机流水灯

51单片机流水灯51单片机的流水灯控制班级:100712姓名:全建冲学号:10071047一、设计要求用51单片机设计一个流水灯的控制方案,要求采用定时器定时,利用中断法控制流水灯的亮灭,画出电路图和程序流程图,写出程序代码以及代码注释。
二、电路原理图原理图分析:本原理图采用STC89S52单片机控制8个LED灯,其中8个LED灯的负极接单片机的P1端口,正极通过1KΩ排阻连接到电源上。
原理图中还给出了晶振与复位端,以保证控制器的稳定工作。
三、四、程序代码及注解1.非中断定时器控制#include<reg52.h>#include<intrins.h>//包含了_crol_函数的头文件#define uchar unsigned char#define uint unsigned intuint i=0;uchar a=0xfe;void main(){TMOD=0x01;//设置工作方式为定时器0,16位手动重装初值TH0=(65536-46080)/256;//50毫秒定时赋初值TL0=(65536-46080)%256;TR0=1;//启动定时器0while(1){If(TF==1)//读溢出标志位{TH0=(65536-46080)/256;//重新赋初值TL0=(65536-46080)%256;i++;if(i==10)//500毫秒定时{i=0;P1=a;//P1端口赋值a=_crol_(a,1);//循环左移}TF=0;//清除定时器溢出标志}}}程序分析:本程序采用非中断定时器法控制流水灯,核心语句在于读取标志位TF位,TF为定时器溢出标志位,溢出时硬件自动置一,所以循环读取标志位以判断定时器是否溢出,而每次溢出需要手动清零,否则定时器无法再次溢出,利用标志i读取10次即可达到500毫秒的定时。
另外需要注意的是单片机晶振为11.0592MHz,所以计时一个数的时间为12/11.0592=1.085us,故定时50毫秒的计数为50000/1.085=46080。
(完整版)51单片机流水灯程序

1.第一个发光管以间隔200ms 闪烁。
2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms。
3.8 个发光管来回流动,第个管亮100ms。
4.用8 个发光管演示出8 位二进制数累加过程。
5.8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁 5 次。
重复此过程。
6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}2#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p 仁P1A0;uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a;delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main(){uchar a,i;while(1)a=0xfe;for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f;for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);}}}4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a){uint x,y;for(x=a;x>0;x--) for(y=110;y>0;y--);}void main(){uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main(){uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f;for(i=0;i<8;i++){P1=a;delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa;delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300);a=_crol_(a,1);}}P1=0xff;for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd;delay(300);P1=0xdb;delay(300);P1=0xe7;delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。
[设计]80C51控制流水灯
![[设计]80C51控制流水灯](https://img.taocdn.com/s3/m/f2936659842458fb770bf78a6529647d2728340e.png)
80C51单片机控制流水灯1使用汇编语言编写程序,8个LED灯接在P0口,显示出流水灯效果2用mov指令移位3用查表法显示流水灯4将P1口拨码开关设置状态读出,作为流水灯设置显示模式5在4的基础上加入控制功能,K0为低电平时,LED停止移动,K0高电平时,LED开始移动;K1为低电平时,LED左移,K1高电平时,LED 右移。
接线如下图:(一)用mov指令编写ORG 0000H ;定义程序初始地址JMP MAIN ;跳转至MAINORG 0030HMAIN: MOV A,#0FEH ;MOV R0,#08H ;设置移动8位LOOP1:MOV P0,A ;点亮第一个灯CALL DELAY ;调用延时程序RL A ;左移DJNZ R0,LOOP1 ;循环左移MOV R1,#08H ;设置移动8位LOOP2:RR A ;右移MOV P0,A ;输出CALL DELAY ;调用延时程序DJNZ R1,LOOP2 ;循环右移JMP MAIN ;跳转至MAIN DELAY:MOV R3,#20 ;延时程序定义D1: MOV R4,#100D2: MOV R5,#230DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(二)用查表法ORG 0000H ; 定义程序地址从0000H开始存放JMP MAIN ;跳转至主程序ORG 0030H ;设置主程序地址MAIN:MOV DPTR,#TABLE ;将TABLE的地址赋给DPTRONE: CLR A;累加器清零MOVC A,@A+DPTR ;取出表中的数据CJNE A,#0FFH,TWO ;判断是不是表中最后的0FFH,如果不是则跳转至TWOJMP MAIN ;如果是表中最后的0FFH,则跳转至main,重新运行TWO: MOV P1,A ;将数据输出至p1口CALL DELAY ;调用延时程序INC DPTR ;修改指针DPTR,指向表中下一个数据JMP ONE ;跳转至oneDELAY:MOV R3,#20 ; 延时子程序定义D1: MOV R4,#100D2: MOV R5,#230DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETTABLE: ; 花样流水灯的表,可以自由定义DB 01111111BDB 10111111BDB 11011111BDB 11101111BDB 11110111BDB 11111011BDB 11111101BDB 11111110BDB 11111110BDB 11111101BDB 11111011BDB 11110111BDB 11101111BDB 11011111BDB 01111111B DB 11100111B DB 11011011B DB 10111101B DB 01111110B DB 10111101B DB 11011011B DB 11100111B DB 11100111B DB 11011011B DB 10111101B DB 01111110B DB 10111101B DB 11011011B DB 11100111B DB 01010101B DB 10101010B DB 00110011B DB 11001100B DB 11110000B DB 00001111BDB 0FFH ;用作表的结尾的标志,可自由定义END(三)拨码开关控制ORG OOOOH ;JMP MAINORG 0030H ;MAIN:MOV P1,#0FFH ;准双向口,先写1再读,防止读取出错MOV A,P1 ;读取P1的状态MOV P0,A ;将p1的状态输出到P0CALL DELA Y ;调用延时子程序JMP MAIN ;跳转到MAINDELAY:MOV R3,#20 ;延时子程序定义D1: MOV R4,#100D2: MOV R5,#230DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(四)在(三)的基础上加上控制功能ORG 0000HJMP MAINORG 0030HMAIN: MOV P1,#0FFH ;准双向口,先写1再读,防止出错MOV A,P1 ;读取P1的状态MOV R0,A ; 保存A的状态TEST: JB P2.0,MOVING ;判断P2.0的电平,高电平时跳转至MOVINGJMP DISPLA Y ;跳转到DISPLA YMOVING:JB P2.1,RIGHT ;判断P2.1的状态,高电平时右移LEFT: RL A ;A左移一位JMP DISPLA Y ;跳转至DISPLA YRIGHT:RR A ;A右移一位JMP DISPLA Y ;跳转至DISPLA YDISPLA Y:MOV P0,A ;输出到P0口MOV R1,A ;保存A的状态CALL DELAY ;调用延时程序MOV A,R0 ;将R0保存的状态存到A中XRL A,P1 ;判断P1口的状态是否变化JNZ MAIN ;P1口状态变化,跳转至MAIN重新显示MOV A,R1 ;P1口状态不变,继续当前的状态显示JMP TEST ;跳转至TESTDELAY:MOV R3,#20 ; 延时程序定义D1: MOV R4,#100D2: MOV R5,#200DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RET。
基于8051单片机的流水灯设计毕业设计

目录摘要 (1)ABSTRACT (2)前言 (3)第1章系统方案设计 (4)1.1 系统总体设计方案 (4)1.2 基本功能简介 (4)1.3 系统程序 (4)第2章8051单片机原理分析及硬件电路 (6)2.1 8051单片机简述 (6)2.1.1 8051单片机的基本组成 (6)2.1.2 8051的信号引脚 (8)2.2 晶体振荡电路 (10)2.3 上电复位电路 (11)2.4 8051单片机的并行I/O口 (12)2.5 8051单片机的中断系统 (12)2.6 8051单片机的定时/计数器 (13)2.6.1 定时/计数器的定时功能 (13)2.6.2 用于定时/计数器控制的寄存器 (14)第3章8051单片机与8155的接口设计 (15)3.1 并行I/O接口8155 (15)3.1.1 8155内部功能结构及引脚 (15)3.1.2 作片外RAM使用 (16)3.1.3 作扩展I/O口使用 (16)3.1.4 I/O口的工作方式 (18)3.1.5 定时/计数器使用 (18)3.28051单片机并行I/O扩展 (19)3.2.1 8051并行扩展总线 (19)3.2.2 8051单片机与8155的接口 (19)第4章单片机与8155的接口设计的应用 (21)4.1 LED显示 (21)4.2 按键扫描 (22)第5章结论 (24)参考文献 (26)毕业设计小结 (27)附录 (28)摘要二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。
不过,这种电脑,通常是指个人计算机,简称PC机。
它由主机、键盘、显示器等组成。
还有一类计算机,大多数人却不怎么熟悉。
这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。
顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。
因为它体积小,通常都藏在被控机械的“肚子”里。
它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。
51单片机爱心流水灯原理及制作

51单片机爱心流水灯原理及制作引言:在现代科技发展的背景下,电子产品已经成为我们生活中不可或缺的一部分。
而作为电子制作的入门级项目,流水灯因其简单而受到广大爱好者的喜爱。
本文将介绍使用51单片机制作爱心流水灯的原理及制作过程。
1. 原理介绍:爱心流水灯是一种特殊的流水灯效果,通过控制LED灯的亮灭顺序和时间间隔,形成一个爱心图案在LED灯带上流动的效果。
其原理基于51单片机的GPIO (通用输入输出)口控制LED灯的亮灭,通过改变LED灯的状态来实现流动效果。
2. 材料准备:制作爱心流水灯所需的材料如下:- 51单片机开发板- LED灯带- 面包板- 杜邦线- 电阻- 电容- 电源适配器3. 硬件连接:首先,将51单片机开发板和面包板连接起来。
然后,将LED灯带连接到面包板上,确保正极和负极正确连接。
接下来,通过杜邦线将51单片机的GPIO口与LED灯带连接起来。
最后,将电阻和电容连接到电路中,以保护电路免受过电流和过电压的损害。
4. 软件编程:使用Keil C编译器进行软件编程。
首先,需要定义LED灯带的控制引脚,并初始化为输出模式。
然后,编写程序来控制LED灯的亮灭顺序和时间间隔。
在本例中,我们将使用循环语句和延时函数来实现流水灯效果。
通过改变LED灯的状态和延时时间,可以形成一个爱心图案在LED灯带上流动的效果。
5. 程序调试:将编写好的程序下载到51单片机开发板上,并连接电源适配器。
打开开关,LED灯带上的爱心流水灯效果就会开始显示出来。
如果出现问题,可以通过调试程序和检查硬件连接来解决。
6. 制作扩展:如果你对爱心流水灯的效果满意,你还可以进一步扩展你的制作。
例如,你可以添加一个按键来控制流水灯的启停,或者通过蓝牙模块和手机APP来远程控制流水灯的效果。
这些扩展可以增加你的制作的趣味性和创造性。
结论:通过本文的介绍,我们了解了51单片机爱心流水灯的原理及制作过程。
通过硬件连接和软件编程,我们可以制作出一个具有特殊效果的流水灯。
80C51可控流水灯单片机课程设计报告

80C51单片机流水灯实训和调试报告班级:姓名:学号:1 目的单片机课程设计主要是为了让我们增进对80C51单片机电路的感性认识,加深对理论方面的理解。
了解软硬件的有关知识,并掌握软硬件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。
另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。
2.2课题的意义这次单片机课程设计是为了通过对流水灯控制的设计加强学生团队配合的能力和创造力;综合运用专业及基础知识,解决实际工程技术问题的能力。
能够让学生深入真是的体会到所学的理论知识和实践相结合的过程。
找出自身的不足并加以改正。
2.3预期的目标对8个LED灯设计5种流水灯显示方式,用一个按键进行方式选择,并用一个数码管显示方式编号;用两个键来控制流水灯流动的速度。
2.4面对的问题这次课程设计是通过80C51位单片机实现。
但面对的问题却是两方面的:一个是软件的设计,也就是实现流水灯控制功能的程序编辑;另一个是硬件的设计,需要我们自己连接、焊接电路板。
而更为严峻的就是设计的最后还要将软硬件相结合。
首先我们需要通过protel将设计的实物的电路图画出来,再根据电路图连接实物电路。
2.5课题的技术LED灯的显示方式、模式切换按钮的控制、亮灯速度的按键控制等技术。
3系统分析3.1涉及的基础知识电路焊接:制造电子产品的重要手段。
80C51单片机指令系统:规定80C51单片机内操作的语句或命令。
LED数码管的显示:向数码的显示送数,控制系统的显示部分。
3.280C51单片机引脚图及引脚功能介绍本次实习的目的在于加深80C51单片机的理解,首先来简单认识一下,它的引脚如图3-1所示:图3.1 80C51的引脚图单片机的39个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
1.电源:(1)VCC:芯片电源,接+5V;(2)VSS:接地端;2.时钟:XTAL1、XTAL2 :晶体振荡电路反相输入端和输出端。
基于单片机实现的流水灯设计

单片机流水灯设计摘要:介绍如何利用80C51单片机P0口的扩展来制作16盏流水彩灯,并使用片外程序存储器(2764)。
关键词:最小系统﹑P0扩展﹑时序图﹑机器周期、片外程序存储器的扩展,地址线,数据线、片选.所需硬件:80C51 一块 2764 一块 74LS373 三块 74LS02一块 发光二极管和电阻若干。
各集成块的引脚图:80C512764 110112074LS373OE Q0D0D1Q1Q2D2D3Q3GND GQ4D4D5Q5Q6D6D7Q7Vcc74LS373 74LS02各集成块引脚功能介绍:一、 80C51引脚介绍:主电源引脚Vss(20脚)和Vcc(40脚);时钟电路引脚XTAL1(19脚)和XTAL2(18脚)。
控制信号引脚如下:RST复位(9脚)输入24个时钟脉冲周期宽度以上H电平复位。
ALE或/PROG、(30脚)锁存扩展地址低位字节控自信号。
/PSEN、(29脚)访问片外程序存储器是输出负脉冲作片选控制信号,12个始终周期2次生效,但访问片外RAM时无效。
EA(31脚)当此脚输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。
当地址超出4KB时,将自动执行片外程序存储器的程序。
当此脚输入低电平时,CPU仅访问片外程序存储器。
输入/输出脚:(1)P0.0—P0.7 (39脚—32脚)(2)P1.0—P1.7 (1脚—8脚)(3)P2.0—P2.7 (26脚—21脚)(4)P3.0—P3.7 (10脚—17脚)在单片机中P3口还有第二功用,在我们这个设计中就要用到P3口的部分脚的第二功能:P3.0和P3.1口的第二功用是单片机一个重要的脚,即串行接口。
P3.0(RXD)是用做串行口的接受端,P3.1(TXD)串行口发送端。
P3.2(INT0)外部中断0,P3.3(INT1)外部中断1,P3.4(T0)定时/计数器0,P3.5(T1)定时/计数器1,P3.6(WR)外部数据存储器写选通信号,P3.7(RD)外部数据存储器读选通信号。
课程设计-- 基于单片机的双向流水灯

绪论
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。我们周围有许多流水灯。通过单片机的控制,我们可以把城市的夜晚装饰的更漂亮。单片机实际上是微型计算机的一种,自从它问世以来,人们对它不断地改进,以应用于现代化社会的各方各面。单片机体积小,价格低廉,开发较为容易,可根据需要制作成各种智能控制器以代替人工的操作,实现自动化。在我国,由于ASIC(专用集成电路)的生产还跟不上,单片机的作用更加地重要,在智能仪器仪表、工业设备过程控制、家用电器中,都可以见到它的踪迹。
课程设计-- 基于单片机的双向流水灯
课程设计说明书
题目:基于单片机的双向流水灯
院(部):机械工程学院
专业班级:机设10-10
学 号:2010302529
学生姓名:周素博
指导教师:张双双
2014年1月16日
安徽理工大学课程设计(论文)任务书
机械工程院(部)测控教研室
学号
2010302529
学生姓名
周素博
[3]宋庆环,才卫国,高志.89C51单片机在直流电动机调速系统中的应用[M].唐山学院,2008.4
[4]杨加国.单片机原理与应用及C51程序设计[M].北京:清华大学出版社,2008.3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//定义延时子函数
第二种: (数组定义 LED 灯的各种状态) #include <reg52.h> #define uint unsigned int uint aa[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; //将灯的不同状态分别定 义成 8 组六进制数并存入数组中 void Delayms(); //延时子函数申明 void main() { unsigned int i = 0; while(1) { P0 = aa[i]; //定义 P0 口为 aa 数组中第 i 个元素的状 态 Delayms(); //延时一段时间 i++; //改变数组中元素下标,当再次调用 时,LED 灯的状态改变 if (i == 8) //当所有状态都运行一次后应该回到最 初的状态,才能得以无限循环 { i = 0; } } } void Delayms() //延时子函数定义 { unsigned int i, j; for (i=1000; i>0; i--) {
ledr = (ledr << 1) | 0x01; led = (ledl & ledr); if (led == 0x7e) { temp = ledr; ledr = ledl; ledl = temp; }
实验二:流水灯——叠加 方法:又多次不同的初态,初态与前次的结束状态相同。 1) 保留前次的结束状态 if (((led >> 1) | 0x80) == temp) { temp = led; } 2)平移时,右边边界会移除,则采用初态合并法 Led = ((led >> 1)| 0x80)| & temp; 思考方法总结:
ledr = led | 0xf0 3)左灯(ledl)向右,右灯向左 ledl = (ledl >> 1)| 0x80; (ledl >> 1 为把左半边亮着的灯向右移动一位,|为 1 有效,即补 位位置为 1) ledr = (ledr << 1)| 0x01; 4)因为是对移,则碰撞后 ledl,ledr 运动交换即可。 temp = ledl; ledl = ledr; ledr = temp; 思考方法总结:对称运动——>将其分为两部分来做。 完整程序展示 实验一:流水灯——碰撞 #include <reg51.h> void Delay_ms(int n); void main(void) { unsigned char led, ledl, ledr, temp; led = 0x7e; ledl = led | 0x0f; ledr = led | 0xf0; while (1) { P0 = led; Delay_ms(50); if (led == 0xe7) { temp = ledr; ledr = ledl; ledl = temp; } ledl = (ledl >> 1) | 0x80; } } void Delay_ms(int n) { int i; while(n--) { for (i = 0; i < 1000; i++); } }
for (j=110; j>0; j--); } } 1.3 让蜂鸣器响起来 蜂鸣器的开启: #include<reg52.h> sbit Beep=P2^4; void main(void) { while(1) { Beep=0; } } 1.4 基础知识回顾: 1.4.1 延时函数:用延时函数来做延时,它不精确。 主要原理:机器在运行程序的时候,每执行一条语句,会用一定时间。因此我们可以利用机 器循环执行命令来达到延时的效果 For 型: void delay (unsigned char z) { int i, j; for (i=0; i<z; i++) { for (j=0; j<110; j++)//根据经验得出,没每执行 110 条语句,延时 1 毫秒。 ; //这个程序总共执行 z*110 次语句,延时 z 毫秒。 } } while 型: void delay (unsigned char z) { while(z) { z--; } } 1.4.2-crol-函数:crol_带循环左移 参数的设置:-crol-(unsigned char, unsigned char); 例如:_crol_(0x01,1);是 0000 0001 向左移动一位,则变为 0000 0010。对-crol-函数加上循环 //将喇叭所在位置的三极管基极所连接的 P2^4 口电平拉低 //将 P2^4 口定义一个变量名字 Laba
果 1.2.3 点亮八位 LED 灯 我们目标是一起点亮八个 LED; 我们知道 P0 具有八个口 P0^0 到 P0^7,可能认真学的同学下列想法 sbit LED1 = P0^0; //定位 LED1 指向 P0^0 口 sbit LED2= P0^1; //定位 LED2 指向 P0^1 口 sbit LED3= P0^2; //定位 LED3 指向 P0^2 口 sbit LED4= P0^3; //定位 LED4 指向 P0^3 口 。 。 。 。 。 。 。 。如果说,这么做是对是错,我们可以明确的说,这是对的,非常对。 但是,大家想想这样是不是很麻烦呢? 于是我们在这引入进制运算 先列举一个程序 #include <reg52.h> //8051 单片机特有的头文件 #define LED PO // 自定义 P0 口为 LED void main() //主函数 { while(1) { LED = 0x00//低电平工作 0 表示低,1 表示高 图4 } } 这样写的效果就是 8 个灯全亮,为什么呢? 0X00 为前缀 0X 为 16 进制的标志,0x00 表示就是 0000 0000 刚刚八个位置从右向 左 对应 P0^0 到 P0^7。 在举个列子,如果讲 LED = 0x00 换成 LED = 0X11,表示的是 0001 0001 就是从右 向 左第一个灯和第五个灯不亮,其余灯都亮。 思考:如果 LED = 0xff, 灯的亮灭情况呢? 1.2.4 让一位 LED 灯移位并实现流水灯效果 1) 可用专门的移位函数 a=_crol_(a, b);来实现。 (第 a 位向右移动 b 个单位) 2) 也可以用数组定义所有 P0 口的点位,通过循环访问数组来点亮和关闭 LED 灯。 程序: 第一种(调用库函数_crol_) : #include <reg52.h> //包含 51 单片机库函数头文件 #include <intrins.h> //包含定时器等头文件 #define uint unsigned int //重新定义数据类型 #define uchar unsigned char uint aa; //定义变量 aa 用于表示 P0 口的整体高低电 平状态 void Delayms(); void main() { aa = 0xfe; //定义 aa 值为(二进制)1111 1110 while(1) {
在 IPhone 之前可是“我” 的时代 (跑马灯可 以通过单片机来实现) 。
璀璨美丽的夜景, 多彩多变令人沉醉其中的 灯光都是通过单片机来控制。
1.1 实现流水灯 1.1.1 发光二极管的构造与工作原理:
认识 led:Led(发光二极管)灯是一种半 导体发光器件, 十几毫安甚至几毫安的电 流就能使 led 灯发出耀眼的光芒, 我们使 用的单片机输出电流就只有几毫安, 于是 当我们让单片机输出电流就能使 led 发 光。 我们复习一下 初中的物理,点 亮一颗小电灯, 于是我们需要 图1 一块电池, 几根导线, 一个开关, 然后我们把 这些东西串联起来小灯泡肯定是不会发光的 (图 1) , 因 图2 为我们没有闭合开关, 先在我们看一下单片机的硬件连
1.4.5P0 口端的整体定义与应用:P0 口就是 P0.0 到 P0.7 的总和。 对 P0 口的赋值:P0=0xfe,0xfe 是一个十六进制的数,转化为二进制就是 1111 1110,刚好 八位数,对应 PO 口的八个位置。这样就可以用一条语句对整个 P0 口操作了。 P0.0 1 P0.1 1 P0.2 1 P0.3 1 P0.4 1 P0.5 1 P0.6 1 P0.7 0
P0 = aa; Delayms(); aa = _crol_(aa, 1); 一位 } } void Delayms() { uint i, j; for (i=1000; i>0; i--) { for (j=110; j>0; j--); } }
//将 aa 值赋给 P0 口 //使其状态保持一段时间 //调用移位函数,使 aa 的二进制值向左一次移动
工程一:流水灯设计 导引:用灵感去创造多彩的世界 在我们现代的日常生活中,总能够看到各种各样的灯,有的简单实用,给我们生活带来 诸多的方便之处;有的色彩斑斓,给我们呈现美丽的夜景。 然而这些都离不开单片机。
来自 14 栋 XX 宿舍的饮水机, 可通过单片机 控制显示加热或保温。
当年玩过的老虎机, 现在你也可以控制它的 灯了。
1.4.6 二进制和十六进制的互相转换:二进制为“逢二进一,借一当二” ,十六进制为“逢十 进行快速的转化。
规律: 一般把四个二进制数放在一起转换成一个十六进制数, 转换时先把二进制数转换成十 进制数,再把十进制数转换成十六进制数。 1.5 扩展与反思 1.5.1 扩展: 注意:该部分较难,多多参考知识表来理解程序的每一句。 丰富多彩的流水灯 实验一:流水灯——碰撞 实验描述:将 led 灯分为两边,两边运动由中间对称,产生碰撞的效果。 实验分解:1)将 led 灯分为两边: 左: ledl 右: ledr 2)将左右流水灯初始化 ledl = led | 0x0f (|为 bit 位为 1 时有效,即把右 4 位全置为 1)