当前位置:文档之家› MSP430F149_用中断方法实现按键功能

MSP430F149_用中断方法实现按键功能

MSP430F149_用中断方法实现按键功能
MSP430F149_用中断方法实现按键功能

/****************************************************************************** 【功能简介】用中断方法实现按键功能,按不同的键,LED闪烁次数不同。

******************************************************************************/

#include

#include

#include "DELAY.h"

#define Key_IN (P1IN & 0x0F)

unsigned char Key_Value = 0;

/****************************************************************************** 【函数名称】void SYS_CLOCK_INIT(void)

【功能】初始化系统时钟

******************************************************************************/ void SYS_CLOCK_INIT(void)

{

unsigned char i;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

/*------选择系统主时钟为8MHz-------*/

BCSCTL1 &= ~XT2OFF; // 打开XT2高频晶体振荡器

do

{

IFG1 &= ~OFIFG; // 清除晶振失败标志

for (i = 0xFF;i > 0;i--); // 等待8MHz晶体起振

}

while ((IFG1 & OFIFG)); // 晶振失效标志仍然存在?

BCSCTL2 |= SELM_2 + SELS; // MCLK和SMCLK选择高频晶振

_EINT(); //打开全局中断

}

/****************************************************************************** 【函数名称】void LED_Display()

【功能】LED闪烁

******************************************************************************/ void LED_Display()

{

P2OUT ^= BIT7;

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

P2OUT |= BIT7;

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

Delay(60000);

}

/****************************************************************************** 【函数名称】void main(void)

【功能】主函数

******************************************************************************/ void main(void)

{

unsigned int j;

SYS_CLOCK_INIT();

P1IE |= 0x0F; //使能P1.0,P1.1,P1.2,P1.3中断

P1DIR |= BIT4; //设置P1.0~P.3为输入状态,P.4为输出

P1OUT |= 0X00;

P2DIR |= 0XFF;

P2OUT |= 0XFF;

while(1)

{

switch(Key_Value) //转换键值

{

case 1:

LED_Display();

Key_Value = 0xFF;

break;

case 2:

for(j = 0;j < 2;j++)

LED_Display();

Key_Value = 0xFF;

break;

case 3:

for(j = 0;j < 3;j++)

LED_Display();

Key_Value = 0xFF;

break;

case 4:

for(j = 0;j < 4;j++)

LED_Display();

Key_Value = 0xFF;

break;

default:

P2OUT &= 0xff;

break;

}

}

}

/****************************************************************************** 函数名:__interrupt void Port2()

功能:PORT2中断函数,P2.0中断

******************************************************************************/ #pragma vector=PORT1_VECTOR

__interrupt void Port1()

{

if((P1IFG & BIT0) == BIT0)

{

Key_Value = 1;

P1IFG &= ~BIT0; //清除中断标志

}

else if((P1IFG & BIT1) == BIT1)

{

Key_Value = 2;

P1IFG &= ~BIT1; //清除中断标志

}

else if((P1IFG & BIT2) == BIT2)

{

Key_Value = 3;

P1IFG &= ~BIT2; //清除中断标志

}

else

{

Key_Value = 4;

P1IFG &= ~BIT3; //清除中断标志

}

}

按键中断

#include /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ #define LED PORTB #define LED_dir DDRB #define KEY1 PTIH_PTIH3 #define KEY2 PTIH_PTIH2 #define KEY3 PTIH_PTIH1 #define KEY4 PTIH_PTIH0 #define KEY1_dir DDRH_DDRH3 #define KEY2_dir DDRH_DDRH2 #define KEY3_dir DDRH_DDRH1 #define KEY4_dir DDRH_DDRH0 unsigned char data=0x01; unsigned char direction=1; //设置灯亮的方向,0向左,1向右。unsigned char time=5; //设置灯闪的速度。 /*************************************************************/ /* 延时函数*/ /*************************************************************/ void delay(unsigned int n) { unsigned int i,j; for(j=0;j

