MSC-51中断综合应用

发布者:星空行者最新更新时间:2016-08-26 来源: eefocus关键字:MSC-51  中断 手机看文章 扫描二维码
随时随地手机看文章
定时中断和外部中断都用上了。

源程序如下:

#pragma REGPARMS CD DB SB OE OT(5) 

#include

typedef unsigned char byte;

typedef unsigned int word;

typedef unsigned long dword;

byte sec,ms,xs_en,shic; /*定义时间变量*/

sbit P2_0 = P2^0; //键盘输出1

sbit P2_1 = P2^1; //键盘输出2

sbit P2_2 = P2^2; //键盘输入1

sbit P2_3 = P2^3; //键盘输入2

sbit P2_4 = P2^4; //蜂鸣器

sbit P2_5 = P2^5; //继电器

sbit P2_6 = P2^6; //数码管1

sbit P2_7 = P2^7; //数码管2

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

函数功能: 延时程序

入口参数: 延迟时间

出口参数: 无

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

void Delay(byte time)

{

 byte i;

 for(;time > 0;time--)

  for(i=10;i > 0;i--);

}

/*LED数码管显示程序****************************************************

入口函数:要显示的值

出口函数:无

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

void xianshi(byte xs) //输入要显示的值

{

 byte code Seg[10]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};

 P0=0xff;//显示个位

 P2_7=1;

 P2_6=0;

 P0=Seg[xs%10];

 Delay(10); //延时程序

 P0=0xff;//显示十位

 P2_6=1;

 P2_7=0;

 P0=Seg[xs/10];

 Delay(10); //延时程序

}

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

函数功能:扫描键盘

函数入口:无

函数出口:有/无键按下 1/0

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

byte keyfun(void)

{

 byte P2copy;

 P2 &= 0xfc;

 P2copy = P2;

 if((P2copy & 0x04) && (P2copy & 0x08)) return 0;

 else

 {

  EA = 0;

  return 1;

 }

}

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

函数功能: 外部中断服务程序

入口参数: 无

出口参数: 无

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

void STOP1() interrupt 2  /*当ITN0中断时执行此函数*/

{

 ET0 = 1;

 xs_en = 1;

}

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

函数功能: 外部中断服务程序

入口参数: 无

出口参数: 无

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

void STOP0() interrupt 0  /*当ITN0中断时执行此函数*/

{

 if(xs_en)

 {

  xs_en = 0;

  ms = 0;

  sec = 0;

 }

 else

 {

  ET0 = 0;

 }

}

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

函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)

入口参数: 无

出口参数: 无

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

void Time0_Func() interrupt 1  /*当定时器中断时执行此函数*/

{

 TH0=(0xffff-9259)/256;/*10ms*/

 TL0=(0xffff-9259)%256;

 ms++;

 if(keyfun()) //当有键时,P2低四位置1,定时器中断禁止

 {

  P2 |= 0x0f;

 }

 else

 {

  if(ms == 99) {ms = 0; sec++;}

  if(ms % 5 == 0 && xs_en)

  {

   switch(ms / 5)

   {

    case 1 : P1 = 0x7f;  break;

    case 2 : P1 = 0x3f;  break;

    case 3 : P1 = 0x1f;  break;

    case 4 : P1 = 0x8f;  break;

    case 5 : P1 = 0xc7;  break;

    case 6 : P1 = 0xe3;  break;

    case 7 : P1 = 0xf1;  break;

    case 8 : P1 = 0xf8;  break;

    case 9 : P1 = 0xfc;  break;

    case 10: P1 = 0xfe;  break;

    default: P1 = 0xff;

   }

  }

 }

}

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

函数功能: 上电初始化函数

入口参数: 无

出口参数: 无

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

void Power_Up(void)

{

 TMOD = 0x01;/*Time0为16计数器*/

 TH0=(0xffff-9259)/256;/*10ms*/

 TL0=(0xffff-9259)%256;

 TR0=1;  //T0启动

 IT0 = 1; //外部中断为边沿触发

 IE=0x87; /*EA=1 ET0=1 EX0=1 EX1=1*/

 P1=0xff;

 P2=0xff;

}

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

函数功能: 键值扫描

入口参数: 无

出口参数: 键值

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

byte keyscan(void)

{

 byte i,j;

 P2 |= 0x0f;

 P2 &= 0xfe; //Key_1低电平

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

 {

  if(i)

  {

   P2 |= 0x0f;

   P2 &= 0xfd; //Key_2低电平

  }

  j = P2 & 0x0c;

  j >>= 1;

  if(j != 6) {return (i+j-1); break;}

 }

 return 0;

}

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

函数功能: 时间调整

入口参数: 无

出口参数: 无

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

void TiaoZ(void)

