如何用c语言编程在单片机上做交通信号灯

作者&投稿:钮昭 (若有异议请与网页底部的电邮联系)
用C语言编写AVR单片机的交通信号灯控制程序~

兄弟,这个简单啊,最简单的用软件延时,不然就用定时器,

普通51的话需要模拟PWM,如果是加强版51有内置PWM模块,
PIC和AVR以及430还有STM也有集成PWM的型号!
如果是单纯输出方波的话就简单了。
程序如下:
//功能,按下P1_0的开关降低频率,按P1_1为升高频率
#include //引用AT89X52的库文件
#define uchar unsigned char //替换简称
#define uint unsigned int //替换简称
uchar sm;//定义临时变量
void delay_ms(uint ms)//延时子函数,一个循环12uS
{
while(--ms);
}
void T0_IRQ(void) interrupt TF0_VECTOR //定时器0中断函数
{
TH0=sm; //将变量赋予定时器0的高位
P2_0=!P2_0; //翻转IO
}
//寄存器初始化子函数
void mcu_init()
{
ET0=1;//开定时器0中断
EA=1; //开总中断
TMOD=0x01; //设置为16位定时器0
TH0=0xFF;//填充定时器高位
TR0=1;//开定时器0
sm=0xFF;//变量初始化
}
void main()//主函数
{
mcu_init();//调用初始化函数
while(1)//主循环
{
if((!P1_0)||(!P1_1)) //检测是否有按键按下
{
delay_ms(8333);//延时去抖
if(!P1_0)//如果是P1_0按键按下
{
while(!P1_0);//等待按键放手
if(sm)//检测变量不为0
{
--sm;//自减1
P2_1=1;//取消边界LED
}
else P2_1=0;//到达边界点亮LED
}
else if(!P1_1)//否则如果P1_1按键按下
{
while(!P1_1);//等待按键放手
if(sm<0xFF)//检测变量小于0xFF
{
++sm; //自加1
P2_1=1;
}
else P2_1=0;
}
}
}
}

硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

(1)电路连接图:

三、软件程序(C语言)

    以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。

//*****************************//
//程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.
//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器
//完成时间:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfr p0   = 0x80;
sfr p1   = 0x90;
sfr p2   = 0xA0;
sfr p3   = 0xb0;      //这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。
sbit  sw      = p0^0;
sbit   OE    =P0^6;
sbit   LE    =P0^7;  //74LS373锁存器控制端定义
char  display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;
//函数声明 begin
void  delay1(int count);
void  delay_long(int  number1,int number2);
void    people_car_drive();
//函数声明end
//***********************//延时子程序
void  delay1(int  count)
 { int  i;
   for(i=count;i>0;i--)
       { ;} 
 }
void  delay_long(int  number1,int number2)
  {
   int a,b;
 for(a=number1;a>0;a--)
   {
    for(b=number2;b>0;b--)
     { _nop_();     }
   }
    
  }
//**********************//延时子程序
 void   people_car_drive()
 {
   int   p_1=2,i,j=9,p_2=6;    //****************//行人通行时,延时20秒
          p2=0x09;                     //南北红灯亮
       p3=0x24;                     //东西绿灯亮
    
  while(p_1-->0)
     { LE=1;
    OE=0;
    if(p_1==0){OE=1;}            //当十位数减到0时,只显示个位数
    p1=display[p_1];
    delay1(1000);
    LE=0;  
    j=9;
     for(i=10;i>0;i--)
   { 
     if(p_1==0&&j==3)break;     //减到3时退出循环,让其黄灯闪烁显示
     p1=display[j--];
     delay_long(16000,2);
  if(sw==1)return;   
   }
   
     } 
   
//*******************************************************************************//
                  
     p2=0x12;                  //南北黄灯闪烁三秒,以提醒行人注意
     p3=0x12; 
  p1=display[3]; 
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;     
  delay_long(14000,1);
    
  p2=0x12;
  p3=0x12;
  p1=display[2];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);
  
  p2=0x12;
  p3=0x12;
  p1=display[1];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);
//*****************以下是车辆通行时延时60秒//
 
   p2=0x24;                 //南北绿灯亮
   p3=0x09;                 //东西红灯亮
  
     while(p_2-->0)
     { LE=1;
    OE=0;
    if(p_2==0){OE=1;}       //当十位数减到0时,只显示个位数
    p1=display[p_2];
    delay1(1000);
    LE=0;
    j=9;
     for(i=10;i>0;i--)
   { 
  if(p_2==0&&j==3)break;  //减到2时退出循环
     p1=display[j--];
     delay_long(16000,2);
  if(sw==1)return;     
   }
     }
   
     p2=0x12;                //南北黄灯闪烁三秒,以提醒行人注意
     p3=0x12; 
  p1=display[3]; 
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;     
  delay_long(14000,1);
    
  p2=0x12;
  p3=0x12;
  p1=display[2];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);
  
  p2=0x12;
  p3=0x12;
  p1=display[1];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);    //南北黄灯闪烁三秒完毕
 }
 
 void  main()               //主函数入口处
{
       p0=0x01;
       p1=0x00;
       p2=0x00;
       p3=0x00;               //初始化各端口
 { while(1) 
  {
     if(sw==0)
    {  people_car_drive();}
else
  {
   p2=0x00;
   p3=0x00;                    //关闭所有交通灯
  }
  }
  
 }
}


