搜档网
当前位置:搜档网 › STM8L定时中断问题

STM8L定时中断问题

STM8L定时中断问题
STM8L定时中断问题

在系统时钟初始化完成后,再开启外设时钟:

这样可以进中断:

1、初始化系统时钟

/* Select HSI as system clock source */

CLK_DeInit();

CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1 );

CLK_ClockSecuritySystemEnable();

CLK_HSICmd(ENABLE);

2、打开定时器的外设时钟

CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);

3、初始化定时器

Init_TIM2();

这样进不去:

CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE); /* Select HSI as system clock source */

CLK_DeInit();

CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1 );

CLK_ClockSecuritySystemEnable();

CLK_HSICmd(ENABLE);

Init_TIM2();

中断向量表

中断向量表 中断向量表是DSP程序的重要组成部分,当有中断发生并且处于允许状态时,程序指针跳转到中断向量表中对应的中断地址。由于中断服务程序一般较长,通常中断向量表存放的是一个跳转指令,指向实际的中断服务程序。下面是5402中断向量表的一个范例,可以作为模板,使用时稍作修改就行: ***************************************************************** *5402Vectors.asm *完整的5402中断向量表示例 *5402共有30个中断向量,每个向量占4个字的空间。 *使用向量一般用一条跳转指令转到相应中断服务子程序,其余空位用NOP填充*未使用的向量直接用RETE返回,是为了防止意外进入未用中断。 ***************************************************************** .sect ".vectors" ;开始命名段.vecotrs .global CodeStart ;引用程序入口的全局符号定义 …;引用其它中断程序入口的全局符号定义 .align 0x80 ;中断向量表必须对齐128字的页边界 RESET: B CodeStart; Reset中断向量,跳转到程序入口NOP ;用NOP填充表中其余空字 NOP ;B指令占了两个字,所以要填两个NOP NMI: RETE ;不可屏蔽中断 NOP NOP NOP ; 软件中断 SINT17 .space 4*16 ;软件中断使用较少,简单起见用0填充 SINT18 .space 4*16 SINT19 .space 4*16 SINT20 .space 4*16 SINT21 .space 4*16 SINT22 .space 4*16 SINT23 .space 4*16 SINT24 .space 4*16 SINT25 .space 4*16 SINT26 .space 4*16 SINT27 .space 4*16 SINT28 .space 4*16 SINT29 .space 4*16 SINT30 .space 4*16 INT0: RETE ;外部中断INT0 NOP NOP NOP

定时器中断程序设计实验

实验一定时器/中断程序设计实验 一、实验目的 1、掌握定时器/中断的工作原理。 2、学习单片机定时器/中断的应用设计和调试 二、实验仪器和设备 1、普中科技单片机开发板; 2、Keil uVision4 程序开发平台; 3、PZ-ISP 普中自动下载软件。 三、实验原理 805l 单片机内部有两个 16 位可编程定时/计数器,记为 T0 和 Tl。8052 单片机内除了 T0 和 T1 之外,还有第三个 16 位的定时器/计数器,记为 T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。定时器 T0 由特殊功能寄存器 TL0 和 TH0 组成,定时器 Tl 由特殊功能寄存器 TLl 和 TH1 组成。定时器的工作方式由特殊功能寄存器 TMOD 编程决定,定时器的运行控制由特殊功能寄存器 TCON 编程控制。T0、T1 在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU 转向中断处理程序,从而完成某种定时控制功能。T0、T1 用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由 P3 口的 P3.4(或 P3.5)即 T0(或 T1)引脚输入。 方式控制寄存器 TMOD 的控制字格式如下: 低 4 位为 T0 的控制字,高 4 位为 T1 的控制字。GATE 为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l 时,定时器/计数器的计数受外部引脚输入电平的控制。由由运行控制位 TRX (X=0,1)=1 和外中断引脚(0INT 或 1INT)上的高电平共同来启动定时器/计数器运行;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制,仅由 TRX(X=0,1)=1 来启动定时器/计数器运行。 C/-T 为方式选择位。C/-T=0 为定时器方式,采用单片机内部振荡脉冲的 12 分频信号作为时钟计时脉冲,若采用 12MHz 的振荡器,则定时器的计数频率为 1MHZ,从定时器的计数值便可求得定时的时间。 C/-T=1 为计数器方式。采用外部引脚(T0 为 P3.4,Tl 为 P3.5)的输入脉冲作为计数脉冲,当 T0(或 T1)输入信号发生从高到低的负跳变时,计数器加 1。最高计数频率为单片机时钟频率的 1/24。 M1、M0 二位的状态确定了定时器的工作方式,详见表。