51单片机独立按键程序查询法和外部中断两种

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 左右流水灯实验 * 使用的IO : LED使用P2,键盘使用P3.1 * 实验效果: 按下K1键, * 注意: ******************************************************************************* / #include #include #define GPIO_LED P2 sbit K1=P3^1; void Delay10ms( ); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main(void) { unsigned int i,j; j=0xfe; //1111_1110 while(1) { GPIO_LED=j; if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) {

实验五 键盘中断实验

实验五键盘中断实验 一、实验目的 1.熟练运用CodeWarrior嵌入式开发系统环境、C语言、调试方式。 2.复习串行通信接口(SCI)的内容。 3.加强键盘中断基本原理及编程原理的理解。 4.理解“行扫描”法的原理并能进行键值识别和键值编码。 5.理解键盘接线原理图(如图5-1)。 二、知识要点 本实验采用的是4×4矩阵式键盘(以下简称键盘)。PTG4、PTD2、PTD3、PTD7分别接四根列线,定义为输入且上拉,PTG0~PTG3分别接四根行线,且定义为输出。行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确定是哪一行哪一列交点的键被按下。 MCU与键盘接线原理图: 图5-1 4×4键盘与MCU接法示例 键盘的c语言编程: 1)初始化,先按IO口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输入口的键盘功能初始化相应的寄存器。 2)定义键值表 3)扫描一次,读取键值 4)获得键盘定义值 行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确定是哪一行哪一列交点的键被按下。

设置键盘中断允许寄存器,当键盘有键被按下时,立即产生中断,中断程序处理按键事件,比如确定哪个键被按下,然后转换为该键的定义值。 键盘的键面标示码(即定义值)与MCU识别的键值对应关系通过列表对应起来,即键盘定义表对应表示。当通过“行扫描”法获得某个键的键值时,通过查表法就可以得到它的定义值。 该键盘中断方式程序的主程序主体是一个死循环,且是一个空循环体,所有处理的过程代码放在中断程序中。 三、演示性实验 在光盘资料中提供读者键盘实例程序文件夹。 编程采用规范要求编写,将键盘独立成一个构件,如C语言中,形成key.h头文件和key.c源文件。头文件对键盘的所用端口寄存器或引脚进行宏定义以及初始化函数和驱动函数声明。源文件对初始化函数和驱动函数进行定义。具体实现代码见光盘。 四、设计性实验 要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示。 当键值被按下时,高端虚拟键盘被按下,或者在高端PC机中显示对应按键值。 1、资源使用 键盘的数据线分别接在MCU 口的号引脚、口的号引脚。 2、硬件设计(标识引脚名) 图5-2 4×4键盘按键的信息显示在PC机界面的连线图 3、软件设计 1)MCU端程序流程图 2)编程 (1)下面填写主程序main。 (填写主程序main.c) 键盘中断程序 (填写C语言编写的键盘中断程序)

单片机按键的解决方法

单片机按键的解决解决方案 1、单片机上的按键控制一般采用两种控制方法:中断和查询。中断必须借助中断引脚,而 查询按键可用任何IO端口。按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。 2、中断形式 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器. 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组 第0组:所有4bit用于指定响应优先级; 第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; 第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; 第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级; 第4组:所有4位用于指定抢占式优先级。 所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。 有几点需要注意的是: 1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果; 2)抢占式优先级别相同的中断源之间没有嵌套关系; 3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。 GPIO外部中断: STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间智能使用一个,如:PA0,PB0,PC0,PD0,PE0,PF0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能使用了,在此情况下我们使用类似于PB1,PC2这种末端序号不同的外部中断源,每一组使用一个中断标志EXTI x.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。 对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。 编写IO口外部中断步骤及其注意事项:

用51单片机中断编写的4x4键盘程序

