发光二极管流水灯实验
流水灯实验报告总结

流水灯实验报告总结一、实验目的本次流水灯实验的主要目的是通过实际操作,深入理解数字电路中时序逻辑电路的工作原理,掌握基本的硬件电路设计和编程方法,提高我们对电子电路的实践操作能力和问题解决能力。
二、实验原理流水灯是通过控制一系列发光二极管(LED)依次点亮和熄灭,从而产生一种流动的视觉效果。
其实现的核心原理是利用计数器和译码器来控制 LED 的亮灭状态。
在数字电路中,计数器可以对输入的时钟脉冲进行计数,从而产生不同的计数值。
译码器则将计数器输出的计数值转换为对应的控制信号,使得相应的 LED 点亮或熄灭。
例如,使用常见的 74LS161 四位二进制同步计数器和 74LS138 三线八线译码器,可以构建一个简单的八路流水灯电路。
计数器在时钟脉冲的驱动下不断计数,译码器根据计数器的输出值依次选通不同的输出端口,从而实现 LED 的顺序点亮。
三、实验设备及材料1、数字电路实验箱2、 74LS161 计数器芯片3、 74LS138 译码器芯片4、发光二极管(LED)若干5、电阻、电容等基本电子元件6、杜邦线若干7、数字万用表8、示波器四、实验步骤(一)电路设计1、根据实验原理,在实验箱上规划好芯片的布局和连线方式。
2、使用杜邦线将计数器、译码器和 LED 等元件按照设计好的电路连接起来。
3、注意连接的正确性,避免短路和断路现象。
(二)硬件搭建1、仔细对照电路设计图,将芯片插入实验箱的相应插槽中。
2、确保芯片引脚与插槽接触良好,无松动现象。
(三)编程与调试1、使用数字电路实验箱提供的编程工具,对计数器和译码器进行编程设置。
2、例如,设置计数器的计数模式、初始值等参数。
3、打开电源,观察 LED 的亮灭情况。
4、如果流水灯效果不符合预期,使用数字万用表和示波器等工具检测电路中的信号和电压,排查故障。
五、实验中遇到的问题及解决方法(一)LED 不亮1、问题描述:接通电源后,所有 LED 均不亮。
2、排查过程:首先检查电源是否正常,然后使用万用表测量芯片引脚的电压,发现计数器芯片没有正常工作。
3-流水灯控制实验需打印

实验三、流水灯控制实验一、实验目的1.掌握keilc51软件与protues软件联合硬仿的调试方法。
2.掌握如何应用程序与查表等方法实现流水灯效果。
3.掌握按键去抖原理及处理方法。
二、实验仪器与设备1、微机一台2、keilc51开发环境,protues软件。
三、实验内容1.用protues设计一流水灯控制电路。
利用P1口控制8个发光二极管L1—L8。
P3.3口接一按键K1。
参考电路下面给出。
其中74LS240为八反相三态缓冲器/线驱动器。
2.用中断或查询方式编写程序,每按一次K1键,演示不同的流水效果。
若用KEY表示按键的次数,则其对应流水效果如下:1.KEY=0:L1—L8全亮;2.KEY=1:L1—L8先全灭,然后自右向左单管点亮,如此循环;3.KEY=2:L1—L8先全灭,然后自右向左依次点亮,如此循环;4.KEY=4:L1—L8先全亮,然后自右向左依次熄灭,如此循环;5.KEY=5:自行设计效果;以上移位及闪烁时间均设置为0.3秒,按动5次按键后,再按键时,流水灯效果从头开始循环。
四、实验原理及步骤1.用protues设计流水灯控制电路;2.在keilc51中编写流水灯控制程序,编译通过后,与protues联调;3.按动K1键,观察是否达到演示效果;4.利用终端和查询两种方式编写程序,比较二者的区别;五、电路设计及调试:(1)实验电路(2).程序设计及调试#include<reg51.h>#define uint unsigned int#define uchar unsigned charuchar i,m=0xfe,n=0xfe,p=0x7f,temp=0; void delay(uint c ){uchar i,j;for(i=0;i<125;i++)for(j=0;j<c;j++);}void main(){IT1=1;EX1=1;EA=1;while(1){if(temp==0){P1=0x00;}if(temp==1){P1=0xff;for(i=0;i<8;i++){m=((m<<1)|(m>>7));P1=m;delay(200);}}if(temp==2){P1=0xff;delay(200);P1=0xfe;for(i=0;i<8;i++){P1=n<<i;delay(200);}}if(temp==3){P1=0x00;delay(200);for(i=0;i<8;i++){P1=(p>>i);delay(200);}}if(temp==4){P1=0xff;delay(200);P1=P1;delay(200);}if(temp==5){P1=0xf0;delay(200);P1=P1;delay(200);}}}void int_1() interrupt 2{EA=0;delay(5);EA=1;temp++;if(temp>=6){temp=0;}}(3)实验调试中遇到的问题:为什么要按键去抖?按键如果不去抖,按键抖动会引起一次按键被误读多次,程序执行效果变乱,导致程序执行没有次序。
流水灯实践学习心得体会doc

