单片机实验――利用中断控制LED灯(精)
单片机实验——利用中断控制LED

单片机实验——利用中断控制LED本实验利用中断控制单片机的GPIO口控制LED的亮灭,达到了在不同的时间间隔下实现LED的闪烁、呼吸等效果。
本实验可以让初学者更好地理解与掌握单片机的中断和GPIO 控制。
一、实验器材准备1. STC12C5A16S2单片机开发板2. LED灯3. 1KΩ电阻4. 杜邦线二、实验原理本实验中,我们需要利用单片机的GPIO口控制LED灯的亮灭。
其中,单片机的GPIO 口需要设置为输出模式,即控制LED灯亮灭的电平。
在运行中,通过改变电平状态来控制LED的亮灭。
而中断控制则是为了实现不同的效果,比如在不同的时间间隔下闪烁、呼吸等。
中断是指硬件或软件的外部事件,它会打断当前正在执行的程序,转为执行中断程序。
在单片机编程中,我们可以采取中断方式实现不同的操作。
三、实验步骤1. 首先,连接电路。
将LED作为单片机GPIO控制的输出口,同时连接一个1KΩ的电阻,如下图:2. 打开Keil软件,新建工程,导入STC12C5A16S2头文件。
3. 在代码中,首先需要定义GPIO的引脚,接下来进行中断初始化设置。
4. 编写闪烁程序,实现LED在不同时间间隔下闪烁,如下:```cvoid Led_Flash(void){Led_ON(); //LED灯亮Delay(500); //延时等待500msLed_OFF(); //LED灯灭Delay(500); //延时等待500ms}```5. 编写呼吸程序,实现LED在不同时间间隔下进行呼吸灯效果。
```cvoid Led_Breath(void){uint8 i;uint16 j;for (i = 0; i < 10; i++) //变量i控制灯的亮度{for (j = 0; j < 2000; j++) //变量j控制每次延时等待的时间{Led_ON();Delay_us(i * 20);Led_OFF();Delay_us((9 - i) * 20);}}}```6. 编写中断控制程序,通过定时器中断来实现LED的不同效果。
采用外部中断的方式控制彩灯的各种变化运行

单片机实验报告21、实验目的:学会中断的使用方法采用外部中断的方式控制彩灯的各种变化运行2、实验工具单片机最小应用系统、THKL-C51仿真器、3、实验步骤1.首先分析题目的要求2.根据要求画出流程图3.确定主程序的内容(根据本题要求,主程序中主要写的LED灯向左移的程序,然后写向右移的程序,接下来是LED随机亮的程序(主要是通过查表法来实现),然后调用外部中断程序(主要是标志量flag 的自增程序),然后将整个程序编写完整)4.打开Keil uV ision 4软件,建立新的工程和文件,将主程序写入文件中,并且调试至无错误。
连接好外部的硬件系统,开始调试并运行,查看效果,并且记录结果。
4、实验主要程序#include <reg51.h>#include<stdio.h>#include<intrins.h>#define uchar unsigned charuchar flag=0; //定义变量void delayms() //定义延迟函数(250*250*2=0.125秒){unsigned char m,n;for(m=0;m<250;m++)for(n=0;n<250;n++);}void main(){uchar inum,i; //定义变量uchar dispalycode[8]={0x7e,0xbd,0x6a,0x5e,0x15,0x36,0x9b,0xaa}; //定义数组uchar LED=0xfe;P0=LED; // 亮一盏LED灯EA=1; //开启中断总控制位IT0=1; //外部0中断,下降沿触发EX0=1; //允许外部中断0中断while(1) //进入循环{if(flag==0) //判断标志位{delayms(); //延迟LED=_crol_(LED,1); //一盏LED灯循环左移P0=LED;}if(flag==1) //判断标志位{delayms(); //延迟LED=_cror_(LED,1); //一盏LED灯循环右移P0=LED;}if(flag==2) //判断标志位{inum=0;for(i=0;i<8;i++){inum++;delayms();P0=dispalycode[inum];} //查表法LED灯随机闪}}}void intersvr0(void) interrupt 0 using 1 //INT0中断服务程序{flag++;//标志位自增if(flag>2) flag=0; //判断标志位,大于2则置0}5、实验结果按键后给单片机下降沿脉冲,按下第一次键后LED灯依次向左移,再按下第二次键后LED灯依次向右移,再按下第三次键后LED灯随意亮,记下来按键后就重复前三次的情况,与题目的要求相符合。
实验、中断控制的8个LED灯轮流点亮电路

实验八、中断控制的8个LED灯轮流点亮电路专业: 班级:姓名: 学号:成绩:一、实验目的1.掌握中断程序的分析方法和设计方法。
2.学习电平触发方式及负脉冲触发方式的电路设计方法。
3.学习读程序,并能写出中断初始化程序段。
二、实验器材单片机开发设备一套。
三、实验内容和步骤试设计一个用单片机中断控制的8个LED灯轮流点亮的仿真控制系统,当按下一个按键之后,LED1灯亮,再按下一个按键后,彩灯顺次点亮一个。
要求按照电平触发和负脉冲触发两种方式来设计电路并进行程序设计。
电平触发方式下的仿真图:附加题:请设计一个电路,能实现开关控制的数码管显示0-9数字。
电平触发方式下的程序:ORG 0000HAJMP MAINORG 0013HAJMP SERVERORG 0030HMAIN:MOV A,#01HCLR IT1SETB EX1SETB EA SJMP $ORG 0200H SERVER:CLR P3.0 NOPNOPSETB P3.0MOV P1,ARL ARETIEND负脉冲触发方式下接于P3.3端口的仿真图:负脉冲触发方式下的程序:ORG 0000HAJMP MAINORG 0013HAJMP SERVERORG 0030HMAIN:MOV A,#11111110B MOV P1,A SETB IT1SETB EX1SETB EASJMP $ORG 0200HSERVER:CLR P3.3NOPNOPSETB P3.3MOV P1,ARL ARETIEND。
裸机定时器中断控制LED灯程序设计实验报告

裸机定时器中断控制LED灯程序设计一、实验要求:基于mini2440开发板,设计裸机定时器中断控制LED灯闪烁的程序。
二.设计目的1,巩固学习嵌入式软件方面的基本知识,进一步熟悉基本概念。
2,熟练常用控件,文件,图形等方面的操作了解基本的流程。
3,运用所用学的嵌入式知识,编写出较为实用的小软件,增进对一些实际问题的软,硬件知识的掌握。
4,培养查阅资料,独立思考问题的能力。
三. 实验步骤:四.基本思路及关键问题的解决方法;基本思路:1. 按照步骤程序设计原理说明,使用”CodeWarrior for ARM Developer Suite”软件编写程序并进行编译,建立一个新的文件单击【File】菜单中的【New File】选项,然后出现下面的对话框,输入文件名(加上后缀“.c”),单击保存按钮,在编译过程中如果出现错误,修改程序直到没有错误为止,编译过程中出现警告一般可以不必考虑,但特殊时也要通过修改程序消除警告。
程序编写完成后,将程序所在文件保存到2440test.mcp中,如图所示:2.用开发板测试程序代码:(1)首先设置开发板的拨动开关S2 为Nor Flash 启动,连接好附带的USB 线和电源(可以不必连接串口线)。
(2)设置超级终端(3)开机进入BIOS 模式,此时开发板上的绿色LED1 会呈现闪烁状态,其启动界面,如下图:输入”d”(4)安装USB 下载驱动(5)点击DNW 程序的“USB Port” “Transmit”,选择这个2440test.mcp文件,接着点“打开”,这样就开始下载了五.流程图及电路原理图1.绘制所需的流程图,如图所示:六.课程设计心得体会此次课程设计中我们的收获:我了解到了和小组成员合作的愉快,我意识到了知识的乐趣性,并感觉到当知识运用于实践的时候是一件多么幸福的事情。
我也发现自己的知识功底还远远不够。
平时不仅要将知识点理解掌握,还得勤动手做实验。
在以后的学习中我会更努力,在掌握理论知识的基础上,提高自己的动手能力。
stm32单片机设计定时器中断实现1s的led灯闪烁知识应用

stm32单片机设计定时器中断实现1s的led灯闪烁知识应用要实现1s的LED灯闪烁,可以使用STM32单片机的定时器中断来控制LED的开关。
以下是实现的步骤:1. 配置定时器:选择一个定时器(如TIM2)并设置适当的预分频和计数值,以实现1s的定时周期。
2. 配置中断:使能定时器中断,并将中断优先级设置为适当的值(较高优先级)。
3. 初始化LED引脚:将LED引脚设置为输出,并初始化为高电平(LED关闭)。
4. 编写中断处理程序:在中断处理程序(如TIM2_IRQHandler)中,切换LED引脚的状态。
例如,如果LED引脚当前为高电平,则将其设置为低电平,反之亦然。
5. 启动定时器:启动定时器以开始定时。
整个步骤如下所示的代码示例:```c#include "stm32fxx.h"void TIM2_IRQHandler(void){if(TIM2->SR & TIM_SR_UIF){TIM2->SR &= ~TIM_SR_UIF; // 清除中断标志位// 切换LED引脚状态if(GPIOC->ODR & GPIO_ODR_ODR0)GPIOC->ODR &= ~GPIO_ODR_ODR0; // 关闭LEDelseGPIOC->ODR |= GPIO_ODR_ODR0; // 打开LED}}int main(){// 初始化LED引脚RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // 使能GPIOC时钟GPIOC->MODER |= GPIO_MODER_MODER0_0; // 将PC0设置为输出模式GPIOC->OSPEEDR |= GPIO_OSPEEDR_OSPEED0; // 设置PC0输出速度// 配置定时器RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能TIM2时钟TIM2->PSC = 8399; // 将预分频设置为8400-1,得到10kHz 的计数频率TIM2->ARR = 9999; // 将计数值设置为10000-1,得到1s的定时周期// 配置中断TIM2->DIER |= TIM_DIER_UIE; // 使能更新中断NVIC_EnableIRQ(TIM2_IRQn); // 使能TIM2中断NVIC_SetPriority(TIM2_IRQn, 0); // 设置TIM2中断优先级为最高// 启动定时器TIM2->CR1 |= TIM_CR1_CEN; // 启动TIM2定时器while(1){// 程序主循环}return 0;}```以上代码使用了TIM2定时器和PC0引脚作为LED灯的控制。
用按键(采用外部中断0或1的方式)控制彩灯的运行

实验一标志寄存器实验目的:用按键(采用外部中断0或1的方式)控制彩灯的运行。
实验方法:1、通过在在中断过程中,设置标志变量flag(取值为0表示左移,1表示右移,2自定义)来判断按键被按下,每次按下切换一种显示方式。
2、当flag>2,则被清零,主程序按照flag的取值,分别执行不同的显示方式。
3、为了确保外部中断信号可靠,可对按键采取软件消抖处理。
实验程序编写:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuint flag=0;uchar a[]={0xe7,0xdb,0xbd,0x7e};uchar LED=0xfe;uint i;void delay(unsigned int x) //定义延时函数{uchar i;while(x--){for(i=0;i<125;i++) //通过循环实现延迟功能{;}}}void intersvr0(void) interrupt 0 using 1 //INTO中断服务程序{flag=flag+1;if (flag>=3)flag=0;}void main(void){P0=0x00; //初始化p0口保持LED全亮EA=1; //开启中断总控制位IT0=1; //开启外部中断0控制位,采用边沿触发EX0=1; //允许中断0中断while(1){if (flag==0){P0=0x01;{LED=_crol_(LED,1);P0=LED;delay(500);}}if (flag==1){P0=0x80;{LED=_cror_(LED,1); P0=LED;delay(500);}}if (flag==2){{for (i=0;i<3;i++){LED=a[i];P0=LED;delay(500);P0=0xff;}}}}; //判断是否有按键按下,若有按键按下执行中断服务程序}实验结果:当运行后,通过按动一个键,彩灯在左移,右移和自定义花样(查表法)三种闪亮方式之间顺序切换。
实验四—— LED灯和数码显示器的中断控制