点错了,不好意思,过来看看高手们的编程思路。

#include <reg51.h>

#define uchar unsigned char

#define uint  unsigned int

sbit RED_A    = P0^0;

sbit YELLOW_A = P0^1;

sbit GREEN_A  = P0^2;

sbit RED_B    = P0^3;

sbit YELLOW_B = P0^4;

sbit GREEN_B  = P0^5;

uchar Flash_Count = 0, Operation_Type=1;

void DelayMS(uint x)

{

 uchar i;

 while (x--) for (i=0;i<120;i++);

}

void Traffic_Light()

{

 switch (Operation_Type)

 {

  case 1:

   RED_A=1;YELLOW_A=1;GREEN_A=0;

   RED_B=0;YELLOW_B=1;GREEN_B=1;

   DelayMS(2000);

   Operation_Type=2;

   break;

  case 2:

   DelayMS(300);

   YELLOW_A=!YELLOW_A;GREEN_A=1;

   if(++Flash_Count!=10) return;

   Flash_Count=0;

   Operation_Type=3;

   break;

  case 3:

   RED_A=0;YELLOW_A=1;GREEN_A=1;

   RED_B=1;YELLOW_B=1;GREEN_B=0;

   DelayMS(2000);

   Operation_Type=4;

   break;

  case 4:

   DelayMS(300);

   YELLOW_B=!YELLOW_B;GREEN_B=1;

   if(++Flash_Count!=10) return;

   Flash_Count=0;

   Operation_Type=1;

   break;

 }

}

void main()

{

 while(1) Traffic_Light();

}



看名字


用C语言编程:建立两个单链表(里面的元素要随机生成并按递增排序),合并...
我的这个程序完全满足你的要求,把分给我吧.include<stdio.h> include<stdlib.h> typedef struct LNode{ int data;struct LNode *next;}LNode,*LinkList;\/\/ void output(LinkList L){ LinkList p;p=L;p=p->next;while (p){ printf("%-4d",p->data);p=p->next;} printf("\\n");...

用c语言进行编程
include <stdio.h> \/\/ 学生结构体类型定义 typedef struct _STUDENT_{ char name[30];float score;} student_t;define STUDENT_COUNT 8 \/\/ 学生数 \/\/ 全局变量,用于保存学生信息 student_t list[STUDENT_COUNT];\/\/ 显示查找结果 void show(float min, float max){ printf("***\\...

C语言,单片机主要运用到那些?
二、直接调用EPROM中已固化的程序 笔者用的仿真机,由6位数码管显示,在内存DE00H处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:LCALL0DEOOH 在用C语言编程时,如何实现这一功能呢?C语言中有指向函数的指针这一概念,可以利用这种指针来实现用函数指针...

用c语言编程,统计文件中出现的单词的次数
include <iostream> include <fstream> include <string> include <vector> using namespace std;\/\/定义存储单词和出现次数的结构体 typedef struct{ string word;int num;}count;int main(){ vector<count> v; \/\/定义count类型的向量,动态存储count变量 count tempstr; \/\/临时存储count变量 tem...

用C语言编程
include <stdio.h>#include <stdlib.h>typedef char datatype;typedef struct node {datatype data;struct node *next;}*List,NODE,*pNode;List GetEmptyList() {pNode head = (pNode)malloc(sizeof(NODE));if(head == NULL) {printf("内存耗尽!\\n");exit(1);}head->next = NULL;...

怎么用C语言编程实现一个简单的动画
1.可以考虑用Turbo C的绘图函数(附加graphic.h库)或者用opengl+glut等来实现。 2.前者一般就是纯粹的画点画线。网上也能找到教程。3.主要说一下后者。可以导入图片,并且二维、三维动画都可以做,甚至是用来开发游戏。后者可以用vc6.0或者vs2005来开发。跨平台。参考教程: http:\/\/www.owlei.com...

C语言编程:26个英文字母建立单链表,可插入删除查找和求长度
include<stdio.h> include<malloc.h> typedef struct LNode {char character;struct LNode*next;}LNode,*PLNode;PLNode CreateList()\/*创建单链表*\/ {PLNode P,head,q;int i;head=(PLNode)malloc(sizeof(LNode));p=head;p->next=NULL;for(i=0;i<26;i++){q=(PLNode)malloc(sizeof...

用C语言编程,统计出一个文件中的单词和数据的个数之后,怎样将单词和...
这两个我测试过,符合你的问题 一个是数组,一个是指针,选用指针好些。include<stdio.h> int main(){ int num = 0, word = 0, i = 0;char str[40];gets(str);while(str[i] != '\\0'){ if(str[i] == ' '){ word = 0;} else { if(0 == word){ num++;word = 1;} ...

C语言编程 实现一个简单计算器的功能: + - * \/ 平方 开方,只能用到函数...
include<stdio.h>int main(){ int a,b; double c; char d; scanf("%d%c%d",&a,&d,&b); if('+' == d) c = a + b; if('-' == d) c = a - b; if('*' == d) c = a * b; if('\/' == d) c = a*1.0\/b; if(...

编程,用c语言编辑
编程,用c语言编辑  我来答 首页 在问 全部问题 娱乐休闲 游戏 旅游 教育培训 金融财经 医疗健康 科技 家电数码 政策法规 文化历史 时尚美容 情感心理 汽车 生活 职业 母婴 三农 互联网 生产制造 其他 日报 日报精选 日报广场 用户 认证用户 视频作者 日报作者 ...

天元区15212203965: 如何用c语言编程在单片机上做交通信号灯 -
夷封图婷: 硬件电路设计 此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯.硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字...

天元区15212203965: 设计单片机模拟交通信号灯,利用74ls244作为断码驱动器,74ls07作为位码驱动,用按键进行紧 -
夷封图婷: START: MOV DX,0FF80H INAL,DX ;读入数据 读出244的状态 MOVDX,0FF90H OUTDX,AL ;读出273 ,发光 JMPSTART CODE ENDS END START 这是,一个开关控制一个灯的情况,改上面的程序,一个开关控制八个灯,

天元区15212203965: 用C语言编写的交通灯控制程序 -
夷封图婷: 我用的是ATMEGA16单片机编程的,也是AVR单片机 假设PA0接红灯,PA1接黄灯,PA2接绿灯.高电平亮. 我的延时函数是ms延时,比如delay(1000)表示延时1000毫秒 void main() { DDRA|=BIT(0)|BIT(1)|BIT(2);//设置PA0,PA1,PA2口为输出...

天元区15212203965: 如何编写单片机交通灯实训C语言程序 -
夷封图婷: / delay(10); while(1) { RED_ZHU=1;/第三个状态 { GREEN_ZHU=~GREEN_ZHU.0592MHz *********************************************************/ sbit YELLOW_ZHI = P0^5;k--); } } } /.h> #includeRED_ZHU=0; // sbit GREEN_ZHI = P0^6; / GREEN_...