嵌入式定时器基本功能(定时器中断)c语言代码

定时器基本功能实验(定时器中断) 1.实验内容 使用定时器0 实现1 秒定时,控制蜂鸣器蜂鸣。采用中断方式实现定时控制。 备注:EasyARM2131实验板上的系统时钟默认为11.0592MHz;系统中已定义了符号常量Fpclk = 11059200 ; 2.实验步骤 ①启动ADS 1.2,使用ARM Executable Image for lpc2131工程模板建立一个工程 TimeOut_C。 ②在user 组中的main.c 中编写主程序代码。 ③主程序中使用IRQEnable( )使能IRQ 中断。 ④选用DebugInExram 生成目标,然后编译连接工程。 ⑤将LPC2131实验板上的Beep跳线短接到P0.7。 ⑥选择【Project】->【Debug】,启动AXD 进行JTAG 仿真调试。 ⑦全速运行程序,蜂鸣器会响一秒,停一秒,然后再响一秒……依次循环。 3.实验参考程序 程序清单错误!文档中没有指定样式的文字。-1 定时器实验参考程序#include "config.h" #define BEEP 1 << 7 /* P0.7控制BEEP,低电平蜂鸣 */ /***************************************************************************************** ** 函数名称:IRQ_Timer0() ** 函数功能:定时器0中断服务程序,取反LED9控制口。 ** 入口参数:无 ** 出口参数:无 ****************************************************************************************** */ void __irq IRQ_Timer0 (void) { if ((IO0SET & BEEP) == 0) IO0SET = BEEP; /* 关闭BEEP */ else IO0CLR = BEEP; T0IR = 0x01; /* 清除中断标志*/ VICVectAddr = 0x00; /* 通知VIC中断处理结束*/ } /* ***************************************************************************************** ** 函数名称:main() ** 函数功能:使用定时器实现1秒钟定时,控制LED9闪烁。中断方式。

定时器控制流水灯

成绩 信息与通信工程学院实验报告 (操作性实验) 课程名称:微机原理与微控制器应用 实验题目:c51单片机的定时器实验指导教师: 班级: 学号:学生姓名: 一、实验目的和任务 1.掌握定时器中断的编程方法。 2.掌握keil C51集成开发环境在硬件仿真条件下各参数的设置。 二、实验仪器及器件 硬件:电脑一台、微机原理与单片机试验箱:51开发板、开关及LED显示单元、导线若干 软件:keil uVision4 三、实验内容及电路图 利用实验板上的八个LED灯作显示,利用定时器中断编写中断一次为50ms的定时程序,控制单片机定时器进行定时,总定时时间为0.75ms。

四、流程图与程序 #include "SST89x5x4.h" #include int temp=0x01,num=0; void T0Int() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; num++; if(num==15) { num=0; P1=_crol_(temp,1);

temp=P1; } } void main() { EA=1; ET0=1; TMOD=0X01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; TR0=1; while(1); } 五、实验结果 八个LED灯由左往右依次亮起,并且每个LED灯点亮时间大约为0.75m。

六、实验数据分析及处理 从实验现象来看,LED灯从左到右依次点亮,符合实验要求,说明实验操作正确,实验结果正确。 七、实验结论与感悟(或讨论)

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

关于STM32中断向量表的位置 、重定向问题

