2009-12-02 23:34:00 zhouhuozhi 阅读数 1580

单片机控制交通灯V1.0

要求:

1)、十字路口南北、东西方向各装有绿、黄、红指示灯,南北通行时间为15s,东西通行时间为10s,当由绿灯变为红灯前的3s内,绿灯灭而黄灯亮。

2)、通行时间各由两位7LED显示器指示,且为倒时间指示(即从1510逐次减一,禁止通行时显示器灭)。

3)、当某方向显示红灯时,容许人工干预强行改变两个方向的指示灯颜色,以让救护车之类的车辆通行,但发出改变通行命令后有3s时间使显示绿灯的方向改变显示黄灯,并以每秒10次的频率闪烁,以示警告。

 

小结:本实验用ISIS 7 ProfessionalKeil uVision2仿真,由于是学单片机以来做的第一个实验,在南北、东西两个方向四个数码管倒计时那里控制得不好,用动态描扫实现,闪烁比较明显,希望在后面的理论学习中找到更好的实现方法。

 

 

 

参考源程序:

#include"reg52.h"

 

#define uchar unsigned char

#define uint unsigned int

 

 

sbit one=P3^4;      //数码段位选控制

sbit two=P3^5;

sbit three=P3^6;

sbit four=P3^7;

 

sbit d_lu=P0^1;

sbit d_huang=P0^2;

sbit d_hong=P0^3;

 

sbit x_lu=P2^1;

sbit x_huang=P2^2;

sbit x_hong=P2^3;

 

sbit n_lu=P2^4;

sbit n_huang=P2^5;

sbit n_hong=P2^6;

 

sbit b_lu=P0^4;

sbit b_huang=P0^5;

sbit b_hong=P0^6;

 

uint fangxiang=0;

uint m,n,k;

 

code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//7LED对应于数字'0','1'...'9'

void delay(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--);

}

 

 

 

void delayMs(uint timer_num, uint fxang)

{

    uchar aa,bb,j;

    TMOD=0x10;                  //设定T1为方式1

    TR1=1;                      //启动定时器工作 

    fangxiang=fxang;                          

    for(j=0;j<10;j++)           //每隔100ms中断一次,中断10次为1s

    {

        TH1=0x3c;                   //定初值                  

        TL1=0xb0;

        if(fxang==0)            //东西方向通行

        {

           do

                       {

                aa=timer_num/10;

                bb=timer_num%10;

                one=1;          //数码管动态扫描,位选

                     two=0;

                three=0;

                four=0;

                P1=tab[aa];     //数码管动态扫描,段选

                delay(50);

 

                     one=0;

                     two=1;

                three=0;

                four=0;

                P1=tab[bb];

                delay(50);

            }while(!TF1);

                     

            TF1=0;

          }

         else

            if(fxang==1)        //南北方向通行

            {

                           do

                           {

                    aa=timer_num/10;

                    bb=timer_num%10;

                    one=0;

                         two=0;

                         three=1;

                         four=0;

                    P1=tab[aa];

                    delay(50);

 

                         one=0;

                         two=0;

                         three=0;

                         four=1;

                    P1=tab[bb];

                    delay(50);

                 }while(!TF1);

                TF1=0;

             }

    }

}

 

void zhuangtai_1() 

{

  d_lu=0;

  d_hong=1;

  d_huang=1;

 

  x_lu=0;

  x_hong=1;

  x_huang=1;

 

  n_hong=0;

  n_huang=1;

  n_lu=1;

 

  b_hong=0;

  b_lu=1;

  b_huang=1;

 

 

}                                 

 

void zhuangtai_2()      

{

  d_lu=1;

  d_huang=0;

  d_hong=1;

 

  x_lu=1;

  x_huang=0;

  x_hong=1;

 

  n_hong=0;

  n_huang=1;

  n_lu=1;

 

  b_hong=0;

  b_huang=1;

  b_lu=1;

}

void zhuangtai_3() 

{

  d_lu=1;

  d_huang=1;

  d_hong=0;

 

  x_lu=1;

  x_huang=1;

  x_hong=0;

 

  n_hong=1;

  n_huang=1;

  n_lu=0;

 

  b_hong=1;

  b_huang=1;

  b_lu=0;

 

}

void zhuangtai_4()  

{

    d_lu=1;

    d_huang=1;

    d_hong=0;

 

    x_lu=1;

    x_huang=1;

    x_hong=0;

 

    n_hong=1;

    n_huang=0;

    n_lu=1;

 

    b_hong=1;

    b_huang=0;

    b_lu=1;

}

 

void exint0(void) interrupt 0   //人工干预,外部中断0实现