实验课程:单片机原理及应用实验名称: 实验四—— LED灯和数码显示器的中断控制实验日期: 2013 年 4 月 11 日一、实验目的掌握外部中断的工作原理,学会中断程序设计。
二、实验内容1、按图绘制实验四电路原理图:2、采用外部中断原理编程,按键K1、K2均设置为下降沿触发方式,且为自然优先级:3、编写实验四C51程序,实现如下功能:K1对应于D1状态反转: K2对应于0 F间的数码管加一计数显示:3、观察仿真结果,完成实验报告。
三、实验要求提交的实验报告中应包括:电路原理图,外部中断工作原理阐述,源程序, 运行效果图,实验小结。
提交实验报告的电子邮件主题及存盘1、电路原理图(含电路分析)图1 实验原理图电路分析:图1为实验原理图。
电路由80C51芯片,两个开关K1、K2,电阻,LED灯,LED显示器组成。
其中LED显示器接在P2.0~P2.6上并采用共阴极接法,上拉电阻及LED灯接在P0.2,因为P0口内部没有上拉电阻,为使漏极开路有效,必须通过外接上拉电阻与电源连通。
K1、K2分别接INT0:P3.2)和INT1:P3.3)引脚,公共端接地,单击后可产生下降沿脉冲:D1接P0.4引脚,高电平驱动 ,通过上拉电阻接电源:共阴极数码管LED1接P2口,静态显示。
2、外部中断工作原理阐述:以K1为例)当K1按下后,外部中断信号由INT0引脚传送进来。
外部中断电源可以分为两种控制方式,即电位触发式和下降沿触发式,试验中使用的是脉冲触发,即下降沿出发。
下降沿中断方式是INT0引脚由1变化到0的瞬间产生中断,而此时IE0置1,工作标志设定,此工作标志会一直保留着,知道执行完中断服务程序后才会清除。
K1接于端口P3.2,按压后的电平负跳变可分别产生INT0中断请求。
INT0中断响应后取端口P0.4电平,使指示灯D1的状态反转。
3、C51程序:含流程图与注释语句)程序流程图如图2图2 程序流程图C51程序:#include<reg51.h>charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5 e, 0x79,0x71}; //定义字符型数组变量led_mode,并初始化为字符0~F的共阴极显示码sbit P0_4=P0^4; //定义P0.4口为可位寻址型变量P04int count=0; //定义字符型计数器变量count:并初始化为0int0_key() interrupt 0{ //定义K1的中断函数int0_keyP0_4=!P0_4; //取反P04}int1_key() interrupt 2 { //定义K2的中断函数int1_keycount++; //计数变量count增1if(count>0x0f) //如果count值超过0x0f:则count恢复0值count=0;P2=led_mod[count]; //P2口输出count值的显示码}void main() //定义主函数{IT0=1;EX0=1;EA=1; //设置脉冲触发方式:外部中断允许:总终端允许 IT1=1;EX1=1;P0_4=0; //P0.4灭灯P2=0x3f; //P2口显示字符“0”while(1); //程序原地循环}4、仿真运行效果图3为仿真运行效果图。
实验四led灯和数码显示器的中断控制

实验四LED灯和数码显示器的中断控制一、实验目的:掌握外部中断的工作原理,熟悉中断编程及Keil平台软件调试方法。
二、实验原理:实验电路如图A.53所示。
K1和K2分别接于端口P3.2和P3.3,按压后的电平负跳变可分别产生INT0中断请求和INT1中断请求。
INT0中断响应后取端口P0.4电平,使指示灯D1的状态反转,INT1中断响应后使计数值增1并送给数码管LED显示。
电路原理图及中断原理分析:按键K1接外部中断0,K2接外部中断1。
P0.4接指示灯D1,P2口接数码管,每按一次K1键电平产生负跳变,INT0中断响应后取端口P0.4电平,D1的状态反转;每按一次K2键产生负跳变,INT1中断响应使计数值增1并使数码管显示该数值,变化范围为0~F。
三、实验步骤:(1)、按照表A.5所示将元件添加到Proteus ISIS对象选择列表中,并仿照图A.53完成电路原理图绘制。
(2)、在Keil中编写C51程序,并使之编译通过。
(3)、在Keil中加载编译后的可执行文件,并控制Proteus中的程序仿真运行。
Category Reference Value Microprocessor ICs U1 80C51Optoelectromics D1 LED-GREENSwitches&Relays K1~K2 BUTTONResistors R1~R2/100 RES Optoelectronics LED 7SEG-COM-CAT-GRN四、实验要求:(1)、主函数在程序初始化完成后进入原地循环状态,等待中断请求。
(2)、两路外部中断均设为下降沿触发方式,且为自然优先级。
(3)、计数变量初值为0,变化范围为0~F。
(4)、实验报告内容包括:电路原理图及分析、中断原理分析,C51源程序(含注释语句),仿真运行截屏图,实验小结。
五、C51源程序如下:#include< reg51.h>char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};char flag;sbit p0_4= P0^4;void delay(unsigned int time){unsigned int j =0;for(;time>0;time--)for(j=0;j<125;j++);}int0_key () interrupt 0{p0_4=!p0_4;}int1_key () interrupt 2{delay(200);P2=led_mod[flag%16];delay(200);flag++;}void main(void) {flag=0;IT0= 1;EX0= 1;EX1= 1;EA= 1;while(1);}六、试验结果:(1)开始运行时如下图:(2)、按键后运行图如下:实验结果分析:由运行结果可以看出,按键K1产生外部中断0控制D1的状态,使指示灯D1由亮到暗一次变化;按键K2产生外部中断1使LED显示0~F不同数值。
STM32定时器中断使LED灯闪烁

