职位关键字 工作地点
工作名称 公司名称 校园招聘
中国最好的工作搜索引擎!
  回复留言  
  单片机编程中的一个小问题!
作者: 我不懂就问你  01-01 08:00   回复  
 用C语言写一个小程序,按K1红灯亮10秒,按K2绿灯亮10秒.(按K1红灯亮后,再按K1无用;也就是说两灯只能交替点亮)

  回复:单片机编程中的一个小问题!
作者: aleda  01-01 08:00   回复  
 我来了 把程序给你写一下吧



没上机执行,你看一下 端口p1.1和p1.0驱动LED

两个中断作为按键



程序如下:

//晶振为12M 两个外中断口作为两个按键



#include <reg51.h>



#define LED1On P1^0=0 //用P1.0和P1.1作为输出分别驱动两个LED

#define LED1Off P1^0=1 //LED接电阻到电源,即端口输出0时点亮

#define LED2On P1^1=0

#define LED2Off P1^1=1



unsigned int TimeCount_10s; //定义10s延时计数

unsigned char TimeCount_Rem; //消除按键抖动延时



char K1Down,K2Down; //定义标志位,51里好像这个不能定义成sbit型式,忘了很久没用51了不过char型也没什么影响。用来判断哪个按键被按下了



void main()//主函数

{

INI();

while(1)//循环等待中断

{}

}



void INI()//初始化

{

TimeCount_10s=0; //初值

TimeCount_Rem=0;



K1Down = 0; //初始都没有按下

K2Down = 0;



TMOD = 0x02; //T0:8位定时自动重装

TH0 = 56; //256-56=200us

TL0 = 56;



TR0 = 1; //T0开始计数;



IE = 0x87; //开放T0,INT0,INT1;

}



void Time0() interrupt 1 //定时中断200us

{

if(K1Down)

{

if(++TimeCount_10s>50000)//200*50000=10s

{

TimeCount_10s=0;

K1Down = 0;

LED1Off;

}

}

else if(K2Down)

{

if(++TimeCount_10s>50000)//200*50000=10s

{

TimeCount_10s=0;

K2Down = 0;

LED2Off;

}

}



if(KEY1Down||Key2Down) //按键消抖

{

if(TimeCount_Rem<) //200*2500=500ms

TimeCount_Rem++;

else

IE|=0x05; //重新开外中断0和1

}

}

void KEY1() interrupt 0 //外中断0

{

if(!KEY1Down) //如果刚才KEY1未被按下,则才起作用

{

EX0 = 0; //关中断防止干扰

KEY1Down = 1; //标志置一

LED1On; //开LED

TimeCount_Rem=0;//消抖计数清零

}



}

void KEY2() interrupt 2 //外中断1

{

if(!KEY1Down) //如果刚才KEY1未被按下,则才起作用

{

EX1 = 0; //关中断防止干扰

KEY2Down = 1; //标志置一

LED2On; //开LED

TimeCount_Rem=0;

}

}

  回复:单片机编程中的一个小问题!
作者: aleda  06-30 15:24   回复  
 什么叫做行不行啊!

标 题:
内 容:
用户名:
 游客
 
 
Copyright©2005-2007, 版权所有 WWW.JOBMET.COM
ICP证:京ICP备06019556号