{

 byte sp=1,Keyc,Keyl;

 while(sp)

 {

  xianshi(shic);

  Delay(20);

  Keyc = keyscan();

  while(Keyc != Keyl)

  {

  xianshi(shic);

  Delay(20);

  switch(Keyc)

  {

   case 3 ://显示值加1

      shic++;  break;

   case 2 ://显示值减1

      shic--;  break;

   case 4 ://退出调整

      sp=0;

      while(Keyc == keyscan());

      Power_Up();

      break;

  }

  Keyl = Keyc;

  }

 }

}

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

函数功能: 主函数

入口参数: 无

出口参数: 无

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

void main()

{

 sec=0;  //初始化

 ms=0;

 xs_en=1;

 shic=10; //初始时长10秒

 Power_Up();  //初始化

 while(1)

 {

  if(EA == 0)  TiaoZ();

  if(ET0 == 0) {P1 = ~sec; xianshi(ms);}

  if(xs_en == 1) xianshi(ms);

 }

}

关键字:MSC-51  中断 引用地址:MSC-51中断综合应用

上一篇:51单片机汇编基础
下一篇:8051单片机的常见问题

推荐阅读最新更新时间:2024-03-16 15:07

Tiny4412中断控制器(GIC)之SGI软中断
//对于多核可以参考三星官方提供的linux源码,uboot中只是用了单核。 //下面代码只是用一个cpu核,采用SGI中断方式自己发自己收。 #include regs.h void enable_mmu(unsigned long ttb); void init_ttb(unsigned long *ttb_base); void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa); void memset(char *buf, char ch, int size); void memcpy(char *dst, char *src, int s
[单片机]
ATmega16 通用中断控制寄存器GICR
· Bit 1 – IVSEL: 中断向量选择 当IVSEL 为 0“ 时,中断向量位于Flash 存储器的起始地址;当IVSEL 为 1“ 时,中断向量转移到Boot 区的起始地址。实际的Boot 区起始地址由熔丝位BOOTSZ 确定。具体请参考P234“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。 为了防止无意识地改变中断向量表,修改IVSEL 时需要遵照如下过程: 1. 置位中断向量修改使能位IVCE 2. 在紧接的4 个时钟周期里将需要的数据写入IVSEL,同时对IVCE 写”0” 执行上述序列时中断自动被禁止。其实,在置位IVCE 时中断就被禁止了,并一直
[单片机]
ATmega16 通用<font color='red'>中断</font>控制寄存器GICR
stm32 嵌套向量中断控制器NVIC
嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。 嵌套向量中断控制器管理着包括内核异常等中断 NVIC 相关的函数包含在 misc.c 文件中 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) void NVIC_SystemLPConfig(uint8_t LowPower
[单片机]
stm32 嵌套向量<font color='red'>中断</font>控制器NVIC
51单片机常用的特殊功能寄存器
PSW(Program Status Word) 中断: IP(Interrupt Priority) IE(Interrupt Enable) 串口: SBUF(Serial Buffer) SCON(Serial Control) 定时器: TMOD(Timer Mode) TCON(Timer Control) 电源: PCON(Power Control)
[单片机]
STM32串口中断的一些资料
在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里。以供自己查阅,以及方便其他人。 TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理的方式,从队列以及FIFO方面写起。 SECTION 1 SECTION 2 先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为 发送后中断 。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下 /* 功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位. 输入:字符串的首地址 输出:无 */ void U
[单片机]
51单片机 (6)串口中断通信+定时器2串口中断
51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2 #include reg52.h void DelayMs(unsigned int i); void SerialInit(); void SendByte(unsigned char sbyte); void SendString(unsigned char *pstr); void main(void) { SerialInit(); while(1); //注:必需要无限循环 } /* //单片
[单片机]
STM32F103VET6——ADC单通道中断读取实验讲解
编程要点 Define GPIO ADC_InitTypeDef ADC时钟 通道的转换顺序和采样时间 使能ADC转换完成中断 使能ADC转换开始 校准ADC 选取ADC转化触发源 配置中断优先级 编写中断服务函数 main函数 /*-----GPIO-----*/ static void ADC_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = ADC_PIN; //必须为模拟输入 GPIO
[单片机]
基于USB总线和89C51单片机的数据采集系统设计
在工业生产和科学技术研究过程的各行业中,常常要对各种数据进行采集,现在常用的采集方式是在PC机或工控机内安装数据采集卡,如A/D卡及RS-422卡、RS-485卡。采集卡不仅安装麻烦,易受机箱内环境的影响,而且由于受计算机插槽数量和地址、中断资源的限制,不可能挂接很多设备。而通用串行总线(Universal Serial Bus,简称USB)的出现能很好地解决以上这些冲突。我们利用89C51单片机设计了基于USB总线的数据采集设备,并可与MAX485结合起来实现数据的远程采集。 系统硬件设计 USB数据采集系统硬件模块主要由串行A/D转换器、89C51芯片、USB接口芯片和多路模拟开关等组成。硬件总体结构框图如图1所示。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved