‘壹’ 求一个c语言的红绿灯程序 80C51
#include<reg51.h>/*下面中n代表north. n s w e分别代表四个不同的方向*/
sbit rednts=P1^0;
sbit yellownts=P1^1;
sbit greennts=P1^2;
sbit redwte=P1^3;
sbit yellowwte=P1^4;
sbit greenwte=P1^5;//由于实验实的板只用了P1口作输入
int tmp1=0;
int tmp2=0;
int i;
void begins()
{
rednts=0;
yellownts=0;
greennts=0;
redwte=0;
yellowwte=0;
greenwte=0;
}
void TimeInt() interrupt 1 //这是中断函数,1对应是定时、计数器0
{
i++;
if(i==2000)
{
i=0;
tmp1++;
if(10==tmp1) tmp1=0;
}//若到了,得清0 //判断是否到了0.5MS*2000=1S}
void ExteriorInt() interrupt 0
{
tmp2=!tmp2;
}
void main()
{ //int time1s,time2s,time3;;
TMOD=0x02; //启用定时器工作模式2
TH0=6;//装定时器初值高8位,0.5ms中断一次 。2US*250=0.5MS
TL0=6;//装定时器初值低8位
EA=1; //打开总中断允许
ET0=1; //打开定时器0的中断允许
TR0=1; //T0工作1******以上是对定时器0的初始化********
TCON=0x11;//TCON的设置必须保持定时器0在工作
EX0=1;//********以上是对外部中断0的初始化***********
while(1)
{
if(tmp2)
{
begins();
rednts=1;
redwte=1;
}
else if(tmp1<3)
{
begins();
rednts=1;
greenwte=1;
}
else if(tmp1<4)
{
begins();
}
else if(tmp1<5)
{
yellownts=1;
yellowwte=1;
}
else if(tmp1<6)
{
begins();
}
else if(tmp1<7)
{
yellownts=1;
yellowwte=1;
}
else if(tmp1<10)
{
begins();
greennts=1;
redwte=1;
}
}}
‘贰’ 单片机C语言红绿灯程序,要求:数码管显示时间倒计时、16*16LED点阵显示模块显示红绿黄灯、
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define BLKN 2 //列锁存器数
sbit G = P1^7; //P1.7为显示允许控制信号端口
sbit RCLK = P2^0; //P2.0为输出锁存器时钟信号端
sbit SCLR = P2^1; //P2.1为移位寄存器清○端
void delay(uint); //延时函数
uchar data display[32]; //显示缓存
uchar code BMP[][32]={{16,0,16,0,37,248,36,64,120,64,8,64,16,64,32,64,124,64,0,64,0,64,12,64,112,64,3,252,0,0,0,0},
{16,0,19,240,32,16,41,240,120,16,19,252,32,64,122,72,1,80,0,224,25,80,102,76,0,64,1,192,0,0,0,0},
{4,64,4,64,63,248,4,64,127,252,1,0,31,240,17,16,31,240,17,16,31,240,8,32,16,16,32,8,0,0,0,0}}; //字模表'红‘’绿‘‘黄’
void main()
{
register uchar i,j;
SCON=0x00; //串口工作模式0:移位寄存器方式
TMOD=0x01; //定时器T0工作方式1:16位方式
P1=0x3f; //P1端口初值:允许接收、锁存、显示
TR0=1; //启动定时器T0
ET0=1; //允许定时器T0中断
EA=1; //开启总中断;
while(1)
{
delay(2000);
for(j=0;j<3;j++)
{
for(i=0;i<32;i++)
{
display[i]=~BMP[j][i];
if (i%2) delay(100);
}
delay(10000);
}
}
}
void delay(uint x)
{
register uchar i,j;
for (i=x;i>0;i--)
for (j=120;j>0;j--);
}
void leddisplay(void) interrupt 1 using 1
{
register uchar i, j=BLKN;
TH0 =(65536-100)/256; //设定显示屏刷新率每秒60帧
TL0 =(65536-100)%256;
i = P1; //读取当前显示的行号
i = ++i & 0x0f; //行号加1,屏蔽高4位
while(j)
{
j--;
SBUF = display[i*BLKN + j]; //送显示数据
while (!TI);
TI = 0;
} //完成一行数据的发送
G = 1; //消隐(关闭显示)
P1 &= 0xf0; //行号端口清○
RCLK = 1; //显示数据打入输出锁存器
P1 |= i; //写入行号
RCLK = 0; //锁存显示数据
G = 0; //打开显示
}
‘叁’ 用Keilc软件设计一个交通灯程序C程序
东西和南北的时间不同步,楼主没有说得很清楚
你把时间流程说清楚我可以把代码写出来
/败念/以下代码经过Keil C51软件调试通过
#include "reg51.h" //头文件包含
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define ON 0 //0的时候灯亮
#define OFF 1 //1的时候灯亮
//管脚定义
//南北道凯闹 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒
//东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒
sbit PortDX_Yellow = P1^0; //东西方向黄灯
sbit PortDX_Red = P1^1; //东西方向红灯盯枯罩
sbit PortDX_Green = P1^2; //东西方向绿灯
sbit PortNB_Yellow = P1^3; //南北方向黄灯
sbit PortNB_Red = P1^4; //南北方向红灯
sbit PortNB_Green = P1^5; //南北方向绿灯
void delay(uint ms) // 毫秒级延时(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}//112
}
}
/*==================== 主函数 ====================*/
void main(void)
{
delay(400); //开机延时400ms
while(1)
{
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮3秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮3秒
delay(3000);
PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮28秒
PortDX_Yellow = OFF;PortDX_Red = OFF;PortDX_Green = ON ;//东西绿灯亮28秒
delay(28000);
PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮2秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮2秒
delay(2000);
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮1秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮1秒
delay(1000);
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮2秒
PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮2秒
delay(2000);
PortNB_Yellow = OFF;PortNB_Red = OFF;PortNB_Green = ON ;//南北绿灯亮38秒
PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮38秒
delay(3800);
}
}
‘肆’ 急求KEIL C51 红绿灯程序!(用C语言!)
//12M晶振
//共阴数码管
#include<reg51.h>
sbitred=P1^0;
sbitgreen=P1^1;
sbityellow=P1^2;
bitflag=1;
unsignedcharcodean[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharcodewei[]={0xfd,0xfe};
unsignedchartime=35;
voidmain()
{
voidshow_time();
voidshow_light();
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
red=0;
while(1)
{
show_time();
show_light();
}
}
voidshow_time()
{
voiddelay();
unsignedcharnum=time,i;
for(i=0;i<2;++i)
{
P2=wei[i];
P0=an[num%10];
delay();
基悉 P0=0x00;
num/=10;
}
}
voiddelay()
{
inti;
for(i=1000;i;i--);
}
voidshow_light()
{
if(flag)
{
if(!time)
{
flag=0;
red=1;
green=0;
time=35;
}
}
else
{
if(time>0&&time<4)
{
green=1;
yellow=0;
}
搏指乎 if(!time)
{
yellow=1;
red=0;
逗空 flag=1;
time=35;
}
}
}
voiddec_sec()interrupt1
{
staticcount=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++count==20)
{
count=0;
time--;
}
}
‘伍’ 51单片机C语言程序:交通灯系统
这种问题一般没人会的,像 CSDN、程序员网 等等有类似的设计,你可以去看看
‘陆’ 单片机编程题目。c语言 交通红绿灯...额这个帮朋友问的,希望能得到一个原创答案,谢谢谢!再多分数也不足
给你一个思路:假设是单此雀伏纯的红绿灯,无黄森携灯的话,设红灯30秒,绿灯岁早30秒。需要两个状态量,方向Dir(1:东西,0:南北),东西灯颜色LightcolorEW,
‘柒’ 如何用c语言编程在单片机上做交通信号灯
硬件电路设计
此电中路设计采用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>
sfrp0=0x80;
sfrp1=0x90;
sfrp2=0xA0;
sfrp3=0xb0;//这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。
sbitsw=p0^0;
sbitOE=P0^6;
sbitLE=P0^7;//74LS373锁存器控制端定义
chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;
//函数声明begin
voiddelay1(intcount);
voiddelay_long(intnumber1,intnumber2);
voidpeople_car_drive();
//函数声明end
//***********************//延时子程序
voiddelay1(intcount)
{inti;
for(i=count;i>0;i--)
{;}
}
voiddelay_long(intnumber1,intnumber2)
{
inta,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{_nop_();}
}
}
//**********************//延时子程序
voidpeople_car_drive()
{
intp_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);//南北黄灯闪烁三秒完毕
}
voidmain()//主函数入口处
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各端口
{while(1)
{
if(sw==0)
{people_car_drive();}
else
{
p2=0x00;
p3=0x00;//关闭所有交通灯
}
}
}
}
‘捌’ C语言程序设计编写一个交通红绿灯的控制,各位高手帮帮忙急!
unsigned char counter;
sbit red_nb=P2^0;
......
void main()
{
TMOD=
TH0
TL0
ET0
TR0
while(1) //根据楼主所给,有4种状态
{
state1;
state2;
state3;
state4;
}
}
void timer0() interrupt 1 //定时器0
{
TH0=0x3c;
TL0=0xb0;
counter++;
}
void state1() //控制南北红灯亮,东西绿灯亮,30s
{
unsigned char temp = 30;
red_nb=1;
.....
green_dx=1;
while(1)
{
if( counter>19){counter=0;temp--} //每次counter=20,即1s,temp自减
if(temp) break; //当temp为0时,即30秒,退出状态1,进入状态2
}
}
没经过测试,完全是5分诱惑不大。。