STM32定时器中断使LED灯闪烁Stm32共有11个定时器:1.两个高级定时器:TIM1、TIM8-------------------------APB22.四个通用定时器:TIM2~TIM5-------------------------APB13.两个基本定时器:TIM6、TIM7-------------------------APB14.两个看门狗5.一个系统嘀嗒定时器(SyTick)主程序main.c:#include\#include\#include\#include\#include\#include\#inclu de\voidRCC_Configuration(void);voidGPIO_Configuration(void);voi dTIM3_Configuration(void);voidNVIC_Configuration(void);intmain(){SytemInit();RCC_Configuration();GPIO_Configuration();TIM3_Configuration( );NVIC_Configuration();while(1);}voidRCC_Configuration(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1 PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);}voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;GPIO_InitS tructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mod e=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);} voidTIM3_Configuration(void){TIM_TimeBaeInitTypeDefTIM_TimeBaeStructure;TIM_ClearITPendingBit(TIM3,TIM_IT_Update);TIM_TimeBaeStructure.TIM_Period=2000;//频率:72MHz72000000/36000=2000TIM_TimeBaeStructure.TIM_Precaler=35999; //36000-1=35999TIM_TimeBaeStructure.TIM_ClockDiviion=0某0;TIM_TimeBaeStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_ TimeBaeInit(TIM3,&TIM_TimeBaeStructure);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);TIM_Cmd(TIM3,ENABLE) ;}voidNVIC_Configuration(void)//配置中断优先级{NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_ InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NV IC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}中断函数tm32f10某_it.c#include\#include\#include\#include\voidTIM3_IRQHandler(void){TIM_ClearITPendingBit(TIM3,TIM_IT_Update);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==Bit_RESET){GPIO_SetBit(GPIOA,GPIO_Pin_2);}ele{GPIO_ReetBit(GPIOA,GPIO_Pin_2);}}中断函数声明头文件tm32f10某_it.h:#ifndef__STM32F10某_IT_H#define__STM32F10某_IT_HvoidNMIE某ception(void);voidHardFaultE某ception(void);voidMemManageE某ception(void);voidBuFaultE某ception(void);voidUageFaultE某ception(void);voidDebugMonitor(void);voidSVCHandler(void);voidPe ndSVC(void);voidSyTickHandler(void);voidWWDG_IRQHandler(void);voidPVD_IRQHandler(void);voidTAMPE R_IRQHandler(void);voidRTC_IRQHandler(void);voidFLASH_IRQHandler (void);voidRCC_IRQHandler(void);voidE某TI0_IRQHandler(void);voidE某TI1_IRQHandler(void);voidE某TI2_IRQHandler(void);voidE某TI3_IRQHandler(void);voidE某TI4_IRQHandler(void);voidDMA1_Channel1_IRQHandler(void);voidDMA1_Channel2_IRQHand ler(void);voidDMA1_Channel3_IRQHandler(void);voidDMA1_Channel4_I RQHandler(void);voidDMA1_Channel5_IRQHandler(void);voidDMA1_Channel6_IRQHandler(void);voidDMA1_Channel7_IRQHandler(void);voidADC 1_2_IRQHandler(void);voidUSB_HP_CAN_T某_IRQHandler(void);voidUSB_LP_CAN_R某0_IRQHandler(void);voidCAN_R某1_IRQHandler(void);voidCAN_SCE_IRQHandler(void);voidE某TI9_5_IRQHandler(void);voidTIM1_BRK_IRQHandler(void);voidTIM1_UP _IRQHandler(void);voidTIM1_TRG_COM_IRQHandler(void);voidTIM1_CC_IRQHandler(voi d);voidTIM2_IRQHandler(void);voidTIM3_IRQHandler(void);voidTIM4_ IRQHandler(void);voidI2C1_EV_IRQHandler(void);voidI2C1_ER_IRQHan dler(void);voidI2C2_EV_IRQHandler(void);voidI2C2_ER_IRQHandler(v oid);voidSPI1_IRQHandler(void);voidSPI2_IRQHandler(void);voidUSA RT1_IRQHandler(void);voidUSART2_IRQHandler(void);voidUSART3_IRQH andler(void);voidE某TI15_10_IRQHandler(void);voidRTCAlarm_IRQHandler(void);voidUSBWa keUp_IRQHandler(void);voidTIM8_BRK_IRQHandler(void);voidTIM8_UP_ IRQHandler(void);voidTIM8_TRG_COM_IRQHandler(void);voidTIM8_CC_IRQHandler(voi d);voidADC3_IRQHandler(void);voidFSMC_IRQHandler(void);voidSDIO_ IRQHandler(void);voidTIM5_IRQHandler(void);voidSPI3_IRQHandler(v oid);voidUART4_IRQHandler(void);voidUART5_IRQHandler(void);voidT IM6_IRQHandler(void);voidTIM7_IRQHandler(void);voidDMA2_Channel1_IRQHandler(void);voidDMA2_Channel2_IRQHand ler(void);voidDMA2_Channel3_IRQHandler(void);voidDMA2_Channel4_5 _IRQHandler(void);#endif/某__STM32F10某_IT_H某/。
单片机实验――利用中断控制LED灯(精)