流⽔灯实践学习⼼得体会doc流⽔灯实践学习⼼得体会篇⼀:对LED流⽔灯的学习总结单⽚机的学习总结第⼀个实验:⼀、从点亮⼀个发光⼆极管到实现流⽔灯的操作实验报告实验⽬的:(1)知道单⽚机最⼩系统和典型系统(2)知道如何建⽴⼀个⼯程,完成⼀个点亮发光⼆极管的编译和烧写实验器件以及基础知识描述:(1)LED发光⼆极管是⼀种半导体⼆极管,可以把电能转换成光能,有⼀个PN结构成。
(2)晶振:全称为晶体振荡器,其作⽤是产⽣原始的时钟频率,这个频率晶振经过频率发⽣器的放⼤或缩⼩后就成为了电脑中各种不同的总线频率。
(3)IO端⼝的驱动能⼒:每个I/O端⼝允许的做⼤20mA 的灌电流,可以直接驱动LED和继电器;⾼电平输出时⼀般对负载提供电流其提供的电流叫“拉电流”;低电平输出时⼀般是要吸收负载的电流,其吸收的电流叫“灌电流”。
(4)P1.0---P1.7:准双向接⼝(内置上拉电阻),端⼝P1的数据寄存器⽤P1表⽰,端⼝置⼀表⽰⾼电平,设置为0表⽰输出低电平。
(5)如何进⾏程序烧写:5.1、⽤传统的并⾏烧写器5.2采⽤⽬前流⾏的IAP在线下载程序,STC的单⽚机可以不要编程器,通过USB或串⼝下载程序(6)延时函数:每条指令都占有⼀定的时间,如果让机器什么都不⼲机器就会延时,外加循环此数⼀个完整的点亮LED源代码程序如下:#includeSbit LED=P1^0;void main(){LED=1;LED=0;While(1)}有这⼀个简单的程序实现使p1^0端⼝控制的LED灯点亮,如果要实现多个灯同时点亮呢?可以定义多个端⼝,使之输出低电平即可://实现第1、3、5、7个LED灯点亮#includesbit LED0=P1^0;sbit LED2=P1^2;sbit LED4=P1^4;sbit LED6=P1^6;main(void){LED0=0;LED2=0;LED4=0;LED6=0;while(1){}}实现了控制灯亮暗后,程序中添加⼀段延时程序即可实现灯的闪烁:延时函数分为有参延时和⽆参延时;//⼀个简单的有参延时函数:void delay(unsigned int t){While(--t);}//⽆参延时函数:void delay(){for(int i=1000;i>0;i++)for(int j=1000;j>0;j++);}或者: void delay(){Unsigned int i=300;While(--i);}通过进⼀步的分析可以进⾏流⽔灯的设计:设计⽬的:从实际⼯程出发,在理论和实践上掌握流⽔灯系统的基础组成,⼯作原理。
实验1_流水灯实验

