综合实验一——按键控制流水灯实验(查询方式)
流水灯控制实验PLC综合实训报告
流水灯控制实验PLC综合实训报告前言随着工业自动化的不断发展,PLC(Programmable Logic Controller)已经成为了工业控制系统中的重要组成部分,并被广泛应用于工业、建筑、冶金等领域。
PLC 具有编程方便、可靠性高、易于维护等优点,因此受到了广大工程技术人员的欢迎。
本次实训以流水灯控制为例,让我们学习如何使用PLC,实现简单电路的控制。
一、实验目的1、了解PLC的基本概念和工作原理;2、学习PLC的编程方法和语言;3、掌握PLC控制电路的设计方法;4、练习PLC的实际应用。
二、实验器材1、PLC:三菱 FX2N-32MR;2、继电器模块:三菱 FX2N-16ER;3、开关按钮:三菱 XP2-ER;4、灯泡:AC220V 60W;5、导轨、端子台、导线等。
三、实验原理PLC(可编程逻辑控制器)是一种专门用于工业控制的数字电子计算机,它通过控制输入/输出设备的信号,实现对工业生产过程的控制。
PLC具有以下特点:1、可编程性:PLC采用可编程的程序控制,可以根据具体要求编制程序,灵活可变。
2、可靠性高:PLC拥有强大的自我检测和故障保护机制,能够快速发现并隔离故障,保证工业生产的可靠性。
3、易于维护:PLC采用模块化设计,模块之间互相独立,更换维修时非常方便。
4、安全性好:PLC具有严密的硬件和软件安全保护机制,能够有效避免工作过程中的安全事故。
本次实验所控制的流水灯,是由多个信号输出交替控制的。
PLC将输入的信号,通过编程控制,实现了信号输出的自动交替。
因此,我们可以在PLC编程后,通过控制输入按钮,实现流水灯的开启和关闭。
四、实验步骤1、器材准备实验器材准备:PLC、继电器模块、开关按钮、灯泡等。
2、电路设计及接线设计电路,灯泡连接在继电器上,继电器连接在端子台上。
3、PLC编程(1)打开PLC编程软件GX Developer,创建新项目,并指定PLC型号为FX2N-32MR。
综合实验一——按键控制流水灯实验(查询方式)
北京科技大学微型计算机原理实验报告学院:____自动化学院________________专业、年级:_自动化1101_ ______________ 姓名:__廖文骏_ ________________学号:_ 20111002124 ____________ 指导教师:___ _____王粉花____________2013年12 月综合实验一按键控制流水灯实验(查询方式)实验学时:2学时一、实验目的1.掌握ATmega16 I/O口操作相关寄存器2.掌握CodeVision AVR软件的使用3. 复习C语言,总结单片机C语言的特点二、实验内容1. 设计一个简单控制程序,功能是8个LED逐一循环发光0.5s,构成“流水灯”。
2. 用两个按键K1和K2控制流水灯(中断方式):(1)当按下K1时,流水灯从左向右流动;(2)当按下K2时,流水灯从右向左流动。
三、实验所用仪表及设备硬件:PC机一台、AVR_StudyV1.1实验板软件:CodeVision AVR集成开发软件、SLISP下载软件四、实验原理ATmega16芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4组8位,共32路通用I/O接口,分别对应于芯片上32根I/O引脚。
所有这些I/O口都是双(有的为3)功能复用的。
其中第一功能均作为数字通用I/O接口使用,而复用功能则分别用于中断、时钟/计数器、USRAT、I2C和SPI串行通信、模拟比较、捕捉等应用。
这些I/O口同外围电路的有机组合,构成各式各样的单片机嵌入式系统的前向、后向通道接口,人机交互接口和数据通信接口,形成和实现了千变万化的应用。
每组I/O口配备三个8位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。
I/O口的工作方式和表现特征由这3个I/O口寄存器控制。
AVR通用I/O端口的引脚配置情况:I/O口引脚配置表表中的PUD为寄存器SFIOR中的一位,它的作用相当AVR全部I/O口内部上拉电阻的总开关。
流水灯实验报告
实验一流水灯实验一、实验目的1)简单I/O引脚的输出2)掌握软件延时编程方法3)简单按键输入捕获判断二、实验实现的功能1)开机时点亮12发光二极管, 闪烁三下2)按照顺时针循环依次点亮发光二极管3)通过按键将发光二极管的显示由顺时针改为逆时针方式三、系统硬件设计单片机STC10F08XE 1片发光二极管led 红4个黄4个绿4个按键6个复位电路时钟电路如下图所示:四、系统软件设计#include<reg51.h>sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; void Delay(void){unsigned char i,j,k;for(i=10;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }Scan_Key(){ unsigned char FLAG=0;unsigned char n;n=(L1==0)||(L2==0)||(L3==0);if(n) { FLAG=1;}return FLAG; }main(){ unsigned char y,n,s=0,b=1,m=0;unsigned char c=1;unsigned char a[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char h[]={0xff,0x38,0x34,0x2f,0x1f};n=Scan_Key(); for(y=0;y<3;y++){ P2=0; P3=0; Delay(); Delay(); Delay();P2=0xff; P3=0xff; Delay(); Delay(); Delay(); }while(1) { while(1){ m=m+n; P3=0x3f; while(1){ for(;b<9;b++){ n=Scan_Key(); m=m+n;if((P3==0x3f)&&(m%2==0)){P2=a[b];Delay();}else { P2=0xff;break; }if(m%2==0) c=1; P2=0xff; }for(;c<5;c++){n=Scan_Key(); m=m+n;if((P2==0xff)&&(m%2==0)){ P3=h[c];Delay();}else { P3=0x3f;break;} }if(m%2==0) b=1; break; }if(m%2==1) break; }while(1){ for(;b>0;b--){n=Scan_Key(); m=m+n;if((P3==0x3f)&&(m%2==1)){P2=a[b];Delay(); } else{P2=0xff;break;} P2=0xff; }if(m%2==1) c=4; for(;c>0;c--){ n=Scan_Key(); m=m+n;if((P2==0xff)&&(m%2==1)){ P3=h[c]; Delay();}else { P3=0x3f;break;} P3=0x3f; }if(m%2==0) break;if(m%2==1) b=8; } } }五、实验过程中遇到的问题及解决方法问题1: 如何实现顺、逆时针依次点亮流水灯?解决: 利用循环右移_cror_(m,1)和循环左移_crol_(n,1)依次点亮。
嵌入式系统 流水灯、按键、定时器实验报告
嵌入式系统应用实验报告姓名:学号:学院:专业:班级:指导教师:实验1、流水灯实验1.1实验要求编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。
1.2原理分析实验主要考察对STM32F10X系列单片机GPIO的输出操作。
参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。
由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。
由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。
反之,LED灯熄灭。
1.3程序分析软件方面,在程序启动时,调用SystemInit()函数(见附录1),对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。
GPIO配置函数为SZ_STM32_LEDInit()(见附录2),函数中首先使能GPIO 时钟:RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。
初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录3)。
实验程序流程图如下:硬件方面,根据实验指南,将实验板做如下连接:1.3实验结果实验二、按键实验2.1实验要求利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。
流水灯控制实验
综合实验:流水灯控制一、实验要求:根据开关状态选择八个流水灯的工作方式,且在任何状态下如有开关状态发生改变,则能立即转入最新开关状态所对应方式工作。
模式一:顺序点亮八个灯,一直循环,直到开关状态改变。
模式二:八个灯闪烁,即八盏灯全亮后全灭,一直循环,直到开关状态改变。
模式三:间隔点亮八个灯,如对八盏灯编号为L1、L2、L3、L4、L5、L6、L7、L8 ,则灯亮的方式为:L1 L3 L5 L7 ,L2 L4 L6 L8 ,L1 L3 L5 L7 ,L2 L4 L6 L8(从左往右循环)。
二、实验内容:开关S1、S2 分别与P3.1、P3.0连接,用于流水灯工作方式控制,开关组合为00、01、02、03,其中00为无效状态,01、02、03分别对应连续方式点亮灯、闪烁、间隔点亮。
八盏灯L1、L2、L3、L4、L5、L6、L7、L8分别与P1.0~P1.7连接,八盏灯为共阴极连接,即高电平点亮。
由于灯的状态改变时间间隔小于肉眼能分辨的最小时间间隔,所以在程序实现的时候必须在灯两种状态之间引入延时处理,以便肉眼能够分辨。
1.延时子程序(条件转移侧N,竖Y此页有效)四、程序代码:ORG 0000HSJMP MAINORG 0030HMAIN:MOV SP,#60HRESCAN:MOV A,#00HMOV P1,A ;灯全灭LCALL SCAN ;扫描P3口状态CJNE R0,#01H,NEXT1AJMP MODE1 ;如果P3=FDH,则转入MODE1执行(灯连续点亮)NEXT1: CJNE R0,#02H,NEXT2AJMP MODE2 ;如果P3=FEH,则转入MODE2执行(灯闪烁)NEXT2: CJNE R0,#03H,NEXT3AJMP MODE3 ;如果P3=FFH,则转入MODE3执行(间隔点亮灯)NEXT3: SJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE1: ;灯连续点亮,从左往右(MODE1), P3=FDH MOV A,#00HMOV P1,AMOV R2,#80H ;R2=1000,0000LOOP1: MOV A,R2MOV P1,ARR AMOV R2,A ;A向右移一位后回送R2LCALL DEL200 ;调用200Ms延时子程序LCALL SCAN ;扫描P3口状态CJNE R0,#01H,NEXT01SJMP LOOP1 ;如果P3状态没变,跳到LOOP1执行NEXT01:CJNE R0,#02H,NEXT02AJMP MODE2 ;如果P3变为P3=FEH,跳到MODE2执行NEXT02: CJNE R0,#03H,NEXT03AJMP MODE3 ;如果P3变为P3=FFH,跳到MODE3执行NEXT03: AJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE2: ;灯闪烁(MODE2), P3=FEHMOV A,#00HLOOP2: MOV P1,ACPL ALCALL DEL200 ;延时200MsPUSH ACC ;扫描P3状态前,保护现场LCALL SCAN ;扫描P3口POP ACC ;恢复现场CJNE R0,#02H,NEXT001SJMP LOOP2 ;如果状态没变,转到LOOP2执行NEXT001: CJNE R0,#01H,NEXT002AJMP MODE1 ;如果模式改变,P3=FEH,跳到MODE2NEXT002: CJNE R0,#03H,NEXT003SJMP MODE3 ;如果模式改变,P3=FFH,跳到MODE3NEXT003: AJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE3:MOV A,#00H ;间隔点亮灯(MODE3),R0=03HMOV P1,AMOV R3,#04H ;R3,R4都用来控制当前趟第一个灯亮的初始位置MOV R4,#04HMOV A,#80H ;准备给P1送1000,0000LOOP3 :MOV P1,ARR ARR ALCALL DEL200 ;延时200MsDJNZ R3,LOOP3 ;判断当前(从第一个开始亮)趟结束MOV R3,#04H ;如果此趟结束,重设计数,为下一次做准备MOV A,#40H ;设置下一趟灯亮的初始位置(第二个)LOOP4: MOV P1,ARR ARR ALCALL DEL200 ;延时200MsPUSH ACC ;保护现场LCALL SCAN ;扫描P3口POP ACC ;现场恢复CJNE R0,#03H,NEXT21DJNZ R4,LOOP4 ;如果模式不变,且该趟没结束,则到LOOP4MOV R4,#04H ;如果此趟结束(模式没变),则重置计数,为下一次做准备MOV A,#80HSJMP LOOP3 ;执行当前模式的第二次亮灯NEXT21:CJNE R0,#01H,NEXT22AJMP MODE1 ;模式改变为MODE1则装到对应位置执行NEXT22: CJNE R0,#02H,NEXT23AJMP MODE2 ;模式改变为MODE2则装到对应位置执行NEXT23: AJMP RESCAN ;如果R0=00H(无效状态),则不停的对P3口扫描DEL200: ;如果晶振频率f=6MHz,误差为0MOV R7,#13HDL1: MOV R6,#14HDL0: MOV R5,#82HDJNZ R5,$ ;R5-1<>0时重复执行此句DJNZ R6,DL0DJNZ R7,DL1RETSCAN:JB P3.0,MM ;P3口状态扫描子程序JB P3.1,VVMOV A,#00HMOV R0,ARETVV:MOV A,#02HMOV R0,ARETMM:JB P3.1,NNMOV A,#01HMOV R0,ARETNN:MOV A,#03MOV R0,ARETEND五、实验分析1、误差分析:假如晶振频率f = 6MHz,那么一个机器周期t = 0.002Ms。
按键、led流水灯实验
实验报告
实验名称:按键、LED流水灯
学院名称:电子与信息工程学院
专业方向:嵌入式方向
班级:电信10-1
姓名:x
实验日期:201x
while(1)
{
for(i=0;i<7;i++)
{
WriteByte(~led[i]);
if((IO0PIN & KEY1 )==0)
{
j+=200;
while((IO0PIN & KEY1 )==0);
}
if((IO0PIN & KEY2 )==0)
{
j-=200;
while((IO0PIN & KEY2 )==0);
一.实验目的:
掌握ARM7嵌入式系统实验箱的使用方法;掌握LPC2148的GPIO端口使用方法;了解74HC595的控制使用方法。
二.实验原理
1.GPIO接口的用法
LPC2114/2124的P0口和P1口由两组(每组4个)寄存器控制,如表6-10所列。对于LPC2210/2212/2214,P2口的寄存器起始地址0பைடு நூலகம்E002 8020,P3口的寄存器起始地址0xE002 8030,各寄存器的功能与P0和P1的寄存器是一致的。
④GPIO输出清零寄存器(IOnCLR, n=0、1、2、3)
当引脚配置位GPIO输出模式时,可使用该寄存器从引脚输出低电平。写入1使对应引脚输出低电平,并清零IOSET寄存器中相对应的位;写入0无效。如果一个引脚被配置为输入或第二功能,写IOCLR无效。
按键控制流水灯系统
按键控制流水灯系统设计摘要本设计旨在于通过所学知识,设计一个简单的按键控制流水灯系统,满足一些基本控制功能。
本设计选用80C51芯片作为核心硬件,组合74LS138译码芯片,4×4键盘,74LS273锁存芯片以及其他必要元器件实现对8个发光二极管和2个数码管显示屏的功能控制。
控制过程中用到了51单片机的定时/计数器和中断技术。
本次设计旨在于在理论学习单片机的基础上,通过实际系统的搭建,提高对所学知识的实际应用能力。
设计中,我们主要做了方案设计,电路搭建,程序编写,控制仿真,报告撰写等一系列工作。
方案设计说明设计要求:(1)利用按键控制流水灯的显示。
(2)利用3×3或者4×4键盘,控制数码管的显示。
(3)利用到定时/计数器。
(4)利用到中断技术。
设计功能:(1)按键0—7键为普通亮灭控制键,对应8个发光二极管,每个按键按一下,对应的灯亮,再按一次,对应的灯熄灭。
(2)按键8,12,13,14号键为功能控制键。
1)8键:按一下,8个灯逐个点亮,熄灭,循环左移三次。
2)12键:按一下,灯全部点亮,闪烁20次,返回原来状态。
3)13键:按一下,从左至右,每次点亮一个灯并保持,至灯全部点亮,再逐个熄灭。
4)14键:左右两侧灯逐对向中间点亮,熄灭,当灯对相遇后,向相反方向进行,循环两次返回。
(3)数码管显示为两位,一号为按键显示(显示被按下的键号),二号为功能号显示(显示执行的功能,从0—4分别对应1—7号键,8号键,12号键,13号键,14号键的功能)功能实现方案:51单片机的P0口(P0.0—P0.7)为低位地址总线,兼做数据总线,连接74LS273锁存器,输出的数据通过其锁存。
单片机P1口(P1.0—P1.7)用作通用I/O口,与键盘连接,其中,高四位(P1.4—P1.7)接为列控制线,低四位(P1.0—P1.3)接行控制线。
单片机P2口(P2.0—P2.5)为高位地址线,接外部74LS138译码芯片。
实验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.由于这个实验是第一个实验因此遇到了不少的问题。
按键控制数码管和流水灯设计报告实验报告
按键控制数码管和流水灯设计报告实验报告摘要单片机自20世纪70年代以来,以其极高的性价比,以及方便小巧受到人们极大的重视和关注。
本设计选用msp430f249芯片作为控制芯片,来实现矩阵键盘对LED数码管显示的控制。
通过单片机的内部控制实现对硬件电路的设计,从而实现对4*4矩阵键盘的检测识别。
用单片机的P3口连接4×4矩阵键盘,并以单片机的P3.0-P3.3口作键盘输入的列线,以单片机的P3.4-P3.7口作为键盘输入的行线,然后用P0.0-P0.7作输出线,通过上拉电阻在显示器上显示不同的字符“0-F”。
在硬件电路的基础上加上软件程序的控制来实现本设计。
其工作过程为:先判断是否有键按下,如果没有键按下,则继续检测整个程序,如果有键按下,则识别是哪一个键按下,最后通过LED数码管显示该按键所对应的序号。
关键字:单片机、流水灯、数码管、控制系统SCM since the nineteen seventies, with its high price, and a convenient compact attention and great concern. Thisdesign uses msp430f249 chip as the control chip, to realize the control of the LED digital tube display matrix keyboard. Through the internal control single chip to realize the hardware design of the circuit, so as to re alize the detection and recognition of 4*4 matrix keyboard. 4 * 4 matrix keyboard connected with the MCU P3 port, and the MCU P3.0 P3.3 port for a keyboard input, MCU P3.4P3.7 port as the lines of keyboard input, and then use theP0.0 P0.7 as the output line, by a pull-up resistor display different characters "0F on display". Control with software programs based on the hardware circuit to realize the design. The working process is: first to determine whether a key is pressed, if no key is pressed, it will continue to test the whole procedure, if a key is pressed, the Keywords: SCM, water lights, digital tubes, control system键盘控制流水灯和数码管实验报告目录一设计的目的 (2)二任务描述及方案设计 (3)1. 任务描述 (3)2. 方案设计 (3)三硬件设计方案 (3)1. Msp430f149单片机的功能说明 (3)2. 显示器功能 (4)3. 复位电路 (4)4. 按键的部分 (4)5. 74HC573的特点 (4)6. 流水灯和数码管电路原理图 (4)7. 元器件清单 (4)四程序设计方案 (5)1. 用IAR Embedded Workbench软件编程序 (5)2. 仿真电路图 (6)五实物实验 (7)1. 实物图 (7)2. 测试结果与分析 (7)六结论 (11)八参考文献 (16)一、设计目的1、进一步巩固和加深学生所学一门或几门相关专业课理论知识,培养学生设计、计算、绘画、计算机应用、文献查阅、报告撰写等基本技能;2、培养学生实践动手能力及独立分析和解决工程实践问题能力;3、培养学生的团队协作精神、创新意思、严肃认真的治学态度和严谨求实的工作作风。
流水灯控制实验报告及程序
uchar code table1[]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//
向左单个点亮二极管的代码
uchar code table2[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//
按键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅做一次处 理,必须去除按键抖动。在键闭合稳定时,读取键的状态,并且必须判别;在键 释放稳定后,再作处理。按键的抖动,可用硬件或软件两种方法消除。常用软件 方法去抖动,即检测到按键闭合后执行一个5〜10ms延时程序;让前沿抖动消失 后,再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有按键按下。 当检测到按键释放后,也要给5〜10ms的延时,待后延抖动消失后,才能转入该 键的处理程序。
2.用中断或查询方式编写程序,每按动一次 表示按键的次数,则其对应的流水效果如下:
①
②
③
④
⑤
⑥
成绩
3. P roteus仿真软件
KEY=O
KEY=1
KEY=2
KEY=3
KEY=4
KEY=5
L1-L8
L1-L8
L1-L8
L1-L8
L1-L8
P1口控制8个发光二级管L1—L8。口74LS240为八反响三态缓冲器/线驱动
void delay( uint a);
void INT_1() in terru pt 2
{
EX1=0; delay(20);
EXi==6)
i=0;
实验一流水灯控制实验
实验一流水灯控制实验
一、实验目的
1.了解51单片机的引脚结构,掌握单片机I/O的基本控制方法,延时时间的估算。
2.熟悉Keil开发环境,51单片机程序下载软件的使用。
3. 编写代码实现LED灯的流水功能,掌握蜂鸣器的打开和关闭方法。
4. 利用开发板下载hex文件后验证功能。
二、实验器材
PC机,CT107D单片机开发板
三、CT107D单片机开发板LED灯和蜂鸣器的电路接线图
注:流水灯的亮灭规律自行设计,要求说明控制流水灯亮灭规律的方法。
下图所示为74HC138译码器、LED灯、蜂鸣器及M74HC573锁存器的电路连接图。
说明:蜂鸣器的打开和关闭。
P06为高电平时,如果LE端有下降沿产生,锁存器会把P0口的数据锁存输出,使Q7引脚保持并输出高电平,再通过U10(ULN2003)反向逻辑驱动器件使N_BUZZ 输出为低,此时蜂鸣器就会鸣叫。
CC2530按键控制流水灯
1、适用平台 佳杰科技 Q2530SB 硬件平台
2、实验设备
1.RF2530N 或者 RF2530仿真器 1块 1块 1条 1个
2
3、实验目的
让用户学会按键应用是这一常用的人机交互方式。本实验用 D1, D2, D3 灯及按键 S1 为 外设。采用 P10、P11、P14 口为输出口,驱动 D1/D2/D3,P01 口为输入口,接受按键信号 输入(高电平为按键信号) 。
#include <ioCC2530.h> #define uint unsi gned int #define ucha r unsigned cha r //定义控制灯的端口 #define RLED #define GLED #define YLED #define KEY1 //函数声明 voi d Delay(uint); voi d Ini tIO(void); voi d Ini tKey(void); ucha r KeyScan(void); // 延时函数声明 //初始化函数声明 // 初始化按键函数声明 // 按键扫描函数声明 3 P1_0 P1_1 P1_4 P0_1 //定义 LED1 为 P10 口控制 //定义 LED2 为 P11 口控制 // 定义 LED3 为 P14 口控制 // 定义按键为 P01 口控制
4、实验相关寄存器
相关寄存器:P1,P1DIR,P0SEL,P0INP, P0,P0DIR(前面以介绍过的这里不再重复介绍,寄存器 功能说明请参阅 CC2530Datasheet.pdf ) P0SEL(0XF3) P0INP( 0X8F) P0( 0X80) P0DIR(0XFD) P0 [7:0 ]功能设置寄存器,默认设置为普通 I/ O 口 P0[7: 0]作输入口时的电路模式寄存器 P0[7: 0]位寻址 I/ O 寄存器 P0 口输入输出设置寄存器,0:输入,1:输出
按键控制流水灯的实验
匹配 1.3(TIMER1)
00
7:6
P0.19 GPIO P0.19 匹配 1.3(TIMER1)
MOSI(SPI1)
匹配 1.3(TIMER1)
00
9:8
P0.20 GPIO P0.20 匹配 1.3(TIMER1)
SSEL(SPI1)
EINT3
00
11:10 P0.21 GPIO P0.21
PWM5
位 1:0
2
3 5:4 31:6
描述
复位值
保留
00
该位为 0 时,P1.36:26 用作 GPIO。该位为 1 时,P1.31:26 用 作一个调试端口
P1.26/RTCK
该位为 0 时,P1:25:16 用作 GPIO。该位为 1 时,P1.25:16 用 P1.20/TRACESYNC
作一个跟踪端口
位 31:0
描述 GPIO 引脚值。IO0PIN 的位 0-31 位分别对应于 P0.0-P0.31
复位值 未定义
GPIO 输出置位寄存器 IOSET (表 4-7)
位 31:0
描述 输出置位。IO0SET 的位 0-31 位分别对应于 P0.0-P0.31
复位值 0
第 4 页,共 39 页
/niejinbo
启动文件结构
图 4-3
汇编文件 C 文件 头文件
分散加载文件
Startup.s 异常向量表,各模式堆栈初始化和跳转到 main()函数入口等
IRQ.s
负责管理中断嵌套
target.c 初始化 LPC2124 板
作者:聂金波 2008 年 10 月 V1.0
位
引脚名称
00
01
流水灯控制实验报告
流水灯控制实验报告一、引言流水灯是一种常见的电子实验和电路设计项目,它通过控制一组LED灯的亮灭顺序和时间间隔来呈现出一种流动的效果。
本实验旨在通过搭建一个流水灯电路,学习并掌握流水灯的原理和控制方法。
二、实验原理1.流水灯电路的组成本实验采用的流水灯电路是由多个LED灯组成的,LED灯的正极与电源相连,负极通过电阻连接到单片机的输出端口。
通过控制单片机输出高低电平来控制LED灯的亮灭。
2.流水灯的工作原理流水灯电路通过单片机的输出端口控制LED灯的亮灭顺序和时间间隔,实现流动的效果。
在一个循环中,每个LED灯按顺序依次亮起,然后熄灭,接着下一个LED灯亮起,如此循环往复,形成了流水灯的效果。
三、实验器材和元件1.单片机:选用STC89C52RC型单片机;2. LED灯:选用红色5mm直径的共阳极LED灯4个;3.电阻:选用220Ω的电阻4个;4.面包板、导线等。
四、实验步骤1.连接电路将单片机、LED灯和电阻等元件按照电路图,通过面包板和导线连接起来。
2.编写程序使用C语言编写程序,在单片机上控制LED灯的亮灭顺序和时间间隔。
通过设置单片机输出端口的高低电平,控制LED灯的亮灭。
3.烧写程序将编好的程序通过编程器烧写到单片机中,使其能够执行程序。
4.测试实验将电路连接到电源,并接通电源。
观察LED灯的亮灭情况,检查流水灯效果是否符合预期。
五、实验结果分析经过反复测试,流水灯电路能够正常工作,LED灯按照预设的顺序亮灭,形成了流动的效果。
六、实验总结通过本次实验,我学习了流水灯电路的原理和控制方法,并成功搭建了一个流水灯电路。
通过编写程序,我掌握了如何通过单片机控制LED灯的亮灭。
在实验过程中,我深刻理解了流水灯电路的工作原理,培养了动手实践和问题解决的能力。
七、实验改进措施1.可以通过调整LED灯的亮灭顺序和时间间隔,改变流水灯的效果和速度;2.可以使用其他颜色的LED灯,增加流水灯的变化效果;3.可以将流水灯电路与其他电子元件结合,设计更复杂的电路和效果。
按键控制流水灯实训报告
一、实训目的1. 熟悉51单片机的I/O口编程,掌握按键输入和LED输出控制的基本方法。
2. 学习单片机程序设计的基本思路,提高编程能力。
3. 培养动手实践能力,提高电路焊接和调试水平。
二、实训原理1. 单片机I/O口编程:51单片机的I/O口可以编程设置为输入或输出模式。
在本实训中,我们将I/O口配置为输出模式,用于控制LED灯的亮灭;同时,将I/O口配置为输入模式,用于检测按键状态。
2. 按键输入:当按键未被按下时,单片机通过检测I/O口输入电平,判断按键是否处于高电平状态;当按键被按下时,单片机检测到低电平状态。
3. LED输出:单片机通过编程控制I/O口输出电平,从而控制LED灯的亮灭。
在本实训中,我们通过依次点亮LED灯来实现流水灯效果。
4. 流水灯控制逻辑:根据按键状态,单片机在无限循环中不断检测按键状态,并改变流水灯的方向。
三、实训步骤1. 准备工作:准备51单片机开发板、按键、LED灯、电阻等元器件,以及相关编程软件。
2. 电路连接:按照电路图连接好51单片机、按键、LED灯和电阻等元器件。
3. 编程:使用Keil C51集成开发环境编写程序,实现按键控制流水灯功能。
4. 调试:将编写好的程序烧录到单片机中,进行电路调试。
5. 测试:验证按键控制流水灯功能是否正常。
四、程序设计1. 初始化I/O口:将P1口配置为输出模式,用于控制LED灯;将P3口配置为输入模式,用于检测按键状态。
2. 按键检测:在主循环中,不断检测P3口状态,判断按键是否被按下。
3. 流水灯控制:根据按键状态,控制LED灯依次点亮,实现流水灯效果。
4. 延时函数:为了使流水灯效果更加明显,使用延时函数控制LED灯点亮时间。
5. 按键状态处理:当检测到按键被按下时,改变流水灯方向。
五、实训结果与分析1. 实训结果:通过编程和调试,成功实现了按键控制流水灯功能。
2. 分析:(1)I/O口编程:通过编程将51单片机的I/O口配置为输入或输出模式,是实现流水灯功能的基础。
流水灯控制实验PLC综合实训报告
摘要PLC的功能强大,在生产生活中的应用广泛,其中西门子S7—200PLC在实际生产中最为常见。
本次专业综合实训主要是针对西门子S7—200PLC挂屏集成模块进行的。
本次专业综合实训主要内容有:PLC挂屏集成模块的插线,电气原理图的绘制,流水灯、交通信号灯、运动小车的多段速控制、A/D数模转换的程序编写与调试、相应的触摸屏程序的编写以及变频器参数的设置等。
实训一流水灯控制实验一、实训目的:设计流水灯控制系统。
二、实训要求:要求实现流水灯的依此循环亮,时间间隔为1s。
能够实现随时启动随时停止。
三、实训内容:利用外部按钮和编辑触摸屏界面,分别实现流水灯的启动和停止。
四、实现方法:根据实训课题要求,编程思路如下:1、首先用触点M1.3和M1.4分别控制中间继电器M0.2的得电和失电,按动M1.3,M0.2和Q0.6得电,触点M0.2和Q0.6动作,第一个灯亮,并将输出Q0.6自锁,同时启动定时器T33;2、1S后触点T33闭合,点亮第二个灯并启动定时器T34,触点Q0.7动作,将输出Q0.7自锁并使Q0.6失电,第一个灯灭,触点Q0.6和T33断开;3、1S后触点T34闭合,点亮第三个灯并启动定时器T35,触点Q1.0动作,将输出Q1.0自锁并使Q0.7失电,第二个灯灭,触点Q0.7和T34断开;4、1S后触点T35闭合,重新点亮第一个灯并启动定时器T33,触点Q0.6动作,将输出Q0.6自锁并使Q1.0失电,第三个灯灭,触点Q1.0和T35断开,如此循环下去;5、当按动M1.4,输出M0.2失电,M0.2断开,输出全部失电,灯熄灭,定时器清零。
I/O表如下:五、实训结果:1)流水灯控制界面:按动启动按钮,三个灯依次循环点亮;按动停止按钮,流水灯熄灭。
2)流水灯控制程序:实训二交通灯控制实验一、实训目的:设计交通灯控制系统。
二、实训要求:1.能够实现总停止和总启动;2.红灯亮灯时间为25s,绿的为20s,黄灯闪烁5s;3.在触摸屏上显示各个灯的倒计时间。
按键控制数码管和流水灯设计报告实验报告
按键控制数码管和流水灯设计报告实验报告实验名称:按键控制数码管和流水灯设计报告一、实验目的本实验旨在通过使用按键来控制数码管和流水灯的显示,加深对数码管和流水灯工作原理的理解,并掌握按键的基本输入输出原理。
二、实验器材1. Arduino开发板2.数码管模块3.面包板4.面包板连接线5.按键模块6.跳线三、实验原理数码管是一种将数字和一些常用符号通过数码电路显示在特定位置的显示器件,由多个LED组成,可显示0-9及一些小于9的字母和符号。
流水灯是一种LED灯的组合,通过不同的时序控制,实现灯光依次点亮或熄灭的效果。
本实验通过使用按键控制器将数码管和流水灯的状态控制与显示,按下不同的按键可以使数码管切换显示不同的数字,同时控制流水灯的点亮或熄灭。
四、实验步骤1. 将数码管模块连接到Arduino开发板的数字I/O口,连接方式可参考数码管模块的接口定义和Arduino开发板的编号。
2. 将按键模块连接到Arduino开发板的数字I/O口,连接方式可参考按键模块的接口定义和Arduino开发板的编号。
3. 按键模块和数码管模块都需要使用面包板连接线和跳线连接到Arduino开发板的相应引脚上。
4.根据按键的读取状态,通过编程控制数码管显示相应的数字,利用流水灯实现通过按键的控制点亮或熄灭。
五、实验结果经过编程和调试,实验中数码管能够正确显示按键输入的数字,同时根据按键输入状态控制流水灯的点亮或熄灭。
按不同的按键可以切换数码管的数字显示,实现了按键对数码管和流水灯的控制。
六、实验总结本实验通过按键来控制数码管和流水灯的显示,加深了对数码管和流水灯的工作原理的理解。
同时,掌握了按键的基本输入输出原理,并通过编程控制实现了按键对数码管和流水灯的控制。
本实验还有一些可以改进的地方,例如可以增加多个按键,实现更多的控制功能;还可以通过增加延时函数控制流水灯的点亮或熄灭速度。
通过不断改进和练习,可以提高对Arduino开发板的理解和掌握。
实验一 流水灯实验
实验一流水灯实验1. 实验目的1.1 掌握单片机基础操作1.2 熟悉单片机的I/O口的使用1.3 学会使用循环语句、延时函数等基础函数2. 实验原理在该实验中,通过单片机控制多个LED灯依次点亮、熄灭,形成一个类似“流水”的效果。
在AT89S52单片机中,I/O口具有输出功能,即可以将I/O口的电平控制为高电平或低电平。
通过控制不同的I/O口电平,可以控制不同的LED灯的点亮、熄灭状态。
而I/O口的状态变化可以使用循环语句、延时函数等来控制,从而实现流水灯的效果。
3. 实验步骤3.1 硬件准备3.1.1 准备硬件:AT89S52单片机1块、LED灯5个、面包板1块、跳线若干。
3.1.2 连接电路:将AT89S52单片机引脚P0.0~P0.4连接到5个LED灯的阳极,将LED 灯的阴极连接到地,可以使用面包板和跳线完成电路连接。
3.2 编写程序流水灯实验程序如下:#include<reg52.h> //包含单片机寄存器的头文件sbit led1=P0^0; //定义led1~led5分别对应P0口的0~4引脚sbit led2=P0^1;sbit led3=P0^2;sbit led4=P0^3;sbit led5=P0^4;led1=0; //熄灭led1led2=1; //点亮led2led3=0; //熄灭led3led4=0; //熄灭led4led5=0; //熄灭led5delay(50000); //延时一段时间4. 实验结果将实验板连接电源并启动,运行程序后,可以看到LED灯依次点亮、熄灭,形成流水灯效果。
5. 实验思考题5.1 如何改变流水灯的速度?可以通过延时函数的参数设置来改变流水灯的速度,延时时间越短,LED灯的闪烁速度越快。
可以通过改变程序中LED灯点亮和熄灭的顺序和时间,实现不同的流水灯效果,比如5个LED灯两两同时点亮、相邻的LED灯同时点亮等效果。
实验一 按键实验
实验一 LED灯及按键实验一、实验目的1、了解KEIL软件和STC下载软件的操作方法。
2、学习用KEIL软件编写程序和STC软件下载程序的操作。
3、掌握单片机I/O口的应用,并学会简单的流水灯程序的编写。
4、理解独立按键的控制原理,能用独立按键控制led的亮灭。
二、实验设备1、单片机口袋机。
2、mini USB口下载线。
三、实验内容1、通过控制单片机I/O口的状态控制led灯的亮灭。
(LD0,LD1,LD2,LD3)2、控制四个led灯循环点亮。
3、通过口袋机上的按键(K0~K3)控制四个led灯亮灭,亮灭的形式可以多样化。
四、实验原理1、口袋机上的4个LED灯为共阳极的,实现LED流水灯时,单片机的I/O口可以控制LED灯的变化,本程序用到单片机的P3.7,P4.1,P4.2和P4.3口,分别对应口袋机的LD0,LD1,LD2,LD3。
现象为LED灯从右到左依次点亮并循环。
图1 LED接口原理图图2 LED原理图下面是P3口和P4口的I/O口的工作类型设定:2、按键(轻触开关)是一种广泛应用于各种电子设备的元件,比如我们最常用的电视机面板控制按钮,遥控器按钮。
其实就是一个常开的开关,按下后两个触点接触形成通路状态,松开时形成开路状态。
相关原理图如下:图1 按键原理图图2按键接线图五、实验步骤1、建立“TEST”文件夹,用于存放实验一的所有文件2、启动Keil uVision4 先建立一个空文件夹,之后建工程的时候把工程文件放在里面,以避免和其他文件混合,例如在桌面创建了一个“TEST”的文件夹。
双击桌面上的Keil uVision4图标打开软件3、点击“Project”选项,选择新建工程。
单击Project菜单,建立一个新工程。
在弹出的下拉菜单中选中New uvision Project选项。
4、给文件命名,例如“test”,将文件保存到“TEST”文件夹内新建的工程的文件的名字比如为“test”后缀必须是.uvproj用户可根据需要随便命名,保存到刚才新建的文件夹“TEST”下5、在该窗口选择CPU为“STC MCU”在弹出来的对话框中选择STCMCU Database6、选择单片机型号:“STC15W4K32S4”在弹出的对话框中可以看到里面全部都是STC的单片机,选择“STC15W4K32S4”单片机,右边栏是对这个单片机的基本说明,然后点击“确定”之后出现下图所示,Target就是刚才新建的工程7、点击“Files”选项,选择“New”新建文本,单击保存按键,将保存的文件后缀改为“.c”文件,则默认为该文件为用C语言编写。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京科技大学微型计算机原理实验报告学院:____自动化学院________________专业、年级:_自动化1101_ ______________ 姓名:__廖文骏_ ________________学号:_ 20111002124 ____________ 指导教师:___ _____王粉花____________2013年12 月综合实验一按键控制流水灯实验(查询方式)实验学时:2学时一、实验目的1.掌握ATmega16 I/O口操作相关寄存器2.掌握CodeVision AVR软件的使用3. 复习C语言,总结单片机C语言的特点二、实验内容1. 设计一个简单控制程序,功能是8个LED逐一循环发光0.5s,构成“流水灯”。
2. 用两个按键K1和K2控制流水灯(中断方式):(1)当按下K1时,流水灯从左向右流动;(2)当按下K2时,流水灯从右向左流动。
三、实验所用仪表及设备硬件:PC机一台、AVR_StudyV1.1实验板软件:CodeVision AVR集成开发软件、SLISP下载软件四、实验原理ATmega16芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4组8位,共32路通用I/O接口,分别对应于芯片上32根I/O引脚。
所有这些I/O口都是双(有的为3)功能复用的。
其中第一功能均作为数字通用I/O接口使用,而复用功能则分别用于中断、时钟/计数器、USRAT、I2C和SPI串行通信、模拟比较、捕捉等应用。
这些I/O口同外围电路的有机组合,构成各式各样的单片机嵌入式系统的前向、后向通道接口,人机交互接口和数据通信接口,形成和实现了千变万化的应用。
每组I/O口配备三个8位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。
I/O口的工作方式和表现特征由这3个I/O口寄存器控制。
AVR通用I/O端口的引脚配置情况:I/O口引脚配置表表中的PUD为寄存器SFIOR中的一位,它的作用相当AVR全部I/O口内部上拉电阻的总开关。
当PUD=1时,AVR所有I/O内部上拉电阻都不起作用(全局内部上拉无效);而PUD=0时,各个I/O口内部上拉电阻取决于DDRXn的设置。
小结:(1)使用AVR的I/O口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。
(2)当I/O工作在输入方式,要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。
(3)当I/O工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。
(4)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn的值。
(5)正确使用AVR的I/O口要注意:先正确设置DDRx方向寄存器,再进行I/O口的读写操作。
(6)AVR的I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。
所以,外部引脚呈现三态高阻输入状态。
因此,用户程序需要首先对要使用的I/O口进行初始化设置,根据实际需要设定使用I/O口的工作方式(输出还是输入),当设定为输入方式时,还要考虑是否使用内部的上拉电阻。
(7)在硬件电路设计时,如能利用AVR内部I/O口的上拉电阻,可以节省外部的上拉电阻。
五、实验步骤1、硬件接线图:根据图3.2所示,使用杜邦线将AVR_StudyV1.1实验板PA口与LED相连。
图3.22、新建工程,实现实验内容1。
根据电路图,LED属于共阳接法,所以PORTA输出低电平时灯点亮。
PORTA初始化:DDRA = 0xFF; //PA口工作为输出方式PORTA = 0xFF; // PA口输出全1,LED全灭“流水灯”程序控制:1、PA0 = 0 点亮LED0 PORTA = 0b11111110 = ~(1 << 0)2、PA1 = 0 点亮LED1 PORTA = 0b11111101 = ~(1 << 1)3、PA2 = 0 点亮LED2 PORTA = 0b11111011 = ~(1 << 2) ……7、PA6 = 0 点亮LED6 PORTA = 0b10111111 = ~(1 << 6)8、PA7 = 0 点亮LED7 PORTA = 0b01111111 = ~(1 << 7)9、PA0 = 0 点亮LED0 PORTA = 0b11111110 = ~(1 << 0) ……根据控制流程,总结出:可以利用移位运算实现“流水灯”的设计。
主函数:void main(void){unsigned char position = 0; // position为控制位的位置PORTA = 0xFF; // PA口输出全1,LED全灭DDRA = 0xFF; // PA口工作为输出方式while (1){PORTA = ~(1<<position);if (++position >= 8) position = 0;delay_ms(500);};}3、新建工程,实现实验内容2。
提示:在CVAVR中,提供int rand (void)和void srand(int seed)函数,产生随机数。
函数包含在头文件stdlib.h中,具体内容查阅CVAVR帮助文档。
在每一次读取流水灯程序前检测按键是否按下。
主程序如下while (1){// Place your code here//PORTA = led_7[count];//数码管更新显示switch( readkey() ) //检测一次按键是否按下,并读取相应的按键程序{case NO_KEY:break;case KEY1://第一种情况position = 0;i = 16;while(i--){PORTA = ~(0x80 >> position);if(++position >= 8)position = 0;delay_ms(50);}PORTA=0x00;break;case KEY2: //第二种情况position = 0;i = 16;while(i--){PORTA= ~(0xef<< position);//若改为PORTA=0xfe<<positionk可实//现从一个点亮到逐步全部点亮if(++position >= 8)position = 0;delay_ms(200); //延时程序}PORTA=0x00;break;default: break;}};}4、下载程序,观察实验现象。
注意熔丝位的配置,选择内部4MHz时钟。
附件:原程序代码/*****************************************************This program was produced by theCodeWizardAVR V2.03.4 StandardAutomatic Program GeneratorCopyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.Project :Version :Date : 2009-9-22Author :Company :Comments:Chip type : ATmega16Program type : ApplicationClock frequency : 4.000000 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/#include <mega16.h>#include <delay.h>// Declare your global variables here// Declare your global variables hereflash unsigned char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char position,i;#define NO_KEY 0#define KEY1 1#define KEY2 2#define KEY1_PIN ~PIND.2#define KEY2_PIN ~PIND.3unsigned char readkey(void){if(KEY1_PIN) //判断KEY1是否按下{delay_ms(20); //延时20ms,屏蔽抖动区if(KEY1_PIN) //再次判断KEY1是否按下{while(KEY1_PIN); //等待按键释放return KEY1; //返回键值1}}else if(KEY2_PIN) //判断KEY2是否按下{delay_ms(20); //延时20ms,屏蔽抖动区if(KEY2_PIN) //再次判断KEY2是否按下{while(KEY2_PIN); //等待按键释放return KEY2; //返回键值2}}return NO_KEY; //没有按键按下,返回键值0 }unsigned char count;void main(void){// Declare your local variables here// Input/Output Ports initialization// Port A initialization// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1PORTA=0xFF;DDRA=0xFF;// Port B initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In// State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=PPORTB=0x03;DDRB=0x00;// Port C initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=TPORTC=0x00;DDRC=0x00;// Port D initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=TPORTD=0x00;DDRD=0x00;// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 Stopped// Mode: Normal top=FFh// OC0 output: Disconnected TCCR0=0x00;TCNT0=0x00;OCR0=0x00;// Timer/Counter 1 initialization // Clock source: System Clock// Clock value: Timer 1 Stopped// Mode: Normal top=FFFFh// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off// Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer 2 Stopped// Mode: Normal top=FFh// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;SFIOR=0x00;count = 0;while (1){// Place your code here//PORTA = led_7[count];//数码管更新显示switch( readkey() ){case NO_KEY:break;case KEY1:position = 0;i = 16;while(i--){PORTA = ~(0x80 >> position);if(++position >= 8)position = 0;delay_ms(50);}PORTA=0x00;break;case KEY2:position = 0;i = 16;while(i--){PORTA= ~(0xef<< position);//若改为PORTA=0xfe<<positionk可实//现从一个点亮到逐步全部点亮if(++position >= 8)position = 0;delay_ms(200);}PORTA=0x00;break;default: break;}};}。