单片机(C51)一个小程序,可以请帮忙在此程序中加入按键长按开机与长按关机功能,谢谢!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机(C51)一个小程序,可以请帮忙在此程序中加入按键长按开机与长按关机功能,谢谢!!!相关的知识,希望对你有一定的参考价值。

/********************************************************************
一个按键,三个LED,一个马达输出
上电进入待机状态,按下第一次按键后,红色LED点亮,马达工作5S,停止10S;
按下第二次按键后,绿色LED点亮,马达工作10S,停止15S;
按下第三次按键后,蓝色LED点亮,马达工作15S,停止20S;
按下第四次按键后,红色LED点亮,马达工作5S,停止10S;
...........................................以此循环
*********************************************************************/
/***********目前还需要写按键长按3S开机与长按3S关机功能**********/
/*******************
工作芯片:STC 15W101
********************/
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit Motor = P3^4;
sbit key = P3^5;
sbit r_led = P3^2;
sbit g_led = P3^1;
sbit b_led = P3^3;
u8 Motor_on[]=0,5,10,15;
u8 Motor_off[]=0,10,15,20;
u8 timer,i,aa,Motor_on_t;fang1 = 1;
void delay(u16 num)

u16 x,y;
for(x=num; x>0; x--)
for(y=110; y>0; y--)

;


void IO_Init(void)

Motor = 0;
r_led = 1;
g_led = 1;
b_led = 1;

void Set_Grade(u8 Grade)

switch(Grade)

case 1:
r_led = 0;
g_led = 1;
b_led = 1;
break;
case 2:
r_led = 1;
g_led = 0;
b_led = 1;
break;
case 3:
r_led = 1;
g_led = 1;
b_led = 0;
break;
default:
r_led = 1;
g_led = 1;
b_led = 1;
break;



void key_i (void)

while (1)

if (key == 1)

delay(10);
if (key == 0)

delay(10);
if (key ==0)

while(!key);
i++;
if (i < 4)

Motor_on_t = 0;
Set_Grade(i);
Motor = 1;
TR0 = 1;

else if( i >= 3)

Motor_on_t = 0;
i = 1;
Set_Grade(i);
Motor = 1;
TR0 = 1;
i = 1;




while (!key);
break;


void EC ()

if(fang1)

if (aa && Motor_on_t == Motor_on[i])

fang1 = 0;
Motor_on_t = 0;
Motor = 0;
if(!key)

timer = 0;
Motor_on_t = 0;



else if(aa && Motor_on_t == Motor_off[i] )

fang1 = 1;
Motor_on_t = 0;
Motor = 1;
if(!key)

timer = 0;
Motor_on_t = 0;




void tomd (void)

TMOD = 0X11;//设置TMOD,使得T0工作在16位定时器
TH0 = 0x4C;
TL0 = 0x00;
//TH0 = (65535-50000) / 256;
//TL0 = (65535-50000) % 256;//设置TH0/TL0 初值
EA = 1; //开放总中断
ET0 = 1;//开放定时器0的溢出中断
//TR0 = 1;

void main (void)

i = 0;
aa = 0;
//fang1 = 1;
IO_Init();
tomd ();
while(1)

key_i ();
EC ();


void timer_t0(void) interrupt 1//定时器0中断服务函数,入口

TH0 = 0x4C;
TL0 = 0x00;
timer ++;//每次中断自加
if(i >= 4)
i = 1;
aa = 1;
if (timer == 20)

timer = 0;
Motor_on_t++;

sbit key_st=P3^6;
void main (void)

u8 flagqt=0x5a;
u16 tcnt=0;
while(tcnt<3000)
    
    tcnt++;
    delay(1);
    if(key_st!=0)tcnt=0;
    
i = 0;
aa = 0;
//fang1 = 1;
IO_Init();
tomd ();
tcnt=0;
while(1)

key_i ();
EC ();

if(key_st==0)
    
    tcnt++;
    delay(1);
    if(tcnt>=3000) ((void(code *)(void))0x0000)();
    
    else tcnt=0;
追问

好像这样会一直在while(1)循环中出不来。还有以下两句可以说一下怎么理解吗?第一句是付值给一个变量,但是为什么要这样呢?第二句完全看不懂,可以解说一下吗
u8 flagqt=0x5a; if(tcnt>=3000) ((void(code *)(void))0x0000)();

来自:求助得到的回答
参考技术A 需要更改功能可以私信我

python程序执行报错,请大神帮忙看下

# -*- coding: cp936 -*-
#--conding: -utf-8--
#给出三角形的三条边长,判断该三角形的形状,并计算面积

_metaclass_=type