实验1 流水灯实验一、实验目的1) 简单I/O 引脚的输出2) 掌握软件延时编程方法 3) 简单按键输入捕获判断 二、实验实现的功能1) 开机是点亮全部12个发光二极管,闪烁三下;2) 按下不同的按键12个发光二级管按照不同的方式显示。
具体显示规则如下:1) 1号键按下,按照顺时针循环依次点亮发光二极管; 2) 2号键按下,按照逆时针循环依次点亮发光二极管;3) 3号键按下,按照顺时针间隔1个依次点亮发光二极管; 4) 4号键按下,按照逆时针间隔1个依次点亮发光二极管; 5) 5号键按下,按照顺时针间隔2个依次点亮发光二极管; 6) 6号键按下,按照逆时针间隔2个依次点亮发光二极管;三、系统硬件设计 1、系统原理框图2、系统硬件原理图D 1D 2D 3R N 11k123456789101112242322212019181716151413D 4D 5D 6D 7D 8D 9D 10D 11D 12P 22P 21P 20P 26P 25P 24P 23P 06P 05P 04P 27P 07V C CR 21kR 31kP 36S W 1S W 2S W 3S W 4S W 5S W 6P 32P 33P 37P 34R 1710k R 1810k R 1910kV C C80C51时钟部分电源与复位部分12个发光二极管键盘系统四、系统软件设计本次实验的主要部分是:确定发光二级管点亮规律和检测按键的动作。
其中发光二级管点亮规律通过给定的数组来确定,而检测按键,采用查询方式实现,详细程序如下:#include<stc10.h>#define uint unsigned int #define uchar unsigned char bit flag1=0; uchar f1,f=0; void main() {void Delay1ms(uint ms);uchar key(uchar f);uchar led[12]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xef,0xdf,0xb f,0x7f}; //表示各发光二级管 uchar key_value[6]={0,1,2,3,4,5}; uint num[6]={0,0,0,0,0,0};char type[6]={1,-1,2,-2,3,-3}; //分别表示顺时针、逆时针、间隔一个正逆时针、间隔两个正逆时针 uchar i;P2=0xff; //关闭D1——D8 P0=P0|0xf0; //关闭D9——D12Delay1ms(100); //延时方便清晰看到LED 闪烁现象 for(i=0;i<3;i++) //亮灭3次,中间间隔若干时间 { P2=0;//点亮D1——D8U 1S T C 10F 08XP S E N29A L E 30V C C 40E A 31X 119X 218R S T 9P 0.0/A D 039P 0.1/A D 138P 0.2/A D 237P 0.3/A D 336P 0.4/A D 435P 0.5/A D 534P 0.6/A D 633P 0.7/A D 732P 1.0/T 21P 1.1/T 2E X 2P 1.2/E C I 3P 1.3/C E X 04P 1.4/C E X 15P 1.5/C E X 26P 1.6/C E X 37P 1.7/C E X 48P 2.0/A 821P 2.1/A 922P 2.2/A 1023P 2.3/A 1124P 2.4/A 1225P 2.5/A 1326P 2.6/A 1427P 2.7/A 1528P 3.0/R X D 10P 3.1/T X D 11P 3.2/IN T 012P 3.3/IN T 113P 3.4/T 014P 3.5/T 115P 3.6/W R 16P 3.7/R D17C 330pC 430p X 111.0592MX 1X 2R 151kR 2010k单片机最小系统部分C 110u FD 13C 2104V C CV C CV C CC 510u FC M A XJ1C O N 28C12345678910111213141920212223242526272815161718P 02P 01P 00P 06P 05P 04P 03P 07P 23P 22P 21P 20P 27P 26P 25P 24D 5D 6D 7D 8D 1D 2D 3D 4W 1D 9W 4W 3W 2D 12D 11D 10P 23P 22P 21P 20P 25P 24P 31P 30P 27P 26P 35P 34P 33P 32P 37P 36P 03P 02P 01P 00P 07P 06P 05P 04P 13P 12P 11P 10P 15P 14X 2X 1P 17P 16P 11P 10R S T P 15P 14P 13P 12P 17P 16P 35P 34P 33P 32H 1H 2P 37P 36L 1L 2L 3EFG D P CBADV C CJ6C O N 40A 12345678910111213141516171819202122232425262728293031323334353637383940S W 8R S TP0=P0&0x0f; //点亮D9——D12Delay1ms(500); //延时P2=0xff; //关闭D1——D8P0=P0|0xf0; //关闭D9——D12Delay1ms(500); //延时}while(1){f1=key(f); //传递键值if((f1!=f)||(flag1))//判断是否有键按下,不管两次按键的键值是否相等,只要有键按下,都从D0重新开始循环{f=f1; //交换新键值num[f]=0; //从D0开始循环flag1=0; //标志位清零}if(num[f]%12<8) //先依次亮前8个{P2=led[num[f]%12];P0=P0|0xf0; //关闭D9——D12}else //再依次亮后4个{P0|=0xf0;P0&=led[num[f]%12];P2=0xff; //关闭D1——D8}Delay1ms(100);//num[f]=num[f]+type[f]; //点亮type[f]所对应模式的下一个LEDswitch(num[f]) //保证循环连续一致{case 65535:num[f]=65531;break;case 65534:num[f]=65532;break;case 65533:num[f]=65529;break;default: break;}}}void Delay1ms(uint ms) //@11.0592MHz {uchar i,j;uint k;for(k=0;k<ms;k++){i = 11;j = 190;do{while (--j);} while (--i);}}uchar key(uchar s) //按键扫描子函数{uchar flag=s;uchar k,i,p3;flag1=0;k=0x7f; //行扫描初值for(i=0;i<2;i++) //扫描行{P3=k;Delay1ms(5);p3=P3; //判断哪一列的键按下switch(p3&0x1c){case 0x18: flag=i*3;flag1=1;break;case 0x14: flag=i*3+1;flag1=1;break;case 0x0c: flag=i*3+2;flag1=1;break;default: break;}if(flag1)break;else k=k>>1|0x80;}return flag;}五、实验过程中遇到的问题及解决方法1.由于这个实验是第一个实验因此遇到了不少的问题。
发光二极管流水灯实验报告