单片机实验——利用中断控制LED灯1.实验目的(1掌握单片机中断的基本原理。
(2掌握单片机中断程序的编制方法。
2.预习要点(1单片机中断基本原理(2中断程序编制方法3.实验设备计算机、单片机实验箱、信号发生器。
4.实验内容基本要求:将信号发生器输出的脉冲信号连接到CPU的INT0上,将CPU的P1.0到P1.7和八个LED连接,脉冲信号为5V、100Hz,每输入一百个脉冲LED灯亮一次,并且LED灯顺序循环移位一次,形成跑马灯。
扩展要求:提高输入脉冲频率,但跑马灯的显示频率不变。
实验4ORG 0000HAJMP MAIN;******************************************;中断子程序入口地址ORG 0003HLJMP EXINT0;******************************************;主程序ORG 0030HMAIN:MOV SP,#70HSETB IT0 ;设置为下降沿触发SETB EX0 ;开INT0的中断开关SETB EA ;开总中断开关MOV R0,#01H ;只让一盏灯亮,R0赋给P1口MOV R3,#00H ;R3用来记中断次数MOV A,R0MOV P1,AHERE:SJMP HERE ;死循环,还有另外一种形式是SJMP $ ;******************************************;外中断0服务程序EXINT0:INC R3 ;每来一次中断R3自加1CJNE R3,#100,NEXT ;当来了100次中断之后,R3清零,然后P1口的MOV R3,#00H ;数左移一位,也就是让下一个LED亮MOV A,R0RL AMOV P1,AMOV R0,A ;保存左移之后的结果NEXT:RETI;******************************************END实验4扩展ORG 0000HAJMP MAIN;******************************************;中断入口地址ORG 0003HLJMP EXINT0;******************************************;主程序ORG 0030HMAIN:MOV SP,#70H;初始化外中断0SETB IT0SETB EX0SETB EA;初始化8155MOV DPTR,#0100HMOV A,#03HMOVX @DPTR,A;显示缓存区MOV 30H,#1MOV 31H,#2MOV 32H,#3MOV 33H,#4MOV 34H,#5MOV 35H,#6MOV 36H,#7MOV 37H,#8MOV 38H,#9 ;这一句后面的CJNE会用到,用来判断1-8是否已经显示完了MOV R2,#00H ;用R2来记中断来的次数MOV 40H,#01H ;用40H存放LED的状态MOV A,40HMOV P1,AMOV R0,#30H ;显示缓存区首地址给R0MOV R4,#0FEH ;字位送R4,因为只需要亮一个数码管,所以选择静态显示,没必要用动态显示LOOP:LCALL DISPLAY ;循环调用显示程序SJMP LOOP;******************************************;中断子程序EXINT0:INC R2CJNE R2,#100,NEXT ;来100次中断之后才进行操作MOV R2,#00HMOV A,40H ;移动LEDRL AMOV P1,AMOV 40H,AINC R0 ;让显示的数+1CJNE @R0,#9,NEXT ;如果到了9就回到1,因为我们只显示1-8 MOV R0,#30HNEXT:RETI;******************************************;显示子程序DISPLAY:MOV DPTR,#0102H ;送字位MOV A,R4MOVX @DPTR,AMOV DPTR,#DTAB ;查表,送字形MOV A,@R0MOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAYLD1:RET;****************************************** ;字形表DTAB:DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH ;0-FDB 77H,7CH,39H,5EH,79HDB 71H;****************************************** ;延时1ms子程序DELAY:MOV R7,#02HDEL1:MOV R6,#0FFHDEL2:DJNZ R6,DEL2DJNZ R7,DEL1RET;****************************************** ENDORG 0000HAJMP MAIN;中断入口地址ORG 0003HLJMP EXINT0;******************主程序ORG 0030HMAIN:MOV SP,#70H;初始化外中断0SETB IT0SETB EX0SETB EA;初始化8155MOV DPTR,#0100HMOV A,#03HMOVX @DPTR,A;显示缓存区MOV 30H,#1MOV 31H,#2MOV 32H,#3MOV 33H,#4MOV 34H,#5MOV 35H,#6MOV 36H,#7MOV 37H,#8MOV 38H,#9MOV 40H,#01H ;用40H存发光二极管的状态MOV R2,#00HMOV A,40HMOV P1,AMOV R0,#30HMOV R4,#0FEHLOOP:LCALL DISPLAY SJMP LOOP;************************* ;中断子程序EXINT0:INC R2CJNE R2,#100,NEXTMOV R2,#00HMOV A,40HRL AMOV P1,AMOV 40H,AINC R0CJNE @R0,#9,NEXT1MOV R0,#30HNEXT1:MOV A,R4RL AMOV R4,ANEXT:RETI;显示子程序DISPLAY:MOV A,R4MOV DPTR,#0102HMOVX @DPTR,AMOV DPTR,#DTABMOV A,@R0MOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAY LD1:RET ;字形表 DTAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH ;延时 1ms 子程序 DELAY: MOVR7,#02H DEL1:MOV R6,#0FFH DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET END ;说明: ;R4 是保存数码管字位 ;R3 ;R2 是保存中断次数满 100 清 0 ;R1 ;R0 是保存数码管的字型实验 5(1 ORG 0000H SJMPMAIN ;****************************************8*********** ;中断入口地址ORG 000BH LJMP T0INT ;************************************************ ;主程序 ORG 0030H MAIN:MOV SP,#70H MOV TMOD,#01H ;T0 选择方式 1,16 位定时器 MOV TH0,#0F6H ;#9EH ;因为用示波器观察 20HZ 的方波不易观察,频率太低了,所以我换成了 MOV TL0,#3CH ;#58H ;200HZ 的,原理都是一样的,这样只是为了让波形更容易观察,后者是 20HZ 的初值 SETB EA ;开总中断 SETB ET0 ;开定时器 0 中断 SETB TR0 ;启动定时器 0 SJMP$ ;死循环 ;********************************************************;定时器 0 中断子程序 (25ms 2.5ms 来一次中断 T0INT:MOV TH0,#0F6H ;#9EH ;重新赋初值 MOV TL0,#3CH ;#58H CPL P1.1 ;改变电平RETI ;******************************************************。
STM32外部中断(实现按键控制LED)

STM32外部中断(实现按键控制LED)引⾔“中断” 这个概念,指的是在单⽚机运⾏过程中,在指定条件发⽣时,停下当前所有⼯作,去执⾏中断处理函数内的内容。
就像我们在教室上课时,突然地震了,不出意外的话我们都需要停下⼿中学习任务,去进⾏⼀系列的避险动作。
这⼀节我们通过中断的⽅式,完成通过按键控制LED亮灭的操作。
准备环节中断相关知识STM32的中断控制器⽀持19个外部中断/事件请求。
这⼗九个外部中断为:线0~15:对应外部IO⼝的输⼊中断。
线16:连接到PVD输出。
线17:连接到连接到RTC时钟事件。
线18:连接到USB唤醒事件。
配置使⽤时,需要先将IO⼝与相应中断线的映射关系建⽴,再对其进⾏使⽤。
那映射关系是怎样的呢?GPIOx.0 ~ GPIOx.15(x = A,B,C,D,E,F,G)分别对应中断线0 ~ 15配置GPIO与中断线关系的函数是void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)eg:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);把GPIO作为EXTI外部中断时,需要打开AFIO时钟。
APIO时钟何时需要打开,具体可以参考这篇⽂章:嵌套向量中断控制器(NVIC)初始化完线上中断和中断条件等内容,还需要配置中断分组。
配置中断分组之前,我们需要先确定如何进⾏分组。
这⾥就需要⽤到NVIC。
关于NVIC的具体内容可查看这篇博⽂:。
编码环节步骤初始化IO⼝输⼊开启AFIO时钟设置IO⼝与中断线的映射关系初始化线上中断、设置触发条件等配置中断分组,并使能中断编写中断服务函数main.c(以下内容均省略头⽂件)int main(void){delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC终端分组2LED_Init();KEY_Init();EXTIX_Init(); //外部中断初始化LED1 = 0;}exti.h#ifndef __EXTI_H#define __EXIT_H#include "sys.h"void EXTIX_Init(void); //外部中断初始化#endifexti.cvoid EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure; //外部中断结构体初始化NVIC_InitTypeDef NVIC_InitStructure; //中断分组结构体初始化KEY_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //映射IO⼝与中断线//以下为配置中断线初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线EXTI_InitStructure.EXTI_Line = EXTI_Line0; //中断线标号EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //触发⽅式EXTI_Init(&EXTI_InitStructure);//以下为中断优先级的配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //声明使⽤的中断是哪⼀个NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //设置抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //设置⼦优先级为3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure);}void EXTI0_IRQHandler(void) //中断服务函数{delay_ms(10); //软件去抖if(WK_UP==1){LED0 = !LED0;LED1 = !LED1;}EXTI_ClearITPendingBit(EXTI_Line0); //清除中断位}补充中断服务函数中断服务函数的名称是固定的,写错会导致⽆法中断。
51单片机中断控制LED

单片机作业题目要求:设计这样一个系统:在一个51单片机最小系统板上,P1口低四位接四个四角按键,高四位接四个LED灯。
按键中断作为总中断,当接中断的按键按下后,所有灯均可按照对应的按键进行点亮。
当没有中断按下时,无论怎么按接在P1口低四位的按键,均不能是按键点亮。
实现步骤:第一:电路搭建:电路搭建说明:1.采用AT89C52单片机,DIP40封装。
2.选用12M,并使晶振尽可能接近单片机,采用22pf的电容接在晶振两边并接地,使晶振更容易起振。
3.标号为D18的LED是中断触发指示灯,一旦中断触发,D18会一直亮着。
没有中断触发时会一直灭着。
4.key1,key2,key3,key4分别控制D1,D2,D3,D4,D5.5.D5为复位指示灯,当复位按键按下时,D5亮。
反之灭。
第二:程序实现:本程序十分简单,秉着杜绝抄袭,自助设计的理念,本程序完全有本人设计完成。
没有采用老师讲解的例程。
程序的注释已经将程序称述的很明白,现做简要说明:本人将按键查询部分都放在中断处理函数中处理。
当中断触发按键按下时,D18亮,程序进入中断函数,开始不断查询按键值,并点亮相应led.。
这样的程序对CPU的占有率较高,但由于这样写代码更加简单明了,有由于题目对cpu占有率的并没有明确要求,本着开发周期尽可能短的原则,本程序选择了简单方案。
现将代码复制如下:将KEIL与PROTEUS联调,调试结果如下:1.启动程序:,可以看到图中三角符号变绿。
此时:此时,图中所有led灭,无现象。
1.此时按下任意按键,比如key1,key2两个(为了方便截图,直接将开关用导线短路):现象如下:可以看到,并没有认可指示灯亮。
2.按复位按键观察是否正常(为了方便截图,直接将开关用导线短路):可以看到,红色的D5,复位指示灯变红。
复位电路正常工作。
3.按触发中断按键,观察D18会不会一直亮,即,只要按一下触发中断按键,D18会长亮。
明显看到,即使中断触发按键已经松开,D18,依旧亮着。
中断控制LED流水灯

硬件消抖用RS触发器 软件消抖
如果按键较多,常用软件方法去抖,即检 测出键闭合后执行一个延时程序,5ms~ 10ms的延时,让前沿抖动消失后再一次检 测键的状态,如果仍保持闭合状态电平, 则确认为真正有键按下。当检测到按键释 放后,也要给5ms~10ms的延时,待后沿抖 动消失后才能转入该键的处理程序。
IT0 = 1; EX0 = 1; EA = 1;
//外部中断输入下降沿有效 //允许X0中断 //开放总中断
temp = 0xfe; P1 = temp; while(1);
} void T0_int(void) interrupt 1 //每隔10ms执行一次 { TH0 = (65536 - 10000) / 256; //定时10ms@12MHz TL0 = (65536 - 10000) % 256; i++;
D1
D2
D3
D4
D5
D6
D7
D8
18
XTAL2
LED-YELLOW LED-YELLOW LED-YELLOW LED-YELLOW LED-YELLOW LED-YELLOW LED-YELLOW LED-YELLOW 9 RST
29 30 31
PSEN ALE EA
R1
PULLUP
RN1
1 2 3 4 5 6 7 8 300 16 15 14 13 12 11 10 9 1 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51
//设定T0定时方式1 //定时10ms@12MHz
STM32定时器中断使LED灯闪烁

STM32定时器中断使LED灯闪烁第一篇:STM32定时器中断使LED灯闪烁STM32定时器中断使LED灯闪烁知识点:Stm32共有11个定时器:1.两个高级定时器:TIM1、TIM8-------------------------APB22.四个通用定时器:TIM2~TIM5-------------------------APB13.两个基本定时器:TIM6、TIM7-------------------------APB14.两个看门狗5.一个系统嘀嗒定时器(SysTick)主程序main.c: #include “stm32f10x.h” #include “stm32f10x_rcc.h” #include “stm32f10x_gpio.h” #include “stm32f10x_tim.h” #include “stm32f10x_exti.h” #include “system_stm32f10x.h” #includ e “misc.h”void RCC_Configuration(void);void GPIO_Configuration(void);void TIM3_Configuration(void);void NVIC_Configuration(void);int main(){ SystemInit();RCC_Configuration();GPIO_Configuration();TIM3_Configurati on();NVIC_Configuration();while(1);}voidRCC_Configuration(void){ RCC_APB2PeriphClockCmd(RCC_APB2 Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Pe riph_TIM3,ENABLE);}void GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}void TIM3_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ClearITPendingBit(TIM3, TIM_IT_Update);TIM_TimeBaseStructure.TIM_Period = 2000;//频率:72MHz 72000000/36000=2000 TIM_TimeBaseStructure.TIM_Prescaler = 35999;//36000-1=35999TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);TIM_Cmd(TIM3,ENABLE);}void NVIC_Configuration(void)//配置中断优先级{ NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio rity = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);} 中断函数stm32f10x_it.c #include “..includestm32f10x.h” #include “..includestm32f10x_it.h” #include “..includestm32f10x_gpio.h” #include “..includestm32f10x_tim.h”void TIM3_IRQHandler(void){ TIM_ClearITPendingBit(TIM3, TIM_IT_Update);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==Bit_RESET){ GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{ GPIO_ResetBits(GPIOA,G PIO_Pin_2);} } 中断函数声明头文件stm32f10x_it.h:#ifndef __STM32F10x_IT_H #define __STM32F10x_IT_H void NMIException(void);void HardFaultException(void);voidMemManageException(void);void BusFaultException(void);void UsageFaultException(void);void DebugMonitor(void);void SVCHandler(void);void PendSVC(void);void SysTickHandler(void);void WWDG_IRQHandler(void);void PVD_IRQHandler(void);void TAMPER_IRQHandler(void);void RTC_IRQHandler(void);void FLASH_IRQHandler(void);void RCC_IRQHandler(void);void EXTI0_IRQHandler(void);void EXTI1_IRQHandler(void);void EXTI2_IRQHandler(void);void EXTI3_IRQHandler(void);void EXTI4_IRQHandler(void);void DMA1_Channel1_IRQHandler(void);voidDMA1_Channel2_IRQHandler(void);voidDMA1_Channel3_IRQHandler(void);voidDMA1_Channel4_IRQHandler(void);voidDMA1_Channel5_IRQHandler(void);voidDMA1_Channel6_IRQHandler(void);voidDMA1_Channel7_IRQHandler(void);voidADC1_2_IRQHandler(void);voidUSB_HP_CAN_TX_IRQHandler(void);voidUSB_LP_CAN_RX0_IRQHandler(void);voidCAN_RX1_IRQHandler(void);voidCAN_SCE_IRQHandler(void);void EXTI9_5_IRQHandler(void);void TIM1_BRK_IRQHandler(void);voidTIM1_UP_IRQHandler(void);voidTIM1_TRG_COM_IRQHandler(void);voidTIM1_CC_IRQHandler(void);void TIM2_IRQHandler(void);void TIM3_IRQHandler(void);void TIM4_IRQHandler(void);void I2C1_EV_IRQHandler(void);void I2C1_ER_IRQHandler(void);void I2C2_EV_IRQHandler(void);void I2C2_ER_IRQHandler(void);void SPI1_IRQHandler(void);void SPI2_IRQHandler(void);void USART1_IRQHandler(void);void USART2_IRQHandler(void);voidUSART3_IRQHandler(void);voidEXTI15_10_IRQHandler(void);voidRTCAlarm_IRQHandler(void);voidUSBWakeUp_IRQHandler(void);voidTIM8_BRK_IRQHandler(void);voidTIM8_UP_IRQHandler(void);voidTIM8_TRG_COM_IRQHandler(void);voidTIM8_CC_IRQHandler(void);void ADC3_IRQHandler(void);void FSMC_IRQHandler(void);void SDIO_IRQHandler(void);void TIM5_IRQHandler(void);void SPI3_IRQHandler(void);void UART4_IRQHandler(void);void UART5_IRQHandler(void);void TIM6_IRQHandler(void);void TIM7_IRQHandler(void);void DMA2_Channel1_IRQHandler(void);voidDMA2_Channel2_IRQHandler(void);voidDMA2_Channel3_IRQHandler(void);voidDMA2_Channel4_5_IRQHandler(void);#endif /* __STM32F10x_IT_H */第二篇:LED灯闪烁原因分析LED灯闪烁原因分析(转)闪烁有很多原因,但最终表现就是电子变压器没有真正的进入连续工作状态.从电子变压器的原理可以分析的出大部分常见的电子变压器是电流正反馈驱动的形式.也就是说,当负载小到一定值的时候,ET将得不到足够的反馈能量而停振.这也是很多电子变压器出厂时在外壳上印上额定负载“xxW~xxW”的原因.当然LED要恒流驱动,又要节能.恒流驱动一般表现为容性和感性.当驱动电路的滤波电容电压为0V时,接通电子变压器的瞬间,将会对电容大电流充电,此时ET工作.随着电容电压升高,充电电流减小.此时ET得到的反馈电流不足维持其工作而停止.这时电容开始放电,当电容电压够底,又刚好在电子变压器触发脉冲到来时,电子变压器才又重新工作.然而电子变压器前端一般没有滤波电容,所以在AC输入的正弦波过零点时电子变压器一定会关断^由于不同的电子变压器的参数及触发时间和反馈能量不相同.导致目前的驱动不能适应多款电子变压器的原因.要想适应多款的变压器需要处理变压器的过流保护问题,如何让小的负载连续工作问题,如何大电流持续吸取变压器能量(维持变压器在触发后连续工作),如何在电子变压器过“0”点关断到重新启动过程中维持负载连续工作?目前几种做法:BUCK架构特点:低压大电流典型BUCK=>1*3W LED发热大,光效底闪烁几率降低.BUCK架构特点:高电压小电流典型BUCK=>3*1W LED 发热小,电压利用率底闪烁几率很高BUCK-BOOST架构高压小电流典型BUCK-BOOST=>3*1W~9*1W 热量稍大,电压利用率高.闪烁机率很底.由此几种架构来看,站在推广和应用层面考虑,最有优势的还是BUCK-BOOST的架构.(转自klsen)第三篇:关于定时器中断使用【学习心得】关于定时器中断的使用看了这么久,第一次发帖,做点贡献。
stm32中断串口控制LED灯

stm32中断串口控制LED灯stm32 中断串口控制LED灯#include "stm32f10x.h"#include "usart.h"#include "led.h"#include <stdio.h>/************************************************************** ************************************************************************ ********/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);//void delay(vu32 nCount) //软件延时// {// for(; nCount != 0; nCount--);// }/************************************************************** ************************************************************************ *********/main(){u8 a;RCC_Configuration();//系统时钟配置NVIC_Configuration();//中断配置GPIO_Configuration();//GPIO口配置LED_Init();while(1){while(usart_rx_sta&0x80){a=usart_rx_buf[1];if(a == 0x01){GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_SET);GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET);// usart_rx_sta=0;// usart_rx_time=0;// usart_tx_buf[0]=0x01; //将接收到的串口数据,发送出// usart_tx_time=1;// USART1_SEND();printf("绿灯灭,红灯亮\n");usart_rx_buf[1]=0x00;}if(a == 0x02){GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_RESET);GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET);// usart_rx_sta=0;// usart_rx_time=0;// usart_tx_buf[0]=0x02; //将接收到的串口数据,发送出// usart_tx_time=1;// USART1_SEND();printf("绿灯亮,红灯灭\n");usart_rx_buf[1]=0x00;}else{usart_rx_sta=0;usart_rx_time=0;}}}}//发送AA 01 AB BB(注:串口助手发使用16进制);绿灯灭,红灯亮(注:串口助手收不使用16进制)//发送AA 02 A8 BB(注:串口助手发使用16进制);绿灯亮,红灯灭(注:串口助手收不使用16进制)/************************************************************** ****************************************************************************** **************/注:使用的ALIENTEK开发板,参考正点原子部分子程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验——利用中断控制LED灯
1.实验目的
(1掌握单片机中断的基本原理。
(2掌握单片机中断程序的编制方法。
2.预习要点
(1单片机中断基本原理
(2中断程序编制方法
3.实验设备
计算机、单片机实验箱、信号发生器。
4.实验内容
基本要求:
将信号发生器输出的脉冲信号连接到CPU的INT0上,将CPU的P1.0到P1.7和八个LED连接,脉冲信号为5V、100Hz,每输入一百个脉冲LED灯亮一次,并且LED灯顺序循环移位一次,形成跑马灯。
扩展要求:
提高输入脉冲频率,但跑马灯的显示频率不变。
实验4
ORG 0000H
AJMP MAIN
;******************************************
;中断子程序入口地址
ORG 0003H
LJMP EXINT0
;******************************************
;主程序
ORG 0030H
MAIN:MOV SP,#70H
SETB IT0 ;设置为下降沿触发
SETB EX0 ;开INT0的中断开关
SETB EA ;开总中断开关
MOV R0,#01H ;只让一盏灯亮,R0赋给P1口
MOV R3,#00H ;R3用来记中断次数
MOV A,R0
MOV P1,A
HERE:SJMP HERE ;死循环,还有另外一种形式是SJMP $ ;******************************************
;外中断0服务程序
EXINT0:INC R3 ;每来一次中断R3自加1
CJNE R3,#100,NEXT ;当来了100次中断之后,R3清零,然后P1口的MOV R3,#00H ;数左移一位,也就是让下一个LED亮
MOV A,R0
RL A
MOV P1,A
MOV R0,A ;保存左移之后的结果
NEXT:RETI
;******************************************
END
实验4扩展
ORG 0000H
AJMP MAIN
;******************************************
;中断入口地址
ORG 0003H
LJMP EXINT0
;******************************************
;主程序
ORG 0030H
MAIN:MOV SP,#70H
;初始化外中断0
SETB IT0
SETB EX0
SETB EA
;初始化8155
MOV DPTR,#0100H
MOV A,#03H
MOVX @DPTR,A
;显示缓存区
MOV 30H,#1
MOV 31H,#2
MOV 32H,#3
MOV 33H,#4
MOV 34H,#5
MOV 35H,#6
MOV 36H,#7
MOV 37H,#8
MOV 38H,#9 ;这一句后面的CJNE会用到,用来判断1-8是否已经显示完了
MOV R2,#00H ;用R2来记中断来的次数
MOV 40H,#01H ;用40H存放LED的状态
MOV A,40H
MOV P1,A
MOV R0,#30H ;显示缓存区首地址给R0
MOV R4,#0FEH ;字位送R4,因为只需要亮一个数码管,所以选择静态显示,没必要用动态显示
LOOP:LCALL DISPLAY ;循环调用显示程序
SJMP LOOP
;******************************************
;中断子程序
EXINT0:INC R2
CJNE R2,#100,NEXT ;来100次中断之后才进行操作
MOV R2,#00H
MOV A,40H ;移动LED
RL A
MOV P1,A
MOV 40H,A
INC R0 ;让显示的数+1
CJNE @R0,#9,NEXT ;如果到了9就回到1,因为我们只显示1-8 MOV R0,#30H
NEXT:RETI
;******************************************
;显示子程序
DISPLAY:
MOV DPTR,#0102H ;送字位
MOV A,R4
MOVX @DPTR,A
MOV DPTR,#DTAB ;查表,送字形
MOV A,@R0
MOVC A,@A+DPTR
MOV DPTR,#0101H
MOVX @DPTR,A
LCALL DELAY
LD1:RET
;****************************************** ;字形表DTAB:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH ;0-F
DB 77H,7CH,39H,5EH,79H
DB 71H
;****************************************** ;延时1ms子程序DELAY:
MOV R7,#02H
DEL1:MOV R6,#0FFH
DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET
;****************************************** END
ORG 0000H
AJMP MAIN
;中断入口地址
ORG 0003H
LJMP EXINT0
;******************主程序
ORG 0030H
MAIN:MOV SP,#70H
;初始化外中断0
SETB IT0
SETB EX0
SETB EA
;初始化8155
MOV DPTR,#0100H
MOV A,#03H
MOVX @DPTR,A
;显示缓存区
MOV 30H,#1
MOV 31H,#2
MOV 32H,#3
MOV 33H,#4
MOV 34H,#5
MOV 35H,#6
MOV 36H,#7
MOV 37H,#8
MOV 38H,#9
MOV 40H,#01H ;用40H存发光二极管的状态
MOV R2,#00H
MOV A,40H
MOV P1,A
MOV R0,#30H
MOV R4,#0FEH
LOOP:LCALL DISPLAY SJMP LOOP
;************************* ;中断子程序
EXINT0:INC R2
CJNE R2,#100,NEXT
MOV R2,#00H
MOV A,40H
RL A
MOV P1,A
MOV 40H,A
INC R0
CJNE @R0,#9,NEXT1
MOV R0,#30H
NEXT1:MOV A,R4
RL A
MOV R4,A
NEXT:RETI
;显示子程序
DISPLAY:MOV A,R4
MOV DPTR,#0102H
MOVX @DPTR,A
MOV DPTR,#DTAB
MOV A,@R0
MOVC A,@A+DPTR
MOV DPTR,#0101H
MOVX @DPTR,A
LCALL DELAY LD1:RET ;字形表 DTAB: DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH ;延时 1ms 子程序 DELAY: MOV
R7,#02H DEL1:MOV R6,#0FFH DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET END ;说明: ;R4 是保存数码管字位 ;R3 ;R2 是保存中断次数满 100 清 0 ;R1 ;R0 是保存数码管的字型实验 5(1 ORG 0000H SJMP
MAIN ;****************************************8*********** ;中断入口地址ORG 000BH LJMP T0INT ;************************************************ ;主程序 ORG 0030H MAIN:MOV SP,#70H MOV TMOD,#01H ;T0 选择方式 1,16 位
定时器 MOV TH0,#0F6H ;#9EH ;因为用示波器观察 20HZ 的方波不易观察,频率太低了,所以我换成了 MOV TL0,#3CH ;#58H ;200HZ 的,原理都是一样的,这样只是为了让波形更容易观察,后者是 20HZ 的初值 SETB EA ;开总中断 SETB ET0 ;开定时器 0 中断 SETB TR0 ;启动定时器 0 SJMP$ ;死循
环 ;********************************************************
;定时器 0 中断子程序 (25ms 2.5ms 来一次中断 T0INT:MOV TH0,#0F6H ;#9EH ;重新赋初值 MOV TL0,#3CH ;#58H CPL P1.1 ;改变电平
RETI ;******************************************************。