{

    EA=0;

   

    one=0;                      //关闭所有数码管

    two=0;

    three=0;

    four=0;

    TMOD=0x10;                  //设定T1为方式1

    TR1=1;                      //启动定时器工作                                    

    for(m=0;m<30;m++)           //改变通行命令后3s

    {

        TH1=0x3c;                   //定初值                  

        TL1=0xb0;

         do

             {

            delay(50);

            delay(50);

        }while(!TF1);

        TF1=0;

    }

   

    if(fangxiang==0)            //fangxiang为产生外部中断时通行的方向,0为东西方向

    {

        n_hong=0;

        b_hong=0;

        d_lu=1;

        x_lu=1;

        for(n=0;n<10;n++)       //使黄灯每秒闪10

             {

            TR1=1;              //启动定时器工作 

            TH1=0x3c;               //定初值                  

            TL1=0xb0;

                 do

                       {

                delay(100);

            }while(!TF1);

            TF1=0;

                      

            d_huang=0;

            x_huang=0;

            delay(1000);

            d_huang=1;

            x_huang=1;

             }

    }

    else                        //产生中断时,通行方向为南北方向

    {

        d_hong=0;

        x_hong=0;

        n_lu=1;

        b_lu=1;

        for(k=0;k<10;k++)//每秒10

             {

            TR1=1;              /* 启动定时器工作 */

            TH1=0x3c;           //定初值                  

            TL1=0xb0;

                 do

                       {

                delay(100);

            }while(!TF1);

            TF1=0;

                      

                               

            n_huang=0;

            b_huang=0;

            delay(1000);

            n_huang=1;

            b_huang=1;

             }

    }

 

    EA=1;

}

    

 

main()

{

    int i;

    TCON=0x55;

    IE=0x81;

    while(1)

    {

            for(i=10;i>=4;i--)      //东西通行10s

                 {

                zhuangtai_1();

                delayMs(i,0);

            }

            for(i=3;i>=0;i--)              

            {

                zhuangtai_2();

                delayMs(i,0);         

                  

             }

                      

            for(i=15;i>=4;i--)      //南北通行15s              

            {           

                zhuangtai_3();

                delayMs(i,1);

                       }

                   

            for(i=3;i>=0;i--)

            {

                zhuangtai_4();           

                delayMs(i,1);                                      

            }                            

     } 

}                       

                    

               

                            

  

 

 

2012-07-03 22:08:01 Dreamfine 阅读数 817
http://dfshare.35free.net/

单片机寄存器自动配置工具 v1.0 上线了,熬了二天,搞这个免费的东东,当是为人民服务吧。
发扬共享精神,让苦逼的程序员轻松一点。


2016-10-05 19:36:17 qq_26654257 阅读数 551

1电阻分压 

优点:成本低、结构简单

缺点:随着负载的变化,输出电压也会产生波动.此外,这种电路的无功功耗也比较大

2 直接采用电源模块

优点:可靠性和效率高

缺点:价格昂贵

3利用线性稳压电源转换芯片

综合以上优缺点

2015-02-08 12:49:15 IC852421703 阅读数 8975

普中科技单片机在淘宝上买了很久了,一直没用,现在要做设计,就拿来看看。这一看不要紧,刚开始就坑死人了写不进程序。研究了一晚上。其实很简单就是短路帽没接对。

 

l 开发板:普中Prechin HC6800-EM3 v2.2

l 兼容:HC6800-EM3 v3.03.0版本是2.2升级版,只有很少的区别,这个大家可以淘宝上有很多3.0版,看看下面的说明一般会有两者对比,所以也适用于3.0版)

l 问题:无法下载程序,附带光盘教程的几个关于下载程序的文档严重与2.2版本不一致。我找了半天也没有找到J0,也饿没有找到auto/on.。正是因这个,下载程序才失败。

l 参考文档:步骤一中的 软件安装指导.pdf 以及 51单片机下载说明.pdf

步骤安装单片机开发相关软件\烧录软件 这个目录下的 使用官方软件下载.doc

只要重点看第二个以及第三个文档就行了。其他参考。

l 解决:按照51单片机下载说明.pdf 的说明做,如果失败,一定要看最后一张图这张图与2.2版一致,按图上说的接短接帽就是红色的。我的是按图上的标注还是不行,结果是因为没标注的部分连接错误我做了两个补充红色方框:OK解决。其中接HH就是接下面。

l 以上是普中烧录。我在用STC官方软件烧录,结果不用改动开发板的短路帽就可以下载。这个参考软件安装指导.pdf 的使用官方烧录软件部分,只参考他那个软件的使用即可如下图所示:

。上面提到的第三个文档作参考即可。

2019-09-17 22:49:51 weixin_43890924 阅读数 7

立即学习:https://edu.csdn.net/course/play/3554/61824?utm_source=blogtoedu

单片机编程的一般步骤

1.目标分析。我们的目标是点亮开发板上的LED灯。

2.原理图分析

1)目标器件(LED)工作原理

2)相关模块电路连接

3)控制路线分析:相关IO端口是哪些?

3.代码编写、编译

4.下载与调试

 

没有更多推荐了,返回首页