关于STM32 中断向量表的位置、重定向问题 首先我们需要跳到main 函数,这个就不多说了。那么,中断发生后,又 是怎么跑到中断入口地址的呢?从stm32f10x.s 可以看到,已经定义好了一大堆 的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地 址,例如:AREA RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE 区(假设STM32 从FLASH 启动,则此中断向量表起始地址即为 0x8000000)EXPORT __Vectors IMPORT OS_CPU_SysTickHandler IMPORT OS_CPU_PendSVHandler__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler 这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU 找入口地址就靠它了,bin 文件开头就是他们的 地址,参考手册RM0008 的10.1.2 节可以看到排列。我们再结合CORTEX-M3 的特性,他上电后根据boot 引脚来决定PC 位置,比如boot 设置为flash 启动, 则启动后PC 跳到0x08000000。此时CPU 会先取2 个地址,第一个是栈顶地址,第二个是复位异常地址,故有了上面的写法,这样就跳到reset_handler。那么 这个reset_handler 的实际地址是多少.?下面的一堆例如Nmi_handler 地址又是 多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。1、我们可以通 过反向来得知这些入口地址,查看工程下的map 文件就可以看到了,这个地址 跟keil 里面设置的target->flash 起始地址息息相关,实际上我们不太需要关心, 让编译器分配,中断向量表放的就是他们的地址。2、对比ARM7/ARM9 内核,Cortex-M3 内核则是固定了中断向量表的位置而起始地址是可变化的。3、进到

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

定时中断流水灯程序电路图

实验设计 题目:LED流水灯设计 学生: 学号: 院(系):机电工程学院 专业: 指导教师: 2012年3月20日

1.设计目的: 1、通过本实验的设计初步了解单片机工作原理和各功能端口的相关设置; 2、掌握PROTEUS软件的安装和配置过程; 3、学会绘制电路原理图; 4、了解装载程序和调试; 5、PROTEUS VSM 与uVision3的联调; 6、用单片机仿真软件,并进行调试; 7、掌握单片机相应的编程步骤,了解走马灯相关的工作流程; 8、熟悉KEIL\PROTEUS等相关软件的使用。 2.任务要求:利用汇编语言(或C语言),实现8个单色LED灯的左、右循环显示,程序中运用定时中断。 3. 硬件电路图:

4.软件程序清单: ORG 0000H ;起始地址 LJMP MAIN ;转入主函数 ORG 000BH ;定时中断0入口地址 LJMP PE ;转入中断程序 ORG 0100H ;主程序入口 MAIN: ; MOV TMOD,#01H ;设置定时中断0的工作方式 MOV TL0,#0EFH ;添加初值 MOV TH0,#0D8H ; SETB EA ;开总中断 SETB ET0 ;开定时中断 SETB TR0 ;开始计时 MOV P0,#00H ;点亮所有灯 MOV R0,#0C8H ;设定定时次数,两百次10ms*200=2s QUAN: ; MOV A,R0 ; JNZ QUAN ; MOV A,#0FEH ; PAOMA: ;点亮第一个灯 MOV P0,A ; MOV R0,#32H ;设定定时次数50次。10ms*50=0.5s HJ: CJNE R0,#00H,HJ ;定时器重复50次,延时0.5秒 RL A ;循环左移进行跑马灯 LJMP PAOMA ; PE: ;定时器 MOV TL0,#0EFH ; MOV TH0,#0D8H ; DEC R0 ;用R0决定定时次数 RETI ; END

DSP中断向量表和中断子向量表(精)