用51单片机中断编写的4x4键盘程序 应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文《MSP430和 AT89C51单片机4x4键盘C程序》),如果用中断编写,设置中断响应在下降沿时执行中断,则程序编写不用去抖动判断,所以相比较要简单很多!下面用汇编和C语言两种方式编写4X4键盘程序! 一、汇编程序 ORG 0000H LJMP MAIN ORG 0003h Ljmp ZD0

ORG 000Bh LJMP TZD0 ORG 0013h Ljmp ZD1 ORG 001Bh LJMP TZD1 ORG 0040H MAIN: Mov TMOD,#66h MOV TH0,#0ffh MOV TL0,#0ffh MOV TH1,#0ffh MOV TL1,#0ffh SETB EA SETB ET0 SETB TR0 SETB ET1 SETB TR1 SETB IT0 SETB IT1 SETB EX0 SETB EX1 xh: mov P1,#0feh

Lcall Delay mov P1,#0fdh Lcall Delay mov P1,#0fbh Lcall Delay mov P1,#0f7h Lcall Delay SJMP xh ZD0: JNB P1.0,dat1 JNB P1.1,dat2 JNB P1.2,dat3 JNB P1.3,dat4 dat1: mov P2,#06h ;1 sjmp ZD0R dat2: mov P2,#5bh ;2 sjmp ZD0R dat3: mov P2,#4fh ;3 sjmp ZD0R dat4: mov P2,#66h ;4 ZD0R: reti ZD1: JNB P1.0,dat5

stm32 之 中断按键初始化(注意事项)

stm32 之 中断按键初始化(注意事项) 之前做终端按键的时候都是只做了一个,没有做多个,昨天在把所有按键都设置成中断模式的时候遇到问题,于是乎还跟一个网上的哥们进行了热议,后来还是我发现了问题!最终把问题给解决了! 我的按键的GPIO连接有点奇葩,他不是连续的,这可能就是竞赛板故意设置的难度吧! 首先管脚初始化: [cpp]view plaincopyprint? 1. GPIO_InitTypeDef key; 2. 3. RCC->APB2ENR |= ((1<<0)|(1<<2)|(1<<3)); 4. 5. key.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8; 6. key.GPIO_Mode = GPIO_Mode_IPD; 7. GPIO_Init(GPIOA, &key); 8. 9. key.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;

10. key.GPIO_Mode = GPIO_Mode_IPD; 11. GPIO_Init(GPIOB, &key); 全部设置成输入模式,AFIO再时钟使能的时候不要忘记了!这里我就 不多说了! 然后就是中断组设置: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC初始化: [cpp]view plaincopyprint? 1. key_nvic.NVIC_IRQChannel = EXTI0_IRQn; 2. key_nvic.NVIC_IRQChannelCmd = ENABLE; 3. key_nvic.NVIC_IRQChannelPreemptionPriority = 0; 4. key_nvic.NVIC_IRQChannelSubPriority = 1; 5. NVIC_Init(&key_nvic); 重点都不在这,值得注意的是下面: 我第一次在配置EXTI Line的时候这样配置! GPIO_EXTILineConfig(GPIO_PortSourceGPIOA|GPIO_PortSourceGPIOB,\ GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource8);大致一看,貌似很正常啊!但是问题就出在这! 我们跳转到GPIO_PinSourcex和GPIO_PortSourceGPIOx哪里看看:[cpp]view plaincopyprint? 1. #define GPIO_PortSourceGPIOA ((uint8_t)0x00) 2. #define GPIO_PortSourceGPIOB ((uint8_t)0x01) 3. #define GPIO_PortSourceGPIOC ((uint8_t)0x02) 4. #define GPIO_PortSourceGPIOD ((uint8_t)0x03) 5. #define GPIO_PortSourceGPIOE ((uint8_t)0x04) 6. #define GPIO_PortSourceGPIOF ((uint8_t)0x05) 7. #define GPIO_PortSourceGPIOG ((uint8_t)0x06) [cpp]view plaincopyprint?

键盘及LED显示实验

实验三键盘及LED显示实验 一、实验内容 利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。 二、实验目的及要求 (一)实验目的 通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。 (二)实验要求 1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。 2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。 三、实验条件及要求 计算机,C51语言编辑、调试仿真软件及实验箱50台套。 四、实验相关知识点 1.C51编程、调试。 2.扩展8255芯片的原理及应用。 3.键盘扫描原理及应用。 4.LED显示器原理及应用。 5.外部中断的应用。 五、实验说明 本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码。 六、实验原理图

P1口桥接。 八、实验参考流程图 1.主程序流程图

2.外中断服务程序流程图 外部中断0 外部中断1 定时器0中断程序,用于消抖动:

3.LED显示程序流程图 九、C51语言参考源程序 #include "reg52.h" unsigned char KeyResult; //存放键值 unsigned char buffer[8]; //显示缓冲区 bit bKey; //是否有键按下 xdata unsigned char P_8255 _at_ 0xf003; //8255的控制口 xdata unsigned char PA_8255 _at_ 0xf000; //8255的PA口 xdata unsigned char PB_8255 _at_ 0xf001; //8255的PB口 xdata unsigned char PC_8255 _at_ 0xf002; //8255的PC口 code unsigned char SEG_TAB[] = { //段码 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0}; sbit bLine0 = P3^2; sbit bLine1 = P3^3; //延时1ms void Delay1ms() { unsigned char i;

单片机按键控制蜂鸣器发声程序

#include typedef unsigned char uint8; typedef unsigned int uint16; uint8 Count,i; sbit Speak =P1A2; //蜂鸣器器控制脚 sbit keyl =卩3人2;〃按键控制引脚 sbit key2 =P3A3; sbit key3 =P3A4; /* 以下数组是音符编码 */ uint8 code SONG[] ={ 0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,}; void Time0_Init()// 定时器 T0 方式 1 ,定时 10ms { TMOD = 0x01; IE = 0x82; TH0 = 0xDC; TL0 = 0x00; void Time0_Int() interrupt 1 { TH0 = 0xDC; TL0 = 0x00; Count++; } void delay (uint8 k)// 按键防抖延时 { uint8 j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } void Delay_xMs(uint8 x)// 发声延时 { uint8 i,j; for(i=0; i

Count = 0; // 中断计数器清 0 Addr = i *3; while(1) { Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { TR0 = 0; Delay_xMs(100); } else if (Temp1 == 0x00) //歌曲结束符 { return; } else { Temp2 = SONG[Addr++]; TR0 = 1; while(1) { Speak = ~Speak; Delay_xMs(Temp1); if(Temp2 == Count) { Count = 0; break; } } } } }void keyscan (void)// 按键切换声音函数{ if(key1==0) { delay(10); if(key1==0) {

按键中断程序

* 1个LED指示灯,对应的GPIO为 : PC0输出为1点亮LED 输出为0关闭LED 另外PC1为外部中断触发:按键按下时为低电平,即可设置为低电平触发 /* GPIO配置函数 */ void GPIO_Configuration(void) { /*定义2个结构体变量 */ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOB,GPIOC ,复用口时钟的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*给GPIOC_Pin_1一个初始值*/ GPIO_ResetBits(GPIOC, GPIO_Pin_0); 配置IO口,初始化IO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; // 将连接LED的GPIO设置为推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为2MHZ的速度,响应时间,没要求越小越好GPIO_Mode_IPU为输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //初始化GPIOC GPIO_Init(GPIOC, &GPIO_InitStructure); /*给KEY_InitStructure.GPIO_Pin KEY_InitStructure.GPIO_Mode KEY_InitStructure.GPIO_Speed付初始值*/

基于STM32的单个按键中断的例子

#include"stm32f10x.h" //K1点亮LED , K2熄灭LED void RCC_Config(void); void GPIO_Config(void); void NVIC_Config(void); void EXTI_Config(void); int main(void) { RCC_Config(); GPIO_Config(); NVIC_Config(); EXTI_Config(); while(1); } void RCC_Config(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB 2Periph_AFIO,ENABLE); } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_5; //PC5-K1 PC2-K2 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //led1 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);

怎么在中断中实现一个按键第一次按键之后,立刻切换到一个循环状态。

问题的提出:怎么在中断中实现一个按键第一次按键之后,立刻切换到一个循环状态,然后同一个按键第二次按下时结束循环,回到中断入口? 疑难点: 1.中断是实时扫描的,但是中断中改变的状态量在主函数中却不能实时读取,这样不能达到立刻切换的目的。 2.如果把循环子函数放在中断中,那么仅仅用一个状态变量的话,是不可能时刻改变它的值的,因为在C中状态变量相当于一个存储器。 例子说明解答方法: 例子:想中断按键按下时,循环执行Led子函数,再次按下时,停止循环,回到主函数继续执行。 很多人是这样写的: void int0(void)interrupt 0 { if (k1==0) { delay_ms(10); if(k1==0) { m=!m; while(!k1); while(m) Led(); } } } 这样写为什么不行呢?因为m状态量改变一次之后,若m==1,则进入while()循环,此后即使中断改变了m的值,但是while(m) Led();一直在进行while(1)循环,所以m即使再怎么改变,按键都不能复位到初始化状态。下面提出这样一串代码: void int0(void)interrupt 0 { if (k1==0) { delay_ms(10); if(k1==0) { m=!m; while(!k1); while(k1&&m) Led(); } } } 这样因为K1按键弹出后立刻变为1,而k1它属于口线,并不是变量,所以实时改变,一旦按键再次按下时,K1变0,即可从while()中挑出,则程序会再次去读出m,此时将m值激活,则可达到再次按键初始化问题,并且反应比起在主函数中扫描要灵敏N倍。

按键控制单片机PWM输出设计

学号1322010110 天津城建大学 单片机原理及应用A课程 设计说明书 按键控制单片机PWM输出设计起止日期:2016年05月30日至2016年6月10日 学生姓名 班级 成绩 指导教师(签字) 控制与机械工程学院 2016年6月10日

目录 第一章系统方案设计 (1) 1.1 PWM (1) 1.2 STC12C5A60S2简介 (1) 1.3 仿真工具介绍 (2) 1.3.1 Protues简介 (2) 1.3.2 Keil uVision3简介 (4) 第二章硬件电路设计 (5) 2.1 复位电路 (5) 2.2 时钟电路 (5) 2.3 按键中断 (5) 2.4 显示电路 (6) 第三章程序设计流程图 (7) 第四章系统仿真 (8) 4.1 仿真图 (8) 4.2 程序 (8) 4.3 PCB............................................................................................................... 错误!未定义书签。参考资料 .................................................................................................................... 错误!未定义书签。

第一章系统方案设计 1.1 PWM PWM的全称是Pulse Width Modulation(脉冲宽度调制),它是通过改变输出方波的占空比来改变等效的输出电压。 1.2 STC12C5A60S2简介 STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。 1)管脚说明: 1、P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。当P0口 作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 2、P1.0/ADC0/CLKOUT2 标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 3、P1.1/ADC1 4、P1.2/ADC2/ECI/RxD2 标准IO口、ADC输入通道2、PCA计数器的外部脉冲输入脚,第二串口数据接收端 5、P1.3/ADC3/CCP0/TxD2 外部信号捕获,高速脉冲输出及脉宽调制输出、第二串口数据发送端 6、P1.4/ADC4/CCP1/SS非 SPI同步串行接口的从机选择信号 7、P1.5/ADC5/MOSI SPI同步串行接口的主出从入(主器件的输入和从器件的输出) 8、P1.6/ADC7/SCLK SPI同步串行接口的主入从出 9、P2.0~P2.7 10、P2口内部有上拉电阻,既可作为输入输出口(8位准双向口),也可作为高8位地址总线使用。 11、P3.0/RxD 标准IO口、串口1数据接收端 12、P3.1/INT0非 外部中断0,下降沿中断或低电平中断 13、P3.3/INT1 14、P3.4/T0/INT非/CLKOUT0 定时器计数器0外部输入、定时器0下降沿中断、定时计数器0的时钟输出 2)A/D转换器的结构: STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口,有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型IO口,用户可以通过软件设置将8路中的任何一路设置为A/D 转换,不须作为A/D使用的口可继续作为IO口使用。 单片机ADC由多路开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器以及ADC_CONTER

