求一80C51单片机的C程序
求一80C51单片机的C程序,在P3.0口接一按键,P3.4与P3.5口各接一LED,如P3.0口1秒内按下了两次,则LED1亮,如1秒内按下了一次,则LED2亮。zhx...
求一80C51单片机的C程序,在P3.0口接一按键,P3.4与P3.5口各接一LED,如P3.0口1秒内按下了两次,则LED1亮,如 1秒内按下了一次,则LED2亮。
zhxiufan 你好!
选用你的例子,可怎么也调试不通。
已加了总中断按制 展开
zhxiufan 你好!
选用你的例子,可怎么也调试不通。
已加了总中断按制 展开
4个回答
展开全部
#include <reg51.h>
unsigned char num;
unsigned int flag;
sbit KEY=P3^0;
sbit LED1=P3^4;
sbit LED2=P3^5
void delay(viod) //延时,用于消抖
{
unsigned int i,j;
for(i=0;i<5;i++)
for(j=0;j<100;j++);
}
void InitTimer0(void) // 初始化T0函数 1MS
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt();
main()
{
InitTimer0(); //初始化T0
while(1)
{
KEY=1; // 按键给1 如果按下则为0
while(KEY); // 等待按键,如果没有按键行为,则程序在这里等待;
delay(); // 延时
if(~KEY) //消抖之后判断是否为按下,如果按下,则NUM加一;
{
num++
}
}
}
void Timer0Interrupt(void) interrupt 1 //T0中断函数 在中断函数中处理LED
{
EA=0; //关中断
TH0 = 0x0FC;
TL0 = 0x18;
flag++
if(flag==1000) //中断1000次 1S钟做一次判断
{
flag=0;
if(num=1) { LED1=1; LED2=0;} //如果 num=1,则说明按了一次;
else if(num=2) {LED1=0;LED2=1;} //如果num=2 ,则说明按了两次;
else { LED1=0; LED2=0;} //如果为0,或者按了三次以上,则不显示
num=0; //将NUM清零,一秒钟青一次;
}
EA = 1;
ET0 = 1;
TR0 = 1;
}
忘写思路了:在按键按一次 num 就加一次 然后在1S中判断一次num的值,如果num大于二或者小于0,则不显示,如果为1或者2则点亮相应的灯,然后在将num清零,记下一秒钟按键的次数;这种写法比较占资源,仅供参考,楼上用延时做的比较节省资源,如果是小程序的话建议使用。
unsigned char num;
unsigned int flag;
sbit KEY=P3^0;
sbit LED1=P3^4;
sbit LED2=P3^5
void delay(viod) //延时,用于消抖
{
unsigned int i,j;
for(i=0;i<5;i++)
for(j=0;j<100;j++);
}
void InitTimer0(void) // 初始化T0函数 1MS
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt();
main()
{
InitTimer0(); //初始化T0
while(1)
{
KEY=1; // 按键给1 如果按下则为0
while(KEY); // 等待按键,如果没有按键行为,则程序在这里等待;
delay(); // 延时
if(~KEY) //消抖之后判断是否为按下,如果按下,则NUM加一;
{
num++
}
}
}
void Timer0Interrupt(void) interrupt 1 //T0中断函数 在中断函数中处理LED
{
EA=0; //关中断
TH0 = 0x0FC;
TL0 = 0x18;
flag++
if(flag==1000) //中断1000次 1S钟做一次判断
{
flag=0;
if(num=1) { LED1=1; LED2=0;} //如果 num=1,则说明按了一次;
else if(num=2) {LED1=0;LED2=1;} //如果num=2 ,则说明按了两次;
else { LED1=0; LED2=0;} //如果为0,或者按了三次以上,则不显示
num=0; //将NUM清零,一秒钟青一次;
}
EA = 1;
ET0 = 1;
TR0 = 1;
}
忘写思路了:在按键按一次 num 就加一次 然后在1S中判断一次num的值,如果num大于二或者小于0,则不显示,如果为1或者2则点亮相应的灯,然后在将num清零,记下一秒钟按键的次数;这种写法比较占资源,仅供参考,楼上用延时做的比较节省资源,如果是小程序的话建议使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<reg51.h>
unsigned char flag,num,keyn;
sbit KEY=P3^0;
sbit LED1=P3^4;
sbit LED2=P3^5
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>20)
{
num=0;
flag=0xff;
}
}
void keyscan()
{
if(P1.0==0)
{
delay(10);
TR0=1; //有效按键启动定时器
if(P1.0==0)keyn++;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
num=0;
keyn=0;
while(1)
{
flag=0x00;
while(flag==0x00)//等待1秒定时结束
{
keyscan();
}
if(keyn==2)
{
LED1=0; //1秒内按两次键
LED2=1;
keyn=0;
TR0=0;
}
if(keyn==1)
{
LED1=1;
LED2=0; //1秒内按一次键
keyn=0;
TR0=0;
}
}
}
unsigned char flag,num,keyn;
sbit KEY=P3^0;
sbit LED1=P3^4;
sbit LED2=P3^5
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>20)
{
num=0;
flag=0xff;
}
}
void keyscan()
{
if(P1.0==0)
{
delay(10);
TR0=1; //有效按键启动定时器
if(P1.0==0)keyn++;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
num=0;
keyn=0;
while(1)
{
flag=0x00;
while(flag==0x00)//等待1秒定时结束
{
keyscan();
}
if(keyn==2)
{
LED1=0; //1秒内按两次键
LED2=1;
keyn=0;
TR0=0;
}
if(keyn==1)
{
LED1=1;
LED2=0; //1秒内按一次键
keyn=0;
TR0=0;
}
}
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<reg51.h>
#define uchar unsigned char
sbit key=P3^0;
sbit led1=P3^4;
sbit led2=P3^5;
void delay_50ms(uchar );
void main()
{
if(key==0)
{
delay_50ms(10);
led1=1;
led2=0;
if(key==0)
{
delay_50ms(10);
led1=0;
led2=1;
}
}
}
void delay_50ms(uchar i)
{
uchar j;
while(i--)
{
for(j=0;j<110;j++);
}
}
#define uchar unsigned char
sbit key=P3^0;
sbit led1=P3^4;
sbit led2=P3^5;
void delay_50ms(uchar );
void main()
{
if(key==0)
{
delay_50ms(10);
led1=1;
led2=0;
if(key==0)
{
delay_50ms(10);
led1=0;
led2=1;
}
}
}
void delay_50ms(uchar i)
{
uchar j;
while(i--)
{
for(j=0;j<110;j++);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//在P3.0口接一按键,P3.4与P3.5口各接一LED,
//如P3.0口1秒内按下了两次,则LED1亮,如 1秒内按下了一次,则LED2亮。
//试试下面的程序。
#include<reg51.h>
sbit KEY = P3^0;
sbit LED1 = P3^4;
sbit LED2 = P3^5;
void INIT_10ms()
{
TMOD = 0x01;
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256;
TF0 = 0;
TR0 = 1;
}
main()
{
unsigned char n_10ms;
while(1) {
while(KEY); //等待按键.
INIT_10ms(); //定时10ms
while(!TF0); //等待.
if (!KEY) { //如果确实按下了.
while(!KEY); //等待释放.
n_10ms = 0; //从零开始计时.
while(n_10ms < 100) {
if (!KEY) break; //再次按下就跳出.
INIT_10ms(); //定时10ms
while(!TF0); //等待.
n_10ms++;
}
if (n_10ms == 100) { LED1 = 0; LED2 = 1; }
else { while(!KEY); LED1 = 1; LED2 = 0; }//等待释放.
}
}
}
//如P3.0口1秒内按下了两次,则LED1亮,如 1秒内按下了一次,则LED2亮。
//试试下面的程序。
#include<reg51.h>
sbit KEY = P3^0;
sbit LED1 = P3^4;
sbit LED2 = P3^5;
void INIT_10ms()
{
TMOD = 0x01;
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256;
TF0 = 0;
TR0 = 1;
}
main()
{
unsigned char n_10ms;
while(1) {
while(KEY); //等待按键.
INIT_10ms(); //定时10ms
while(!TF0); //等待.
if (!KEY) { //如果确实按下了.
while(!KEY); //等待释放.
n_10ms = 0; //从零开始计时.
while(n_10ms < 100) {
if (!KEY) break; //再次按下就跳出.
INIT_10ms(); //定时10ms
while(!TF0); //等待.
n_10ms++;
}
if (n_10ms == 100) { LED1 = 0; LED2 = 1; }
else { while(!KEY); LED1 = 1; LED2 = 0; }//等待释放.
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询