DSP中断向量表和中断子向量表 DSP中断向量表和中断子向量表 类别:单片机/DSP 本案例在介绍数字PID控制器和模糊Pl控制器的DSP应用程序设计的同时,还介绍TI公司C2000系列DSP芯片开发时,中断向量表和中断子向量表的编写和配置方法。一个实用DSP程序除包括主程序和系统初始化程序以及存储器配置文件之外,还需要有中断向量表和中断子向量表程序,对于一个DSP控制器来说,中断的使用和管理是不可缺少的。在系统中,控制器的作用就是控制整个系统实时、有序地按照程序的要求运行,而DSP只有一个CPU,所以只有L个进程,当外部设各要求DSP控制时,就采用中断的方式,DSP根据中断的优先级,通过响应中断并执行中断服务子程序(ISR)来对外部设各进行控制。一个正确的中断向量表和中断子向量表程序能够使系统正常运行,并能保证在系统不正常时自动恢复到程序初始化的状态,防止系统崩溃,提高工业控制的鲁棒性。DSP LF2407有两级中断,第一级中断是CPU中断,共6个;第二级中断是外围设各中断,共46个。由外设中断扩展控制器(PIE)和中断子向量表把外围设备中断映射到CPU中断,然后等待CPU的响应。此外CPU中断向量表还包括19个软件中断和硬件复位中断(Reset)以及一个不可屏蔽申断(NMI)。这种两级中断是采用集中化的中断扩展设计方法,特别适合有大量外设中断的工业控制系统。以下就是采用通用定时器GPTI的比较操作来产生中断时,LF2407的中断向量表和申断子向量表程序。当需要采用其他中断时,可以直接在此程序中根据需要修改。该程序对LF2407来说是通用的,只是发生中断时,CPU要跳转的地址不一样而已。 对于一个实际的DSP系统来说,系统的中断管理是不可缺少的,因为目前任何DSP实时系统都具有中断,中断是DSP系统和外部世界发生实时联系的一个重要手段。作为TI公司的C2000系列DSP,它是偏向于控制的DSP 芯片,因此它的中断管理更丰富和先进,读者理解起来也较困难。LF2407支持6个一级可屏蔽中断,采用集中化的中断扩展设计来满足大量的外设中断请求,所以每一级中断又有多个中断源,例如一级中断INT2包含的中断源有比较器1、2、3、4、5、6中断,定时器1、3的周期、比较、下溢、上溢中断等。为了正确地响应外设中断,应该分两步来完成中断服务子程序。在本案例的程序中,采用通用定时器1的比较匹配中断,当CPU响应该中断时,首先转移到一级中断INT2中,也即GISR2处执行,在一级中断INT2中读取外设中断向量寄存器(PIVR)的值,它是个偏移量,再加上中断子向量的首地址,程序就可以转移到二级中断子向量T1CINT_ISR(定时器1比较中断)子程序中,执行相应的操作后即完成了一次中断调用。LF2407通过外设中断扩展控制器(PIE)来实现集中化的中断扩展管理,这可以实现在占用极少资源的情况下,大大扩展可用的中断源。因此在实际的DSP程序中,中断向量表和中断子向量表程序是不可缺少的,读者在自行编写程序时一定要在主程序中用。include 汇编伪指令把本实例介绍的向量表文件PID_generate_vec.asm包括进来。

单片机实验报告-流水灯-双机通信-交通灯-定时时钟

实验一流水灯实验 一、实验目的 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 char uchar 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

中断向量表详解

8.4 BIOS中断调用 8.4.1 BIOS中断调用概述 BIOS (BasicInput/OutputSystem)是IBM-PC机的监控程序,它固化在微型机主板的ROM中,其内容主要有系统测试程序 (Post)、初始化引导程序(Boot)、I/O设备的基本驱动程序和许多常用程序模块,它们一般以中断服务程序的形式存在。例如,负责显示输出的显示 I/O程序为10H号中断服务程序;负责打印 输出的打印I/O程序为17H中断服务程序等。 图8.5 是用户程序和操作系统关系示意图,由图可见BIOS程序直接建立在硬件基础上,磁盘操作系统(DOS)和其他操作系统建立在BIOS基础上,各种高级语言 则建立在操作系统基础上。用户程序可以使用高级语言,也可以调用DOS 或其他操作系统,还可以调用BIOS,甚至直接指挥硬件设备。 通常应用程序调用DOS提供的系统功能,完成输入/输出或其他操作,这样做用户可以少考虑硬件,实现起来容易。

图8.5 用户程序和操作系统关系示意图 应用程序直接对硬件编程的优点是程序的效率高,缺点是需要程序员对硬件性能有较深的了解。总的来说,编程复杂,所以一般不直接对硬件编程。 BIOS中断程序处于DOS功能调用和硬件环境之间。和DOS功能调用相比其优点是效率高,缺点是编程相对复杂;和直接对硬件编程相比,优点是实现相对容易,缺点是效率相对低。 在下列情况下可考虑使用BIOS中断: (1)有些功能DOS没有提供,但BIOS提供了; (2)有些场合无法使用DOS功能调用; (3)其他原因。 8.4.2BIOS中断调用方法 BIOS的调用实际上是利用每一台计算机中BIOS固有的I/O操作程序来方便地解决自己的问题,由于这些已经在计算机中了,故使用时不必要再把它写入自己的程序,只要指明它的操作位置就可以了。 1.BIOS调用的基本操作 由于BIOS中的每一种功能调用往往包含不同的几个操作细节,因此调用时需要说明三部分,基本步骤为: (1)设置分功能号。按实现的操作功能的要求,给指定寄存器(通常为AH)送入分功能号。 (2)设置入口参数。按操作要求,给寄存器填写相应参数的内容(某些调用无参数)。 (3)使用中断语句INTn。执行调用的功能,其中n为中断号。

C51单片机实验报告 流水灯 交通灯 定时器 双机交互 时钟

学号: 31100800 班级:自动化10班姓名:张 指导老师:胡 2012.12

单片机核心板实验要求 一、流水灯实验 1、实验目的: 1)简单I/O引脚的输出 2)掌握软件延时编程方法 3)简单按键输入捕获判断 2、完成功能要求 1)开机是点亮12发光二极管,闪烁三下 2)按照顺时针循环依次点亮发光二极管 3)通过按键将发光二极管的显示改为顺逆时针方式 二、定时器或实时时钟实验 1、实验目的 1)数码管动态显示技术 2)定时器的应用 3)按键功能定义 2、完成功能要求 1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。 2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。 上述二个功能至少完成一种功能。 三、双机通信实验 1、实验目的 UART 串行通信接口技术应用 2、完成功能要求 用两片核心板之间实现串行通信,将按键信息互发到对方数码管 显示。 四、交通灯实验 1、实验目的 1)按键、数码管、发光二极管综合应用编程技术 2)数据存储于EEPROM的技术(也可以不使用) 3)定时中断技术 4)按键中断技术 2、完成功能要求 1)对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。 2)设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。 3)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。再按该键,恢复正常显示。

实验一流水灯实验 一、实验目的 1)简单I/O引脚的输出 2)掌握软件延时编程方法 3)简单按键输入捕获判断 二、实验实现的功能 1)开机是点亮12发光二极管,闪烁三下 2)按照顺时针循环依次点亮发光二极管 3)通过按键将发光二极管的显示改为顺逆时针方式 三、系统硬件设计 1)如单片机核心板所示的硬件电路。 四、系统软件设计 设计思路: 1)定义数组使得调用数组可以使led灯能够顺时针和逆时针显示; 2)将按键的输入端全部置零,做单独按键使用; 3)利用“while”循环使得数码管可以闪烁三下; 4)利用“for”循环使得小灯能够依次点亮一个周期; 5)将以上思想汇总,编程,实现功能。程序详见附录。 五、实验过程中遇到的问题及解决方法 1)刚开始不知道怎样只设置一个管脚(如P0^0),查阅相关资料后知道表示方法,并学会了用“sbit”语句定义,方便多了。 2)对于C语言的很多东西都不知道,语句的用法也不清楚,重新看了C语言,用到什么看什么很快就懂了。 3)主程序中没有用延时程序和死循环导致led不能点亮,请教同学以后才知道。4)对于按键只是不了解,看书又很模糊,看了网上“KINGST工作室”也就是“手把手教你学单片机”的视频后很清楚明了,之后好多东西也是从上边学到,就不再赘述了。 指导老师签字: 日期:

51单片机C语言中断程序定时计数器

51单片机C语言中断程序定时/计数器 程序一 利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁, #include //52单片机头文件 #include //包含有左右循环移位子函数的库#define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit P1_0=P1^0; uchar tt; void main() //主函数 { TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 while(1);//等待中断产生 }