外部按键中断延时控制LED设计

成绩 实训报告 题目:外部按键中断延时控制LED设计课程名称: ARM嵌入式系统实训 学生姓名:徐欣郑亮亮杨康宁 任课教师:权循忠 系别: 电子工程学院 专业:通信工程 年级: 13级 实训时间: 2015年11月13日 电子工程学院

外部按键中断延时控制LED设计 学生:徐欣郑亮亮杨康宁 指导老师:权循忠 电子工程学院通信工程专业 实训目的 1.掌握STM32项目开发流程; 2.学会画出算法流程图; 3.掌握LED的控制编程。 二、实训内容 (1)LED0亮2秒,LED0灭2秒;循环(1)的操作5次; (2)LED1亮3秒,LED1灭3秒;循环(2)的操作5次; (3)然后到(1)循环。 三、实训过程 1.人员分配: 徐欣负责程序部分,利用c语言设计算法,建立工程项目,生成目标文件,并将目标文件编程下载到开发板,验证算法;郑亮亮负责绘制电路图,进行电路设计及分析;杨康宁负责程序流程框图以及完成实验报告。 2.电路设计: (1)要求使用LED0和LED1两个LED,连接图如下: 图1、LED原理图

(2)所用到的硬件只有LED(DS0和DS1)。LED与MCU连接,实现定时控制LED闪烁,其原理图如下: 图2、LED与STM32连接原理图 3.电路分析: 因为用Proteus绘图软件来绘制原理图,Proteus中没有MCU芯片,通过手绘将这些芯片和引脚绘出来,不能进行仿真。 LED0(DS0)与PB5相连;LED1(DS1)与PE5相连。 4.算法设计

算法解释: 通过if 选择语句实现按键选择功能, 按下KEY0时,实现函数 LED0=0; delay_ms(1500); delay_ms(1500); 按下KEY1时,实现函数 LED0=0; delay_ms(1500); delay_ms(1500); 按下WK_UP 时,实现函数 LED0=0; LED1=0; delay_ms(1500); delay_ms(1500); delay_ms(1500); delay_ms(500); 延时3S LED0,1灭 LED0灭 LED0灭 延时5S 延时3S KEY0按下? KEY2按下? KEY1按下? LED0,1亮 LED0亮 LED0亮 开始 初始化I/O 为输入,开启I/O 复用时钟,设置I/O 与中断线的映射关系,初始化线上中断,设置触发条件等,配置中断分组(NVIC ),并使能中断编 写中断服务函数 检测按键

实验二 按键中断实验

实验二按键中断实验 一、实验目的 了解中断的含义 二、实验内容 板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。 三、实验仪器、设备 计算机、开发板、keil软件 四、硬件设计 在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示 键盘部分如下图所示: 例程所用到的列扫描线:PC5,PC2,PC3。 例程所用到的行扫描线(EXTI中断线):PE2。

