求助;51单片机编程问题
搜狐2011/03/09电子技术 IP:河北
       编一倒计时程序,要求计数p3—1  p3-2脚低电平时间 并以倒计时通过p1 p2口led显示出来,倒计时及显示程序都已完成,就是不知道怎么在显示倒计时的同时计数p3-1 p3-2的时间,其实就是倒计时红绿灯的程序,p3-1低电平时红灯亮 并倒计时
p3-2低电平时绿灯亮并倒计时。怎样通过计数p3-1 -2低电平的时间并赋值下一次循环的红 绿的倒计时 时间求各位帮忙。或者有现成成品双色倒计时红绿灯程序的朋友帮一下。谢谢。
来自:电子信息 / 电子技术
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
flynn
13年10个月前 IP:未同步
284764
可以用变量计数的方式啊,我技术不咋地,但是我写过几个交通灯,给你一个switch流的程序做参考吧(用keil咯)
/*********************************************************                              
-------------------------------------------------------
** 编写人:Flynn                   文件名:交通灯.c
** 描述:带倒计时的交通灯
******************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define w_xuan P2                //宏定义P2口为w_xuan,表示位选
sbit dx_red= P3^0;                //定义交通指示灯P3.0-P3.5
sbit dx_yellow=P3^1;
sbit dx_green=P3^2;
sbit nb_red=P3^3;
sbit nb_yellow =P3^4;
sbit nb_green=P3^5;

sbit key1=P1^0;                    //定义按键,满足紧急情况的指挥
sbit key2=P1^1;
sbit key3=P1^2;

/***********************
延时程序:delay()
功能:用于延时
***********************/
void delay(uint dly)
{
    uint i,j;
    for(i=dly;i>0;i--)
      for(j=250;j>0;j--);
}
uint b=28,c=25,ten1,one1,ten2,one2,temp1=0,temp2=0;  
uchar code a[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uint deng,xianshi,jishu;


/***********************
显示函数:disp()
功能:用于显示倒计时
***********************/
void disp(uint shi1,uint ge1,uint shi2,uint ge2)
{
          ten1=b/10;
          one1=b%10;
          
          ten2=c/10;
          one2=c%10;

        w_xuan=0xff;
        P0=a[ge1];
        w_xuan=0xfe;
        delay(2);
        w_xuan=0xff;
        P0=a[shi1];
          w_xuan=0xfd;
        delay(2);

        w_xuan=0xff;
        P0=a[ge2];
        w_xuan=0xef;
        delay(2);
        w_xuan=0xff;
        P0=a[shi2];
          w_xuan=0xdf;
        delay(2);
}

/***********************
按键函数:anjian()
功能:用于紧急情况的处理
***********************/
void anjian(void)
{
    if(!key1)
    {
        delay(10);
    while(!key1)
            {
                EA=0;
                nb_red=0;
                dx_red=0;
                nb_green=1;
                dx_green=1;
                nb_yellow=1;
                dx_yellow=1;
            }
    }
    if(!key2)
    {
        delay(10);    
     while(!key2)
     {
                 EA=0;
                nb_red=0;
                dx_red=1;
                nb_green=1;
                dx_green=0;
                nb_yellow=1;
                dx_yellow=1;
     }
    }
    if(!key3)
    {
        delay(10);
     while(!key3)
     {
                 EA=0;
                nb_red=1;
                dx_red=0;
                nb_green=0;
                dx_green=1;
                nb_yellow=1;
                dx_yellow=1;
     }    
    }
         EA=1;        
}

/***********************
初值函数:shuma_dis(void)
功能:用于给数码管倒计时赋初值
***********************/
void shuma_dis(void)
{

            if(xianshi>=200)
          {  
            xianshi=0;
            jishu++;
            b--;
            c--;
            if(b==0)
           {
               temp1=temp1+1;
            if(temp1==3)
            temp1=0;
        
             switch(temp1)
             {
                 case 0:b=28;break;
                case 1:b=25;break;
                case 2:b=3;break;    
             }
            }

            if(c==0)
            {  temp2=temp2+1;
             if(temp2==3)
             temp2=0;
            
            switch(temp2)
            {
            case 0:c=25;break;
            case 1:c=3;break;
            case 2:c=28;break;
            }

            }
           }
}
/***********************
交通灯指示函数:j_t_deng(void)
功能:用于处理交通灯的四种状态
***********************/
void j_t_deng(void)
{
    switch(deng)
        {
            case 0: dx_red=0;
                    nb_green=0;
                    dx_green=1;
                    nb_red=1;
                    dx_yellow=1;

                    break;

            case 1: dx_green=1;
                    nb_green=1;
                    nb_yellow=0;
                    nb_red=1;
                    dx_red=0;
                    break;

               case 2: dx_red=1;
                    dx_green=0;
                    nb_yellow=1;
                    nb_red=0;
                    nb_green=1;
                    break;

            case 3: nb_red=0;
                    dx_green=1;
                    dx_yellow=0;
                    nb_green=1;
                    dx_red=1;
                    break;
        }
    switch(jishu)
    {
        case 25:deng=1;break;
        case 28:deng=2;break;
        case 53:deng=3;break;
        case 56:deng=0;jishu=0;break;    
    }    
}
/***********************
初始化函数:ini()
功能:用于初始化定时器
***********************/
void ini(void)
{
    TMOD=0X01;
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    EA=1;
    ET0=1;
    TR0=1;
}
/***********************
主函数
***********************/
main()
{    
    ini();//初始化函数
    while(1)
    {
            anjian();
          disp(ten1,one1,ten2,one2);
            shuma_dis();
            j_t_deng();        
    }
    
}
void shijian() interrupt 1
{
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    xianshi++;
    
}
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh
13年10个月前 IP:未同步
284768
伟大的定时器~~~~~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
搜狐作者
13年10个月前 IP:未同步
284789
成品倒计时交通灯 是通过信号机给出P3-1低电平红灯亮 P3-2黄灯亮 P3-3绿灯亮并根据信号机控制的时间自动修正倒计时的时间 我就是不会怎么样根据信号机控制的时间自动修正倒计时的时间。这是我写的手动赋值的程序,怎么根据P3-1,P3-3低电平时间自动赋值Sec。著第二个定时器还没用上。

#include <reg52.h>

typedef   unsigned char  uchar;
typedef   unsigned int   uint;          
          
sbit  r = P3^1;        
sbit  y = P3^2;
sbit  g = P3^3;          
          
bit   control=0;




uchar  Count,Sec,n,numberr,numberg,s,t;

uchar code  LEDData[ ] = {0xdf,0x06,0xbb,0x2f,0x66,0x6d,0xfd,0x07,0xff,0xef,};
  
uchar data  display[4];

char code reserve [3] _at_ 0x3b;  //保留0x3b开始的3个字节

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

延时函数                                            

**********************************************************/
void delayms(uint ms)
{
   uchar t;
   while(ms--)
   {
     for(t = 0; t < 114; t++);
   }
}

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

独立键盘扫描子函数

*********************************************************/
void  keyscan()
{
   P3=0xff;                     //置P1端口为输入
  delayms(1);
                  
   if(P3 !=0xff)                //读P1口
   {
  
          
           if((r|control)==0)
        
          {            
              TR0=1;
              Sec= 18;  
            control=1;
                 if(Sec==0)
             {
            TR0=0;
             }
                
          

           if((g|control)==0)
          {
              TR0=1;          //启动运行
              Sec=14;      
               control=1; }
               if(Sec==0)
        
            {    TR0=0; }
            
             if((y|control)==0)
           {
            TR0=0;
               Sec=0;
                
           }





        }
        
     }
   }


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

主函数

*********************************************************/
main()
{
   P1=0x00;
   P2=0x00;
   Count=0x00;
   Sec=0;
   n=0x00;
   numberr=0x00;
   numberg=0x00;
  
   TMOD=0x01;
   TH0=0x4c;           //50ms定时
   TL0=0x00;      
   ET0=1;
  
   T2CON=0x00;         //设置T2CON寄存器        
   TH2=0xfc;           //1ms定时
   TL2=0x66;
   ET1=1;               //启用Timer2中断
   EA=1;               //总中断允许
   TR2=0;
   TR0=0;
                //启动定时器2
  
   while(1)
   {
      keyscan();
     led();
   }
}

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

  Timer0中断函数

**********************************************************/
void Timer0() interrupt 1
{
   TH0=0x4c;                 //50ms定时
   TL0=0x00;
   ++Count;
   if(Count==20)
   {
     Count=0;
     --Sec;            
      
     if(Sec==0)
     {
       TR0=0;
       control=0;
      // P1=0X00;
      // P2=0X00;    
          
     }
   }
}

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

  Timer2中断函数

**********************************************************/
void  timer1() interrupt 5
{
  

                      
   TH2=0xfc;                  
   TL2=0x66;

        
  
}

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

    显示子函数

/**********************************************************/
led()
{
     if(Sec!=0)
      {
            s  = LEDData[Sec/10];    
           t  = LEDData[Sec%10];
          
        if(Sec/10==0)
            {
                s=  0x00;
            }
            
               P1 = s;
            P2 = t;                      
              
        }
  }
/*************************************************************
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}