class sanJiaoXing:
mianji=0
p=0
def init(self):
a=int(raw_input("a="))
b=int(raw_input("b="))
c=int(raw_input("c="))
if a+b<c or a+c<b or b+c<a:
print "两边之和小于第三边,无法构成三角形"
elif a==b==c:
print "这个三角形是等边三角形"
elif a==b!=c or b==c!=a or a==c!=b:
print "这个三角形是等腰三角形"
elif a*a+b*b==c*c or a*a+c*c==b*b or b*b+c*c==a*a:
print"这个是直角三角形"
else:
print"这个是一般三角形"
def MianJi(self):
from math import sqrt
p=(a+b+c)/2
mianji=sqrt(p*(p-a)*(p-b)*(p-c))
print "三角形的面积为:%s" % mianji

test=sanJiaoXing()
test.init()
test.MianJi()
错误信息
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\python1\三角形判断.py", line 32, in <module>
test.MianJi()
File "C:\Users\Administrator\Desktop\python1\三角形判断.py", line 26, in MianJi
p=(a+b+c)/2
NameError: global name 'a' is not defined
>>>

支持xhkczxzz.

再来一个:

#!/usr/bin/env python
# coding: utf-8
#
# filename: triangle.py
# date: Feb., 2014
# author: Tim Wang

class Triangle(object):
    
    def __init__(self, a, b, c):
        self.lines = sorted([a, b, c])
        if self.lines[0] + self.lines[1] <= self.lines[2]:
            raise TypeError
    
    def category(self):
        if self.lines[0] == self.lines[1] == self.lines[2]:
            return u"等边三角形"
        category = u""
        if (self.lines[0] == self.lines[1] or 
                self.lines[1] == self.lines[2]):
            category += u"等腰"
        
        A = self.lines[0] ** 2 + self.lines[1] ** 2
        B = self.lines[2] ** 2
        if A == B:
            category += u"直角"
        elif A > B:
            category += u"锐角"
        else:
            category += u"钝角"
        return category + u"三角形"
    
    def perimeter(self):
        """周长"""
        return self.lines[0] + self.lines[1] + self.lines[2]

    def area(self):
        """面积(海伦公式)"""
        p = sum(self.lines)/2.
        return (p 
                * (p - self.lines[0]) 
                * (p - self.lines[1]) 
                * (p - self.lines[2])
                ) ** .5
    
    def R(self):
        """外接圆半径"""
        return (self.lines[0] 
                * self.lines[1] 
                * self.lines[2] ) / (4 * self.area())


tr = Triangle(3, 4, 5)
print tr.perimeter()
print tr.area()
print tr.R()
print tr.category().encode("utf-8")

参考技术A 把a\b\c改为:
self.a
self.b
self.c追问

多谢,多谢,
在这边的时候是不是应该添加break啊,
if a+b<c or a+c<b or b+c<a:
print "两边之和小于第三边,无法构成三角形"
我输入三边为1,2,1时,仍执行了下面的求面积的方法了。
可是我加了break会有问题,求大神再次帮忙看下。多谢多谢

追答看####class sanJiaoXing:
   mianji=p=0
   issanJiaoXing=False
   def __init__(self):  #######
       self.a=int(raw_input("a="))
       self.b=int(raw_input("b="))
       self.c=int(raw_input("c="))
       self.isSanjiaoxing(self.a,self.b,self.c)
   def isSanjiaoxing(self,a,b,c):  #######
       if self.a+self.b<=self.c or self.a+self.c<=self.b or self.b+self.c<=self.a:
           print "非三角形"
           self.issanJiaoXing=False ###
           return
       elif self.a==self.b==self.c:
           print "等边"
       elif self.a==self.b!=self.c or self.b==self.c!=self.a or self.a==self.c!=self.b:
           print "等腰"
       elif self.a*self.a+self.b*self.b==self.c*self.c or self.a*self.a+self.c*self.c==self.b*self.b or self.b*self.b+self.c*self.c==self.a*self.a:
           print"直角"
       else:
           print"一般"
       self.issanJiaoXing=True   ###
   def MianJi(self):
             ……
              p=(self.a+self.b+self.c)/2.0 ######
              ……
test=sanJiaoXing()
test.MianJi()

本回答被提问者采纳

以上是关于单片机(C51)一个小程序,可以请帮忙在此程序中加入按键长按开机与长按关机功能,谢谢!!!的主要内容,如果未能解决你的问题,请参考以下文章

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!

怎么把编好的程序烧录到8051或则AT89C51单片机上啊?

请教C51单片机,C语言编程,怎样把一个四位数存入(读取)外部数据存储器?请举例说明。

帮忙做一个超音波测距仪程序,c语言和汇编语言都行

c51单片机c语言交通灯的程序

模拟交通灯 单片机C51,要电路图和程序