五、实验要求和步骤 开发板上有3个蓝色状态指示灯V6(LED1),V7(LED2),V8(LED3),通过对应的按键K1-K3,控制LED的亮灭,将PE2引脚配置为外部中断,当其上出现下降沿时产生一个中断,根据扫描PC5,PC2,PC3来判别是哪个按键按下。 首先我们了解一下什么是外部中断/事件控制器(EXTI)。 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。 EXTI控制器的主要特性如下: 每个中断/事件都有独立的触发和屏蔽 每个中断线都有专用的状态位 支持多达19 个中断/事件请求 检测脉冲宽度低于APB2 时种宽度的外部信号 如要产生中断,中断线必须事先配置好并被激活。这是根据需要的边沿检测通过设置2个触发寄存器,和在中断屏蔽寄存器的相应位写“1”到来允许中断请求。当需要的边沿在外部中断线上发生时,将产生一个中断请求,对应的挂起位也随之被置1。通过写“1”到挂起寄存器,可以清除该中断请求。为产生事件触发,事件连接线必须事先配置好并被激活。这是根据需要的边沿检测通过设置2个触发寄存器,和在事件屏蔽寄存器的相应位写“1”到来允许事件请求。当需要的边沿在事件连线上发生时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写“1”,一个中断/事件请求也可以通过软件来产生。 本次实验需要组件的工程文件文档如下: USER--stm32f10x_it.c 为中断服务程序主程序,我们对主程序进行一次详细的注释。 //______________________主程序____________________________________________________________________ int main(void) { unsigned char a=0,b=0,c=0; /*完成对系统时钟的设置,例程中通过系统时钟设置函数,外接晶振采用8Mhz,经过片内频率合成,9倍频,设置为72MHz的时钟。*/ RCC_Configuration(); /*嵌套向量中断控制器

嵌入式KL25 键盘中断实验

嵌入式KL25 键盘中断实验

实验五键盘中断实验 一、实验目的 1.熟练运用CodeWarrior嵌入式开发系统环境、C语言、调试方式。 2.复习串行通信接口(SCI)的内容。 3.加强键盘中断基本原理及编程原理的理解。4.理解“行扫描”法的原理并能进行键值识别和键值编码。 5.理解键盘接线原理图(如图5-1)。 二、知识要点 本实验采用的是4×4矩阵式键盘(以下简称键盘)。PTG4、PTD2、PTD3、PTD7分别接四根列线,定义为输入且上拉,PTG0~PTG3分别接四根行线,且定义为输出。行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按 下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确定是哪一行哪一列交点的键被按下。 MCU与键盘接线原理图:

键盘的c语言编程: 1)初始化,先按IO口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输 入口的键盘功能初始化相应的寄存器。2)定义键值表 3)扫描一次,读取键值 4)获得键盘定义值 行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确

定是哪一行哪一列交点的键被按下。 设置键盘中断允许寄存器,当键盘有键被按下时,立即产生中断,中断程序处理按键事件,比如确定哪个键被按下,然后转换为该键的定义值。 键盘的键面标示码(即定义值)与MCU 识别的键值对应关系通过列表对应起来,即键 盘定义表对应表示。当通过“行扫描”法获得某个键的键值时,通过查表法就可以得到它的定义值。 该键盘中断方式程序的主程序主体是一个死循环,且是一个空循环体,所有处理的过程 代码放在中断程序中。 三、演示性实验 在光盘资料中提供读者键盘实例程序文件夹。 编程采用规范要求编写,将键盘独立成一个构件,如C 语言中,形成key.h 头文件和key.c 源文件。头文件对键盘的所用端口寄存器或引脚进行宏定义以及初始化函数和驱动函数声明。源文件对初始化函数和驱动函数

用计数器中断实现100以内的按键计数[1]

3.33 用计数器中断实现100以内的按键计数 一. 单片机系统功能简介: 本例利用计数器中断实现按键计数,这与此前的按键计数程序看起来比较相似,但是用方法完全不同。 本例用T0计数器中断实现按键计数,由于计数寄存器初值为1,因此P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。 二.单片机系统硬件电路设计: 2.1 proteus原理图: 2.2 原件清单:

三.软件设计: 3.1 主程序流程图: 3.2 程序清单: #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 }; uchar Count=100; void main() { P0=0x00; P2=0x00; TMOD=0X06; TH0=TL0=256-1; ET0=1; EX0=1; EA=1; IP=0X02; IT0=1; TR0=1; while (1)