天元区15212203965: 请教高手用单片机设计交通信号灯 -
夷封图婷: 这个涉及电路连接 你把电路连好了,就可以写程序了 我就给你点提示 电路连接上,你可以直接使用单片机的I/O口来连接信号灯,显示时间的部分可以用数码管,中间可能需要驱动,看你的灯是什么样的了.此程序可以用汇编也可以用C语言,编写都很简单,要某灯亮,即在其对应的单片机的输出口上输出有效电平即可,例如SETB P1.0,至于数码管的显示,教程上都有举例的,上网也很容易找到例子.另外,还有延时和循环,这些上网都可以查到很多例子.其实都很简单,只要你设计好灯亮的规则

天元区15212203965: 51单片机(stc89c52)用c语言编程做一个交通灯,那么黄灯最后三秒闪烁程序该怎么写呢?数码管 -
夷封图婷: 0.5秒取反一次

天元区15212203965: 单片机交通灯实训C语言程序
夷封图婷: 你只要学过C语言,在keil环境下编程,把要控制的管脚在程序中声明,剩下的事就是c编程了

天元区15212203965: 用51单片机编写城市道路交通灯c语言程序,有左转右转 -
夷封图婷: #include<reg51.h>#define uchar unsigned char#define uint unsigned int sbit RED_A=P3^0; //东西向指示灯 sbit YELLOW_A=P3^1; sbit GREEN_A=P3^2; sbit RED_B=P3^3; //南北向指示灯 sbit YELLOW_B=P3^4; sbit GREEN_B=P3^5; sbit ...

天元区15212203965: 单片机编程:设计十字路口交通灯,以最常用的两条线路的交通信号控制为例. -
夷封图婷: ORG 0000H MAIN:MOV DPTR,#0FF20H MOV A,#03H MOVX @DPTR,A MOV 2AH,#1FH MOV P1,#0CH MOV R7,#19H PRG1: LCALL DELAY1 DJNZ R7,PRG1 MOV P1,#0AH MOV R7,#05H PRG2: LCALL DELAY1 DJNZ R7, PRG2 MOV P1,#...

天元区15212203965: 新学用C写单片机程序,编程实现交通灯红绿黄三灯交替延时亮灭,在用SBUF时遇到了问题. -
夷封图婷: 从SBUF里面取出来的是字符的ASCII码,如果只是单纯的数字的话,你可以考虑通过ASCII码减去0x30得到十六进制.因为 0的 ASCII是0x30, 1的ASCII码是 0x31,这里要注意的是比如你传送的是12345,从SBUF取值的时候应该是要取5次的,5个字符对应的ASCII码.如果你需要扩大的话,就需要先把这5个字符转为对应的十进制数12345,并存储在一个变量中(方便进行运算). 至于C语言,自己去琢磨吧.多写写总是有好处的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网