实验一发光二极管流水灯实验
一、实验目的:
1.通过AT89C51单片机控制8个发光二极管,八个发光二极管分别接在单片机的P0.0-P0.7接口上,输出“0”时,发光二极管亮。
开始时P0.0→P0.1….→P0.7,实现亮点以1HZ频率循环移动。
2.用PROTEUS 设计,仿真以AT89C51为核心的发光二极管流水灯实验装置。
3.掌握发光二极管的控制方法。
二、PROTEUS电路设计:
三、实验仪器和设备
PC机、PROTEUS软件或W-A-51综合开发学习板
四、源程序设计:
1.程序
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R1,#08H ;8个发光二极管,循环8次点亮
MOV A,#0FEH ;共阳接法,低电平点亮
LOOP: ;循环依次点亮
MOV P0,A ;输出到P0口点亮二极管
RL A
ACALL DELAY ;调用延时
DJNZ R1,LOOP ;判断8个二级管是否都点亮过
SJMP MAIN ;若8个二极管都循环点亮一次,则重新依次点亮
DELAY:MOV R2,#10 ;延时1S
DEL3:MOV R3,#200
DEL2:MOV R4,#125
DEL1:NOP
NOP
DJNZ R4,DEL1
DJNZ R3,DEL2
DJNZ R2,DEL3
RET
END。
8255流水灯实验((

8255流水灯实验((1)设计题目分析编写程序,使用8255的A 口和B 口均为输出,实现16位流水灯显示效果2)功能扩展i:将流水灯设计成可以正着流水,也可以倒着流水ii:通过开关对流水灯闪烁的速度进行控制,高电平时为快,低电平时为慢速2)总体方案设计分析要求用8255的A 口和B 口做为输出,接16个发光二极管,从而实现16位流水灯的显示效果,基本的界限可如下图A所示,在C 口的地两位接两个开关,实现两个扩展功能的控制。
i:基本流水灯显示电路A 口和B 口两个端口不能同时复制,从而在试验中可以用BX进行需要复制的数据的存储,因为BX可以分从BH BL两个部分进行独立的操作,在本次试验中用BH对A 口进行赋值,用BL对B 口进行赋值,通过演示一段时间再对BH BL进行移位和输出,实现流水灯的效果。
ii:正反方向选择把PC.0 口接在开关上,编写程序对C端口的数据进行读取,并进行判断,使得当PC.0为高电平的时候则灯进行左移,同时 B 口与A 口相反。
iii:快慢速度控制把PC.1 口接在开关上,编写程序对C端口的数据进行读取,并进行判断,使得当PC.1为高电平的时候则延时的时间缩短,使得流水灯的流水速度加快,低电平的时候则进行延时的时间变长,使得流水灯的流水速度加快。
3硬件原理设计A该模块的WR.RD分别练到PC总线接口模块的XIOW和XIOR B该模块的数据(AD0~AD7 )、地址线(A0~A7)分别连到PC 总线接口模块的数据(D0~D7 )、地址线(A0~A7 )C 8255模块选通线CA连到PC总线接口模块的IOY3D 8255的PA0~PA7连到发光二极管的L1~L8;8255的PB0~PB7连到发光二极管的L9~L16E 8255的PC0 PC1分别练到开关K0 K1F软件流程框图及程序清单图A实验中肮凶的连按设置控制字,对A 口B 口赋匾分别保存在BH BUBH右移左移卩*保护现场程序代码MY8255_A EQU 09860HMY8255_B EQU 09861HMY8255_C EQU 09862H MY8255_MODE EQU 09863H CODE SEGMENTASSUME CS:CODESTART:MOV DX,MY8255_MODEMOV AL,81HOUT DX,ALMOV CL,0XOR BX,BXMOV DX,MY8255_BMOV AL,0FEHMOV BL,ALOUT DX,ALMOV DX,MY8255_AMOV AL,7FHMOV BH,ALOUT DX,ALA1:ROL BL,1ROR BH,1A3:PUSH BXCALL BREAKCALL DELAYPOP BXMOV DX,MY8255_AMOV AL,BHOUT DX,ALMOV DX,MY8255_BMOV AL,BLOUT DX,ALMOV DX,MY8255_C IN AL,DX AND AL,01HJNZ A2JMP A1A2:ROL BH,1ROR BL,1JMP A3 ;设置A 口、B 口方式0 输出,C 口低四位方式0 输出; 将BX 清零;对A 口、B 口赋值,并将值保存在BH BL中;对BH BL做出相应的移位;保护现场; 调用任意键退出程序; 调用延时程序;恢复现场;将移位后的结果输出;将C 都的数据输入; 查看PC0 口是否有数据输入,改变流水灯的方向;结果不全为0,则跳转MOV CX,0FFFHK1:MOV BX,0FFFH K2:DEC BXCMP BX,1000HJNE K2MOV DX,MY8255_CIN AL,DXAND AL,02HJNZ K3LOOP K1K3:RET DELAY ENDP BREAK PROC NEAR MOV AH,06H MOVDL,0FFHINT 21HJE RETURNMOV AX,4C00H INT 21H RETURN:RET BREAK ENDP CODE ENDSEND START ;将C 口的数据输入;查看PC1 是否有输入,改变延时,使得延时的时间变快结果不全为0.则跳转;按任意键退出。
单片机实验报告流水灯双机通信交通灯定时时钟

实验一流水灯实验一、实验目的1)简单 I/O 引脚的输出2)掌握软件延时编程方法3)简单按键输入捕捉判断二、实验实现的功能1)开机是点亮 12 发光二极管,闪耀三下2)依据顺时针循环挨次点亮发光二极管3)经过按键将发光二极管的显示改为顺逆时针方式三、系统硬件设计流水灯原理图四、系统软件设计演示程序按键正转闪耀反转五、实验过程中碰到的问题及解决方法1) 每次循环不论正转仍是反转程序,总先是先履行P1 口的 8 位 led 灯。
原由:在利用 KEIL 自带的库函数中的 _crol_ 和_cror_ 时,在正转和反转程序中应当调动次序的,开始没注意到。
更正后显示正常。
2)在开始实验的时候推行的是向来循环的方式,利用按键嵌套。
以后发现不理想,每次按键按到三次以上后进入死循环。
解决方案:利用一个按键,显示一次。
并加入按键开释,防备误动作。
指导老师署名:日期:实验一程序 :/******************************************************************** **************工程说明:本工程主要达成了一下功能:1,复位后演示全部功能2,灯闪耀三次3,流水灯正转4,流水灯反转函数说明:yanshi() :演示程序dengss() :闪耀程序right():正转程序left():反转程序scankey() :按键扫描********************************************************************* **************/#ifndef _led_h#define _led_h#define uint unsigned int#define uchar unsigned charuchar i,j,a,b,c,d;uchar flag=0;//亮灯判断标记uchar aa,bb,cc,dd,ss;sbit H1=P3^6;sbit key1=P0^5;sbit key2=P0^6;sbit key3=P0^7;void delay(uint);//1ms 延时void yanshi(void);//演示全部亮灯方式void dengss(void);//闪耀三次void left(void); //左循环亮灯void right(void);//右循环亮灯void scankey(); //按键扫描#endif#include"stc10.h"#include<intrins.h>#include<led.h> //包含各样变量定义及函数申明main(){yanshi();delay(2000); //两秒后进入可控大循环while(1){scankey();if(flag==0)right();if(flag==1)left();if(flag==2)dengss();}}void delay(uint x){uint i,j;for(i=110;i>0;i--)for(j=x;j>0;j--);}void yanshi(){dengss();right();left();P2=0XFF;P3=0XFF;}void dengss(){for(ss=3;ss>0;ss--)P2=0;P3=0xc3;delay(1000);P2=0xff;P3=0xff;delay(1000);}flag+=3;//退出小循环,只亮一次,增大按键扫描频次}void right(){aa=0xfe;for(a=8;a>0;a--){P2=aa;aa=_crol_(aa,1);delay(500);}bb=0xfb;P2=0xff;//熄灭循环后亮着的for(b=4;b>0;b--){P3=bb;bb=_crol_(bb,1);delay(500);}//D12 保存发亮flag+=3;//退出小循环,只亮一次,增大按键扫描频次}void left(){cc=0xdf;for(c=4;c>0;c--){P3=cc;cc=_cror_(cc,1);delay(500);P3=0xff;// 熄灭 D9dd=0x7f;for(d=8;d>0;d--){P2=dd;dd=_cror_(dd,1);delay(500);}//D1 保存发亮flag+=3;//退出小循环,只亮一次,增大按键扫描频次}void scankey(){H1=0;if(key1==0){delay(10);if(key1==0){flag=0;while(!key1);//等候按键开释}}if(key2==0){delay(10);if(key2==0){flag=1;while(!key2);//等候按键开释}}if(key3==0){delay(10);if(key3==0){flag=2;while(!key3);//等候按键开释}}}实验二准时器或实不时钟实验一、实验目的1)数码管动向显示技术2)准时器的应用3)按键功能定义二、实验实现的功能1) 经过按键能够设定准不时间,启动准时器,准不时间到,让12 个发光二极管闪耀,达成准时器功能。
实验五 流水灯的设计

实验五流水灯的设计一、实验目的1、了解流水灯的工作原理。
二、实验原理及内容实验原理要完成本实验,首先必须了解流水灯的原理。
所谓的流水灯实际上就是由多个LED发光二极管构成的电路,当发光二极管可以依次点亮时,即能呈现流水的效果。
实验内容1、设计能带8个LED发光管发光,并按照要求轮流发光,产生流水灯的流动效果。
2、应具有两种以上不同风格的流动闪亮效果。
比如依次点亮或者依次熄灭。
(选作)3、有起动、停止控制键。
(选作)4、有流动闪亮效果选择设置键。
(选作)5、对所编写的电路进行编译及正确的仿真。
三、实验条件Quartus II实验环境四、实验与仿真顶层文件如下:Cp为时钟信号R为异步清零端。
当r=1时清零。
S[2..0]为输入端。
根据s的不同取值来实现不同的功能。
D[7..0]为预制数Q[7..0]为输出功能表如下VHDL编码如下library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity traffic isport(clk,enb:in std_logic;ared,agreen,ayellow,bred,bgreen,byellow:buffer std_logic;acounth,acountl,bcounth,bcountl:buffer std_logic_vector(3 downto 0));end traffic;architecture one of traffic isbeginprocess(clk,enb)variable lightstatus:std_logic_vector(5 downto 0);beginif(clk'event and clk='1')thenlightstatus:=ared&agreen&ayellow&bred&bgreen&byellow;if((acounth="0000" and acountl="0000") or(bcounth="0000" and bcountl="0000"))thencase lightstatus iswhen "010100"=>lightstatus:="001100";acountl<="0101";acounth<="0000";bcountl<="0101";bcounth<="0000"; when"001100"=>if(enb='1')thenlightstatus:="100010";acountl<="0000";acounth<="0011";bcountl<="0101";bcounth<="0010";elselightstatus:="010100";acountl<="0101";acounth<="0100";bcountl<="0000";bcounth<="0101"; end if;when "100010"=>lightstatus:="100001";acountl<="0101";acounth<="0000";bcountl<="0101";bcounth<="0000";when"100001"=>lightstatus:="010100";acountl<="0101";acounth<="0100";bcountl<="0000";bcounth<="0101";when others=>lightstatus:="010100";acountl<="0101";acounth<="0100";bcountl<="0000";bcounth<="0101";end case;elseif(acountl="0000")thenacounth<=acounth-1;acountl<="1001";elseacountl<=acountl-1;end if;if(bcountl="0000")thenbcounth<=bcounth-1;bcountl<="1001";elsebcountl<=bcountl-1;end if;end if;end if;ared<=lightstatus(5);agreen<=lightstatus(4);ayellow<=lightstatus(3);bred<=lightstatus(2);bgreen<=lightstatus(1);byellow<=lightstatus(0); end process;end one;仿真:右移:依次点亮灯左移:依次点亮灯循环右移:循环点亮循环左移:循环点亮。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一发光二极管流水灯实验一、实验目的:1.通过AT89C51单片机控制8个发光二极管,八个发光二极管分别接在单片机的P0.0-P0.7接口上,输出“0”时,发光二极管亮。
开始时P0.0→P0.1….→P0.7,实现亮点以1HZ频率循环移动。
2.用PROTEUS 设计,仿真以AT89C51为核心的发光二极管流水灯实验装置。
3.掌握发光二极管的控制方法。
二、PROTEUS电路设计:三、程序部分#include<reg51.h>sbit control = P3^7;void delay(int z){int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){int i,tmp;control = 0;P0 = 0xef;delay(1000);for(i=1;i<=7;i++){tmp = P0;P0 = (tmp>>1)+ 0x80;delay(1000);}}实验二开关控制LED数码管实验一、实验目的:1.通过AT89C51读入4位开关K1、K2、K3、K4的输入状态,并按照二进制编码关系0-F输出到数码管显示。
(如K4K3K2K1全部按下,则显示F;若只有K2按下,则显示2。
)2.掌握LED数码管的静态显示。
3.掌握I/O口的控制方法。
二、PROTEUS电路设计:三、程序部分#include<reg51.h>unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,}; unsigned char KEY;void main(){while(1){KEY = P2;switch(KEY){case 0xff:P0 = table[0];break;case 0xfe:P0 = table[1];break;case 0xfd:P0 = table[2];break;case 0xfc:P0 = table[3];break;case 0xfb:P0 = table[4];break;case 0xfa:P0 = table[5];break;case 0xf9:P0 = table[6];break;case 0xf8:P0 = table[7];break;case 0xf7:P0 = table[8];break;case 0xf6:P0 = table[9];break;case 0xf5:P0 = table[10];break;case 0xf4:P0 = table[11];break;case 0xf3:P0 = table[12];break;case 0xf2:P0 = table[13];break;case 0xf1:P0 = table[14];break;case 0xf0:P0 = table[15];break;default :break;}}}实验三外中断优先级实验一、实验目的:1.理解单片机中断优先级和优先权。
2.用PROTEUS 设计,仿真基于AT89C51单片机的中断优先级实验。
3.掌握中断编程方法。
单片机主程序控制P0口数码管循环显示0~8;外中断0、外中断1发生时分别在P2口、P1口依次显示0~8。
通过实验可演示高优先级可中断低优先级,但低优先级的中断请求不能中断高优先级。
二、PROTEUS电路设计:三、程序部分#include<reg51.h>unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};// 共阳数码管的段码void delay(int z) //延时子程序,大约1ms{int x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}int i0=0,i1=0; // 用于中断0,1显示数码管的变量void main(){int i;EX0 = 1; //开外部中断0EX1 = 1; //开外部中断1IT0 = 1;IT1 = 1;PX0 = 1;PX1 = 0;EA = 1; //开总中断while(1){for(i=0;i<9;i++) //P0 循环显示0~8{P0 = table[i];delay(200);}}}void int0()interrupt 0 // 外部中断0优先级高于外部中断1 ,中断号为 0{for(i0=0;i0<9;i0++) //显示0~8{P2 = table[i0];delay(200);}}void int1()interrupt 2 //外部中断1,中断号为2{for(i1=0;i1<9;i1++) //显示0~8{P1 = table[i1];delay(200);}}实验四 60S倒计时实验一、实验目的:1.通过AT89C51的定时器实现60S倒计时,显示采用两位数码管动态显示。
2.用PROTEUS 设计,仿真基于AT89C51单片机的60S倒计时实验。
二、PROTEUS电路设计:三、程序部分#include<reg52.h>sbit GE = P2^1;sbit SHI = P2^0;int count = 0,number = 60;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};void delay(int z);void display();void main(){EA = 1;ET0 = 1;TMOD = 0X01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;TR0 = 1;while(1){display();}}void delay(int z){int x,y;for(x=110;x>0;x--)for(y=z;y>0;y--); }void display(){SHI = 0;GE = 1;P1 = table[number%10];delay(10);GE = 0;SHI = 1;P1 = table[number/10];delay(10);}void time_count() interrupt 1{TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;count++;if(count == 20){count = 0;number--;if(number < 0)number = 59;}}实验五矩阵式键盘的设计一、实验目的:1.掌握键盘设计中按键识别的原则。
2.用PROTEUS 设计一个常规4×4的矩阵键盘。
3.键盘编码规则自己定义,分别对应数字键0-9、A-F,按下对应的按键显示在数码管上显示对应的数据。
二、PROTEUS电路设计:三、程序部分#include<reg51.h>sbit show_1 = P1^0;sbit show_2 = P1^1;sbit show_3 = P1^2;sbit show_4 = P1^3;unsigned char j,k,temp,key;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,};void delay(unsigned char i);void display(unsigned char num); void key_scan();void main(){while(1){key_scan();display(key);}}void delay(unsigned char i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(unsigned char num) {P0=table[num];show_4 = 0;}void key_scan(){P2=0xef;temp=P2;temp=temp&0x0f;if(temp!=0x0f){delay(10);if(temp!=0x0f){temp=P2;switch(temp){case 0xe7:key=0;break;case 0xeb:key=1;break;case 0xed:key=2;break;case 0xee:key=3;break;}while(temp!=0x0f) {temp=P2;temp=temp&0x0f; }display(key);}}P2=0xdf;temp=P2;temp=temp&0x0f;if(temp!=0x0f){delay(10);if(temp!=0x0f){temp=P2;switch(temp){case 0xd7:key=4;break;case 0xdb:key=5;break;case 0xdd:key=6;break;case 0xde:key=7;break;}while(temp!=0x0f) {temp=P2;temp=temp&0x0f; }display(key);}}P2=0xbf;temp=P2;temp=temp&0x0f;if(temp!=0x0f){delay(10);if(temp!=0x0f){temp=P2;switch(temp){case 0xb7:key=8;break;case 0xbb:key=9;break;case 0xbd:key=10;break;case 0xbe:key=11;break;}while(temp!=0x0f){temp=P2;temp=temp&0x0f;}display(key); }}P2=0x7f;temp=P2;temp=temp&0x0f;if(temp!=0x0f){delay(10);if(temp!=0x0f){temp=P2;switch(temp){case 0x77:key=12;break;case 0x7b:key=13;break;case 0x7d:key=14;break;case 0x7e:key=15;break;}while(temp!=0x0f) {temp=P2;temp=temp&0x0f; }display(key);}}}实验六 AD转换程序设计一、实验目的:1.掌握转换器ADC0809的使用。