{ P0=DSY_CODE[Count/10]; P2=DSY_CODE[Count%10]; } } void Clear_Counter()interrupt 0 { Count=0; } void Key_Counter() interrupt 1 { Count=(Count-1)%100; } 四.系统调试 4.1 在PROTEUS7.5仿真步骤 1将程序在KEIL中编译,直到达到要求的功能为止; 2在PROTEUS中绘制硬件图(在PROTEUS仿真时可以不添加最小系统电路;实际电路中需要); 3将KEIL C中编译好的HEX文档加载到PROTEUS中; 4按下K1开始计数,按下K2可以清零。

键盘接口实验实验报告及程序

实验六键盘接口实验 姓名专业通信工程学号成绩 一、实验目的 1.掌握Keil C51软件与Protues软件联合仿真调试的方法; 掌握单片机的键盘接口电路; 掌握单片机键盘扫描原理; 掌握键盘的去抖原理及处理方法。 实验仪器与设备 1.微机1台C51集成开发环境3。Proteus仿真软件 实验内容 用Proteus设计一矩阵键盘接口电路。要求利用P1口接一4*4矩阵键盘。串行口通过一74LS164接一共阴极数码管。参考电路见后面。 用线反转法编写矩阵键盘识别程序,要求采用中断方式(列线通过4输入与门74LS20接/INT0),无按键按下时,数码管循环画“8”;有按键按下时产生中断并将按键的键值0~F通过串行口输出,在数码管上显示3秒钟后返回;返回后,数码管继续循环画“8”。 将P1口矩阵键盘改为8个独立按键(用中断方式设计),键盘通过74LS30(8输入与非门)和74LS04(六反相器)与/INT0相连,重新编写识别和显示程序。实验原理 矩阵键盘识别一般应包括以下内容: 判别有无键按下。 键盘扫描取得闭合键的行、列号。 用计算法火或查表法得到键值。 判断闭合键是否释放,如果没释放则继续等待。 将闭合键的键值保存,同时转去执行该闭合键的功能。 实验步骤 用Proteus设计键盘接口电路; 在Keil C51中编写键盘识别程序,编译通过后,与Proteus联合调试; 按动任意键,观察键值是否能正确显示。 电路设计及调试、程序 程序设计:矩阵键盘 #include<> #define uchar unsigned char #define uint unsigned int uchar code table1[]={0x00,0x01,0x21,0x61,0x65,0x6d,0x7d,0x7f}; uchar code key_table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0 xd7,0xb7,0x77};

中断法键盘扫描c程序

中断法键盘扫描c程序 /* 程序效果:按下按键,蜂鸣器响,数码管有相应的键值显示,按下E键继电器关,按下C键继电器开。 这与上一程序的功能相同,比上一程序简洁 但理解相对困难些。 运行平台:51hei单片机学习板 */ #include; //头文件 #include; #define uchar unsigned char //宏定义 #define uint unsigned int sbit jdq=P3^5; //位声明,驱动继电器管脚 sbit fmq=P3^4; //位声明,驱动蜂鸣器管脚 code uchar table[]={0x3f,0x06,0x5b,//数码管显示的数值 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; code uchar key_tab[17]={ //此数组为键盘编码 0xed,0x7e,0x7d,0x7b,

// 0,1,2,3, 0xbe,0xbd,0xbb,0xde, // 4,5,6,7, 0xdd,0xdb,0x77,0xb7, // 8,9,a, b, 0xee,0xeb,0xd7,0xe7,0xff}; // c,d,e,f, uchar l_key=0x00; //定义变量,存放键值 uchar l_keyold=0xff; //作为按键放开否的凭证 void readkey(); //扫描键盘,获取键值 void display(uchar *lp,uchar lc); //显示子函数void delay(); //延时子函数 void main() //主函数 { EA=1; //打开总中断 EX0=1; //打开外部中断 P0=0xf0; //键值高4位为高电平,低4位为低电平 while(1) { display(&l_key,1); //调用显示子函数 if(l_key==14) //是否按下E键,是则关闭继电器 jdq=1;

相关主题
文本预览
相关文档 最新文档