打印
[其他模拟产品-信号链]

单片机简单交通灯怎么编程?

[复制链接]
2168|6
手机看帖
扫描二维码
随时随地手机跟帖
沙发
一两研发| | 2012-5-27 02:18 | 只看该作者
操作定时器  中断   在中断服务函数里面操作IO

使用特权

评论回复
板凳
flei123| | 2012-5-27 22:06 | 只看该作者
这个应该比较简单的编程,其实这个就是操作IO端口的问题,单片机来完成计算就可以了

使用特权

评论回复
地板
probug| | 2012-5-28 14:38 | 只看该作者
C也可以,比较简单。

使用特权

评论回复
5
kucher| | 2012-5-28 15:03 | 只看该作者
有了算法就好办了。语言很多都可以

使用特权

评论回复
6
hongong| | 2012-5-29 14:27 | 只看该作者
C语言  汇编语言

使用特权

评论回复
7
tee.| | 2012-5-29 14:33 | 只看该作者
内容:1、程序目的:使用定时器学习 倒计时 红绿灯原理
           主要程序与倒计时相同
        2、硬件要求:数码管、晶振12M
                3、P1口连接至LED用于显示红绿灯(p1接锁存器,八段数码管的位信号和断信号都通过p1口锁存起来,这样可以节省端口)
                4、数码管用于显示时间
------------------------------------------------*/
#include<reg52.h>//包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义

sbit LACTCH1=P2^2;   
sbit LACTCH2=P2^3;
/*------------------------------------------------
                 全局变量
------------------------------------------------*/
bit red,green,yellow,turnred;//定义红绿黄灯标志位



code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                                        //共阴数码管 0-9

unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
/*------------------------------------------------
              
------------------------------------------------*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*------------------------------------------------
              主程序
------------------------------------------------*/
main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82;   //打开中断
TR0=1;

P1=0xfc;    //红灯亮
red =1;
while(1)
  {
  P0=Dis_Shiwei;//显示十位
  LACTCH1=1;    //锁存
  LACTCH1=0;
  P0=0xfe;
  LACTCH2=1;    // 锁存
  LACTCH2=0;
  delay(300);   //短暂延时
  P0=Dis_Gewei; //显示个位
  LACTCH1=1;    //锁存
  LACTCH1=0;
  P0=0xfd;
  LACTCH2=1;    // 锁存
  LACTCH2=0;
  delay(300);
  }

}
/*------------------------------------------------
             定时器0中断函数
------------------------------------------------*/
void tim(void) interrupt 1
{
static unsigned char second=60,count; //初值99

TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
    {
    count=0;
    second--;//秒减1
        if(second==0)
           {
       if(red)
             {
                  red=0;yellow=1;
          second=5;
                  P1=0xF3;//黄灯亮5秒
                 }
           else if(yellow && !turnred)
             {
                  yellow=0;green=1;
          second=50;
                  P1=0xCF;//绿灯亮50秒
                 }
           else if(green)
             {
                 yellow=1;green=0;
         second=5;
                 P1=0xF3;//黄灯亮5秒
                 turnred=1;
                 }
       else if(yellow && turnred)
             {
             red=1;yellow=0;
                 P1=0xFC;//红灯亮60秒
         second=60;
                 turnred=0;
                 }

           }
        Dis_Shiwei=tab[second/10];//十位显示值处理
    Dis_Gewei=tab[second%10]; //个位显示处理
   
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

94

帖子

0

粉丝