C语言关于单片机单键控制灯三种状态问题

作者&投稿:惠尚 (若有异议请与网页底部的电邮联系)
单片机一个按键控制3个led灯,多种状态~

#include

sbit key =P1^1;
sbit led1=P1^2;
sbit led2=P1^3;
sbit led3=P1^4;
bit key_flag;
bit flag_500ms;

void InitTimer0(void)
{
TMOD |= 0x01;
TH0 = 0x3C;
TL0 = 0x0B0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
unsigned char stat;
void main(void)
{
InitTimer0();
key_flag=0;
stat=0;
while (1)
{
if (key_flag)stat++;
stat%=3;
switch (stat)
{
case 0:
led3=led2=1;
led1=flag_500ms;
break;
case 1:
led1=led3=1;
led2=flag_500ms;
break;
case 2:
led1=led2=1;
led3=flag_500ms;
break;
default :break;

}
}
}
unsigned char key_time,time_500;
void Timer0Interrupt(void) interrupt 1//50ms
{
TH0 = 0x3C;
TL0 = 0x0B0;
//add your code here!

key=1;
if (!key)key_time++;
else key_time=0;
if (key_time>5)
{
key_time=5;
}

if (key_time==4)key_flag=1;

if (time_500)time_500--;
else
{flag_500ms=1;time_500=10;}

}

#include
#define uchar unsigned char
uchar times,hour,min,sec;
uchar hour1,min1,sec1;
sbit LAMP=P0^0;
sbit key=P1^0;

void delay()
{
uchar i,j;
for(i=0;i<30;i++)
for(j=0;j<120;j++);
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(times>=20)
{
times=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
if((hour==hour1)&&(min==min1)&&(sec==sec1)
{
TR0=0;
LAMP=0;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
LAMP=1;
while(1)
{
if(key==0)
{
delay();
if(key==0)
{
times++;
times%=0x04;
switch(times)
{
case 0:times=0;hour=0;min=30;sec=0;TR0=1;break;
case 1:times=0;hour=1;min=0;sec=0;TR0=1;break;
case 2:times=0;hour=1;min=30;sec=0;TR0=1;break;
case 3:LAMP=1;break;
default:break;
}
}
}
}
}

//主要是延时防抖做得不好,按键在压下的头几毫秒都是不稳定的
//我写了个延时防抖的程序发上来
#include<stdio.h>
#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define FOSC 24000000 //晶振 设定24M 依实际定,常见的外部晶振有16M 24M 32M 40M等 这里定错了也没关系,顶多就是下面的时间单位不是预计的值罢了
#define TIME0_OUT 200
#define _TICT (uint)(FOSC/12/1000/(TIME0_OUT-1)) //T0每毫秒溢出次数
#define KEYON 0 //假定按下键后稳定为的低电平0 (依电路设计有可能是1为按下)
#define LIGHTON 0 //假定LED灯低电平时亮起 (实际有可能是高电平1亮起)
bit TICK_FLAG;
bit DIR;
uchar j;
uchar itime;
uchar idata RUN_MODE;
uint idata TIMESCONTS;
uint idata KEYTIME;
sbit light5 = P1^4;
sbit key1 = P3^4;
void init()
{
TMOD= 0x22;//计数/定时器0工作方式2 计数/定时器1工作方式2
TH0 = 256-TIME0_OUT;
TL0 = 256-TIME0_OUT;
ET0 = 1; //计数/定时器0允许发生中断
TF0 = 0; //清除中断标记
TR0 = 1; //T0开始计时
RUN_MODE = 4; //初始状态为关
//light5 = 1; //高电平关灯 初始时本来就是1,所以省了,如果是0为关灯,则这行与上 light5 = 0;
EA = 1; //开总中断
}
void delay(uint ms)
{//毫秒级延时函数 误差小于等于(1/_TICT)毫秒
uchar i;
while(ms-- > 0)
{
for(i=0; i<_TICT; i++)
{
TICK_FLAG = 0;
while(!TICK_FLAG);
}
}
}
void timer0() interrupt 1 using 1 //T0 中断1 模式2 自动装载
{
static uchar si = _TICT;
static uchar switchTmp,switchTmp1;
static bit tmpb;
si--;
TICK_FLAG = 1; // 时间信号 (1/TICK_FLAG) 毫秒/次
if(si==0) // 1毫秒处理一次
{
si = _TICT;
if(KEYTIME) //如果不等于0的话,每毫秒自减1直到0
KEYTIME--;
if(TIMESCONTS) //如果不等于0的话,每毫秒自减1直到0
TIMESCONTS--;
tmpb = ~tmpb;
if(tmpb)
{
if(DIR)//反向
{
if(itime) //每2毫秒自减1直到0
itime--;
}
else//正向
{
if(itime!=0xFF) //每2毫秒自加1直到255
itime++;
}
}
//软件防抖延时处理 移位法
if(key1==KEYON)
{
switchTmp = switchTmp<<1|0x01;
if(switchTmp==0xFF) //连继8个1认为是1
{
if(switchTmp1) //从按下开关到电平稳定只处理一次,需要松开后再按才会处理下一次
{
RUN_MODE++; // 1 - 4 循环
if(RUN_MODE>5)
RUN_MODE = 1;
switchTmp1 = 0;
}
KEYTIME = 60000; //按键松开后这个值会每毫秒衰减1直到0
}
}else{
switchTmp = switchTmp<<1; //连继8次0即认为是0
if( switchTmp == 0x00)
switchTmp1 = 1;
}
}
}
void main()
{
init();
BEGIN: //这里 定义一个自走节目:刚开机或超过1分钟无按键动作时 进行自走
DIR = 0; //正向
itime = 50; //从0开始
while(KEYTIME==0)
{
for(j=0xFF; j; j--) //模似PWM 亮度渐变
{
if(j>=itime)
light5 = (1-LIGHTON); //熄灯
else
light5 = LIGHTON; //开灯
}
if(itime==0xFF)
{
delay(10);//保持最亮10毫秒
DIR = 1; //开始减亮度
}
else if(itime==0)
{
delay(10); //保持熄灭10毫秒
DIR = 0; //开始增加亮度
itime = 50; //起始亮度(占空比太小时,其实都是没亮度的)
}
}
while(1)
{
if(RUN_MODE==1)
{
if(TIMESCONTS==0)
{
light5 = ~light5;
TIMESCONTS = 100;//100毫秒翻转一次也就是1秒闪了5次
}
}
if(RUN_MODE==2)
{
if(TIMESCONTS==0)
{
light5 = ~light5;
TIMESCONTS = 500;//半秒翻转一次,也就是1秒闪1次
}
}
if(RUN_MODE==3)
{
light5 = LIGHTON;
}
if(RUN_MODE==4)
{
light5 = (1-LIGHTON);
}
if(KEYTIME==0) //超过1分钟没有按键了,就跳到自走节目中
goto BEGIN;
}
}
//这个程序应当可以在你的电路上跑起来


C语言关于单片机单键控制灯三种状态问题
\/\/主要是延时防抖做得不好,按键在压下的头几毫秒都是不稳定的 \/\/我写了个延时防抖的程序发上来 include<stdio.h> include<reg52.h> typedef unsigned char uchar;typedef unsigned int uint;define FOSC 24000000 \/\/晶振 设定24M 依实际定,常见的外部晶振有16M 24M 32M 40M等 这里定...

单片机如何实现单键延时停止
单片机单键延时停止步骤。1、单片机在按键按一下点亮led时开端计数,直到按键抬起。2、再按键被按下时led灯灭,即可延时停止。

单片机一个按键控制一个程序
\/\/还可以多写几个键 void main(){ unsigned char zt=0;\/\/程序运行状态变量,用它来标定程序运行在哪个段 while(1){ \/\/按键扫描没加滤波这个如果有需要你自己加吧 if(~key1){zt=0;}\/\/当按键1按下时运行程序段0;if(~key2){zt=1;}\/\/当按键2按下时运行程序段1;if(~key3){zt=2;}...

51单片机汇编语言程序,一个按键控制两个发光二极管的同时闪烁,交替闪烁...
;P1.0 P1.1接2LED,P2.0接一按键。上电2LED不亮,按第1 次键2LED同时以1S周期闪烁,按第2 次 2LED轮流1S闪烁...同此循环。;11 04 17 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN:MOV TMOD,#01H ;MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB ET0 MOV R0,#10 K...

在51单片机中用c语言写程序实现用一个按键控制8个灯的亮和灭(按下按 ...
你首先要确定你的电路。选择什么单片机和数码管,8个按键最简单8个IO口控制。一般简单的是用三极管驱动数码管。如果你会C语言的话,很容易上手。自己先从控制1个数码管学,在控制2个数码管(2个数码管基本上可以完成上面试验,8个就可以类推)\\r\\n\\r\\n1、初始值为0:上电复位后,单片机驱动数码管...

需要一个单片机汇编语言程序:1个按键控制1个灯,此键每快速地按2下,灯...
双击功能。统计《按键释放》到《下次按键》的时间,很简单的。=== ;下列程序,已经经过实验检测,可以满足题目要求:;--- LED EQU P3.5 KEY EQU P3.7 ORG 0000H LJMP START ORG 0030H START:JB KEY,CALL DELAY10MS JB KEY, START JNB KEY,DAN_JI:CALL DELAY10MS ...

我想问一下关于51单片机单键识别的松手检测的问题
在这里加一个while语句的目的是防抖动,也就是说防止你按一下键,由于抖动的原因,而单片机响应好几下。比如你的按键接在P0.0上,sbit ds=p0.0 当你按下的时候ds=0,放手的时候又是1,所以应该是while(ds==0);这句话就是在等待你松手,你松手以后才继续执行命令 ...

用单片机的不同按键,来控制控制小灯的开启时间,不过程序运行时,单机按 ...
while(1){\/\/***按键开头***if(K1==0){s=0;LED1=0;if(s>=7)LED1=1;}if(K2==0){s=0;LED1=0;if(s>=14)LED1=1;} if(K3==0){s=0;LED1=0;if(s>=21)LED1=1;}if(K4==0){s=0;LED1=0;if(s>=28)LED1=1;}if(K5==0){s=0;LED1=0;if(s>=35)LED1=1;...

在51单片机中用c语言keil写程序实现用一个按键控制8个灯的亮和灭(按...
\/\/程序很简单也有很多方法都可以实现 。include <reg52.h> include "INTRINS.H"sbit k = P1^0; \/\/P1.0作为按键输入 int led=0xff;void main(){ P2 = led; \/\/led初始赋给P2口 while(1){ if(k==0) \/\/如果按键按下 { while(k==0); \/\/判断按键松开 led=~led;P2 = ...

51单片机C语言程序改错。程序功能是单键实现对5种亮灯方式的选择,却...
一楼说的很清楚了,还有一种方法就是用return,break是跳出循环,return是跳出函数,你可以直接在你的while(1)里面加入return,不过这样就达不到你的要求,所以你的这个方法还是用for循环把你的程序简单的修改下就是:include<reg52.h> sbitkey = P2^0;unsigned char a;unsigned char count = 0...

老城区15823491348: C语言关于单片机单键控制灯三种状态问题 -
潘纨排毒: 我觉得这两地方有问题 1.void delay(unsigned long int us) 形参的类型只要有unsigned long 就成定义变量为长整形,不用加int 在就是你的优化级别,级别太高会把像这样while(us--);的语句优化掉.没有延时效果. 2.num1=0;这个应该=1;吧 你后面switch里没有0的选项.

老城区15823491348: 单片机一个按键控制3个led灯,多种状态 -
潘纨排毒: #include <reg51.h>sbit key =P1^1; sbit led1=P1^2; sbit led2=P1^3; sbit led3=P1^4; bit key_flag; bit flag_500ms;void InitTimer0(void) {TMOD |= 0x01;TH0 = 0x3C;TL0 = 0x0B0;EA = 1;ET0 = 1;TR0 = 1; } unsigned char stat; void main(void) ...

老城区15823491348: 单片机用一个按键随意切换控制三种状态,1、半小时后关灯;2、1小时后关灯;3、1小时后关灯,再1小时开灯 -
潘纨排毒: 可以按一下按键,切换一种状态,也可以用短按,长按和双击来区分3种状态.

老城区15823491348: 单片机C语言,一个按键控制三个流水灯 -
潘纨排毒: void main() { int i=0; //设置参考变量 //初始化 p1.0=1; p1.1=0; p1.2=0; //进入按键操作 while(1) { if(p2.2==0) { i++; if(i==1) { p1.0=0; p1.1=1; p1.2=0; delay();//延时,由于不知道你用的单片机型号,这个需要你自己设定了. } if(i==2) { p1.2=1; ...

老城区15823491348: 单片机使用独立按键控制闪烁,呼吸,流水灯在这三种模式中能任意切换 求C语言源代码 -
潘纨排毒: 哈哈,我想一下,应该可以用条件来判断执行,按一执行一(同时加1)程序,再按按执行2程序,你能明白,程序你自己写哦.

老城区15823491348: 我想用单片机的一个按键控制8个发光二极管的发光样式,要三种样式,样式都要是循环的,用C语言来编写, -
潘纨排毒: 第一种方法:使用扫描的方法,一个大循环:先读按键状态,然后根据读出来的按键状态输出电平去控制LED 第二种方法:主函数是一个大循环,根据读出来的按键状态输出电平去控制LED.按键状态在中断程序里进行扫描.

老城区15823491348: 单片机16个灯每次以一个第二次两个第三次三个灯亮,用c语言怎么写数组更好求代码? -
潘纨排毒: 单片机C51编程问题:要实现一个开关控制两个灯,按要求两个灯有3种状态,就要声明一个变量,每按一下开关,变量加一,且变量取值为1,2,3,大于3再回1,又重复控制两个灯亮灭变化.变量加一后,就根据变量的三个值,去控制两个灯的三个状态了.用仿真实现,如下仿真图

老城区15823491348: 单片机C语言按键控制LED灯 -
潘纨排毒: 其实是一样的,也没什么哪个规范这一说,这个看个人习惯了首先if(SW13==0)是判断此引脚是否为0 (按键按下)然后一个delay用于按键防抖动 没被注释的那部分是靠if在次判断是否为0按下按下后执行LED_ON函数使LED亮然后通过while...

老城区15823491348: 51单片机中怎样用一个按键控制三种模式的流水灯,如控制流水灯流水速率(每按一下加速,到三后返回和第一次 -
潘纨排毒: #include <reg51.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit anjian = P1^0; //按键位 void delay(uint16 h) //延时程序 { while(h--); } main() { uint8 k = 0 , i = 0;P0 = 0xff; anjian = 1; while(1) {P0 = ~(1<<k++);if(anjian == 0) { delay...

老城区15823491348: 单片机 用C语言怎么编写用一个按钮,控制一盏灯的亮与灭的程序? -
潘纨排毒: 设按钮状态(高/低)输入某个IO口; 找到读取这个IO口的数据地址; 程序不断读取这个地址,并比较相应位是否有变化; (要有去抖处理,否则一次按键会产生多个变化) 设指示灯对应的IO口数据地址; 根据按键发生与否设置这个IO口相应位进行翻转.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网