void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==20) { tt=0; P1_0=~P1_0; } } 程序二 利用定时/计数器T1产生定时时钟, 由P1口控制8个发光二极管, 使8个指示灯依次一个一个闪动, 闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。#include //52单片机头文件 #include //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义

外部中断、定时(计数器)实验

课程:微处理器原理与应用 课时:4学时 教学环境:单片机实验室 教学方法:讲解相关内容,指导学生实验 实验二外部中断、定时/计数器实验 一、目的、任务和要求 1.1 实验目的 1. 掌握单片机中断系统的结构及工作原理。 2.掌握外部中断功能程序的一般结构和编程方法。 3.掌握单片机的定时/计数器的结构及工作原理。 4.掌握定时中断应用程序、计数器应用程序的典型结构和编程方法。 1.2 实验任务 1.对8051单片机的外部中断功能和I/O口功能,搭建一个外部中断控制输出的硬件电路,设计和调试通过相应的外部中断功能软件。 2.对8051单片机的定时/计数器功能和I/O口功能,搭建一个(种)或几个(种)应用定时/计数器的硬件电路,设计并调试通过相应的软件。 1.3实验要求 通过完成外部中断功能实验项目,掌握中断初始化的内容和中断子程序的结构,熟悉中断响应的过程和现场保护的意义,会正确运用堆栈指令作现场保护和现场恢复。 通过完成定时/计数器实验项目,掌握正确选择定时/计数器的工作方式和计数模式的方法,掌握定时/计数器的初值计算方法,会编写中断控制寄存器和定时器中断入口地址的初始化程序。 二、设备和器件 2.1实验设备 (1)微型计算机(PC机)(装配相关软件),(2)单片机实验箱或开发板。 2.2电路元器件 本实验采用Protues仿真软件搭建一个简单的单片机系统电路,进行电路仿真分析,不需要实际的元器件。若实验采用万能板(或面包板)搭建电路,则需要如下元器件:

LED发光二极管,510Ω限流电阻,小按键、软导线等。 学生可自己在课后搭建电路进行实验,并与仿真实验比较。 三、实验内容及步骤 3.1外部中断控制流水灯的实验内容及步骤 (1)根据实验任务作电路原理图设计、作电路布局设计、通过Protues仿真软件来完成单片机硬件系统的搭建。电路图如3.1所示。 (2) 通过“μVision4”软件编辑外部中断控制流水灯的程序,并将编写好的程序代码进行编译和仿真调试,然后输出*.hex文件。 (3)通过实验板专用的接口将*.hex文件写入到单片机芯片的程序存储器中,然后试运行,察看现象并分析结果。若不成功,则要分析原因,重复有关步骤直至成功。 3.2 定时中断控制流水灯电路的实验内容及步骤 (1) 根据上面已搭建好的外部中断控制流水灯电路完成本任务。 (2) 通过“μVision4”软件编辑定时中断控制流水灯程序,并将编写好的程序代码进行编译和仿真调试,然后输出*.hex文件。 (3)通过实验板专用的接口将*.hex文件写入到单片机芯片的程序存储器中,然后试运行,察看现象并分析结果。若不成功,则要分析原因,重复有关步骤直至成功。 3.3外部脉冲个数计数显示的实验内容及步骤 (1)根据实验任务作电路原理图设计、作电路布局设计、通过Protues仿真软件来完成单片机硬件系统的搭建。电路图如3.2所示。 (2) 通过“μVision4”软件编辑外部中断控制流水灯的程序,并将编写好的程序代码进行编译和仿真调试,然后输出*.hex文件。 (3)通过实验板专用的接口将*.hex文件写入到单片机芯片的程序存储器中,然后试运行,察看现象并分析结果。若不成功,则要分析原因,重复有关步骤直至成功。 说明:单片机实验板使用STC89C51RC-RD+系列单片机,利用RS232串口和STC-ISP V33.exe通信软件(或开发板自带下载软件)来下载*.hex机器程序代码。 3.4 参考电路与程序代码 1参考电路 (1)外部中断控制输出的流水灯电路简图

单片机复习与流水灯 定时器程序

1、单片机的基本结构及其特点。 2、8051单片机基本性能。 3、8051单片机的时钟和基本时序周期。 4、8051单片机存储器结构特点。EA端口的作用。 5、8051单片机堆栈指针以及复位后的状态。 6、P0-P3口的相同之处和不同之处。P3口的每一位都有第二功能。复位后的状态 7、复位方式和程序执行方式 8、C语言相比于汇编语言的优点。 9、C51逻辑运算符和位操作。 10、中断的概念和各个中断源、中断优先级。 11、注意定时器中断请求标志位和串口中断请求标志位的对比。 12、对于IP,复位后的状态以及硬件优先级顺序。 13、中断响应后完成的操作。 14、中断函数和子函数的不同之处。 15、课本P181-P183:关于定时器/计数器的基本概念。 16、编程题:定时器方式1的1s定时。P186-P187 17、编程题:流水灯。

#include //实现8个LED轮流点亮 #define uchar unsigned char #define uint unsigned int void delay( uint num)//延时函数 { uint i,j; for(i=0;i>1; c=a | b; return c; } void main() {

uchar i,temp=0x01; for(i=0;i<8;i++) { P2=temp; delay(100); temp=cir(temp); } } 利用定时器1方式1实现1S定时,晶振频率为12Mhz #include #define uchar unsigned char #define uint unsigned int sbit LED=P2^7; uchar i,time; bit flag; void delay(uint m) { while(m--); }

中断向量表笔记

中断向量笔记 大头小脑 1、中断向量表(Interrupt Vector Table是ISR(Interrupt Service Routine) 进入点的数组) 2、当CPU开始处理一个中断的时候(从优先级号开始),根据优先级计算中 断向量表中和这个中断相关的地址。这个地址被载入到程序计数器。CPU 开始执行这个地址存储的指令(在中断向量表中),这个地址的代码是所 选择的ISR的开始。由于ISR的大小关系,中断向量表可能仅仅存储ISR 的初始化部分,比如:一个跳转指令,这个跳转指令把CPU引导到ISR 的在存储区域的剩余程序部分。 3、中断向量表存储在代码存储区域。BIV寄存器指定了中断向量表的具体地 址。中断向量在中断向量表中是按照优先级增长的方式递增的。 4、BIV寄存器存储着中断向量表的基地址。其可以分配到任何一个可用的代 码存储区域。 5、在系统初始化中可以改变BIV的值。在这种方法下,可以有多个中断向量 表,通过改变BIV的值它们之间可以切换。 6、中断向量表是根据中断优先级而组织的。 7、TC1728提供附加的选项:允许跨过几个没有被用的中断向量进入点。 8、使用BIV寄存器和优先级号来计算(P1013) (P1014)

PIPN左移5bits和BIV寄存器的值“或”运算,得到指向中断向量表的指针。CCPN现在的CPU优先级号,PIPN,正在等待的CPU优先级号。 总结:1、TriCore是以中断的优先级来定义中断向量表,每一个服务请求可以分配一个独立的优先级 2、Power PC是以中断的属性来定义中断向量表,只有16个优先级。 3、中断向量表是在startup中初始化的,一般在库中,不可见。

《PIC16系列单片机C程序设计与proteus仿真》学习之2----TMR0定时器中断

/**用TMR0延时中断,产生脉冲**/ /** 设定时器TMR0延时10MS,8位pic单片机晶振4MHZ,则指令周期Tcy=1us,计算如下:1.设预分频比为K,则256*K*Tcy=10_000us,得K=39.06,要取大于此值的最小分频比,即K=64 2.计算延时常数X,(256-X)*64*Tcy=10_000us,得X=99.75,四舍五入取整,得X=100. */ #include __CONFIG(0x3f71); #define LED RB0 #define T0_10MS 100 //定义TMR0延时10MS的时间常数 char A; void interrupt ISR(void); void main(void) { RISB0=0; //设定RB0位输出,其余B口未设置,采用上电默认值,为输入 OPTION=0b10000101;//RBPU=1:B口上拉使能,INTEDG=0:下降沿触发,T0CS=0:对内部指令周期计数,T0SE=0:RA4/T0CKI的上升沿计数,PSA=0:预分频分配位给TMRO,PS2PS1PS0=101:TMR0比率为1:64 INTCON=0b10100000;//GIE=1:允许全局中断使能,PEIE=0:禁止外设中断使能,T0IE/TMR0IE=1:允许TMR0溢出中断使能,INTE=0:禁止INT引脚中断使能//RBIE=0:禁止RB口高4位电平变化使能,T0IF/TMR0IF=0:TMR0溢出中断标志位--未溢出 //INTF=0:未发生INT中断,RBIF=0:RB7:RB4引脚的逻辑状态未发生变化 TMR0=T0_10MS; //TMR0赋初值 LED=1; A=1; while(1); //原地等待 } void interrupt ISR(void) { if(T0IF==1) { T0IF=0; TMR0=T0_10MS;//TMR0赋初值,必须 if(A==1) { A=0; LED=0; } else { A=1; LED=1;

实验五 8051单片机定时中断实验

实验五8051单片机定时中断实验 一实验目的: 了解8051系列单片机的定时中断基本工作原理。掌握8051系列单片机定时中断的用法。 二实验原理: 在上一个实验里我们介绍了8051单片机的外中断应用,本实验要介绍的是定时器中断的应用。 8051系列单片机至少有两个16位的内部定时器/计数器,既可以编程为定时器使用,也可以作为计数器使用。如果是计数内部晶振驱动时钟,它是定时器,如果是计数8051的输入管脚的信号,就是计数器。 MCS-51单片机内部的定时/计数器的结构如图5-1所示,定时器T0特性功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特性功能寄存器TL1(低8位)和TH1(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以定义它们的工作方式和控制T0和T1的计数。 图5-1 TMOD特殊功能寄存器的格式参见下表(表5-1): 表5-1 高4位为定时器/计数器1的控制字,低4位为定时器/计数器0的控制字。其中GATE 为门控信号,C/T为定时器或计数器的选择,而M1,M0是工作方式选择位。 当M1M0=00时,T/C工作在方式0。方式0为13位的T/C,其计数器由TH的8位和TL的5

位构成,计数器的计数值范围是: 1—8192(213),但是启动前可以预置计数初值。当C/T为 0时,T/C为定时器,计数脉冲为振荡源12分频的信号;当C/T为1时,T/C为计数器,对输入端T0或T1输入的脉冲进行计数。计数脉冲加到计数器上与否决定于启动信号。当GATE=0时,TR=1时T/C便启动,当GATE=1时,启动受到TR与INT的双重控制,即二者同时为高 时才启动。当计数满时,TH向高位进位,这时中断溢出标志TF置1,即产生中断请求。而当CPU转向中断服务程序时,TF自动清零。 当M1M0=01时,T/C工作在方式1。方式1和方式0的区别仅在于方式0的计数器位数为13位,而方式1的为16位。 当M1M0=10时,T/C工作在方式2。区别于前面的两种工作方式的是,方式2具有自动重装载的功能。TH和TL作为两个8位的计数器,TH中的8位初值始终保持不变,由TL进行8位计数。在计数溢出时不但会产生中断请求,而且自动将TH中的值加载至TL 中,即自动重装载。 当M1M0=11时,T/C工作在方式3。但是这种工作方式只存在于T/C0中,这时TH0与TL0成为两个独立的计数器。只有在T/C1作为串行口的波特率发生器使用,而造成定时器不够用时,T/C0才能工作在方式3。 下面是定时器时间常数计算公式,这个公式在方式1,即16 位定时或计数模式可用。 THX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])/256; TLX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])%256; 在定时器重装载过程中因为TL1=0可以不写。 三实验内容: 利用中断方式在LED上输出10HZ方波,系统晶体频率11.059MHz。 四实验电路图:

相关主题