
我实训是做了这个项目,发给你看看,功能主要和交通灯的差不多,还可以显示具体的时间,跳转的时候,时间是倒计时的,当到0以后,下面灯转换
#include<reg51h>
unsigned int shi,ge,js;
void delay(unsigned char i);
sbit P2_0=P2^0;
sbit P2_1=P2^1;
unsigned int i=0;
unsigned char key_press();
unsigned char key_scan();
unsigned int m=0;m2=0;n1=6;n2=2;
void TIMERO_1();
void TIMERO_0();
unsigned char led[4]={0xee,0xdb,0xf5,0xdb};
unsigned char code tabe[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x00};
unsigned char num;
unsigned char key_scan()
{ unsigned char hang,lie,key;
P3=0x0f;
if(P3!=0x0f)
delay(100);
if(P3!=0x0f)
{
switch(P3&0x0f)
{
case 0x0e:hang=0;break;
case 0x0d:hang=1;break;
case 0x0b:hang=2;break;
//case 0x07:hang=3;break;
}
P3=0xf0;
switch(P3&0xf0)
{
case 0xe0:lie=0;break;
case 0xd0:lie=1;break;
case 0xb0:lie=2;break;
case 0x70:lie=3;break;
}
while(P3!=0xf0);
key=hang4+lie;
}
// else
// key=12;
return (key);
}
unsigned char key_press()
{
unsigned char temp,key_flag;
P3=0x0f;
delay(100);
temp=P3;
if (temp!=0x0f)
{
key_flag=1;
}
else
{
key_flag=0;
}
return key_flag;
}
void TIMERO_0() interrupt 1
{
TH0=0X3C;
TL0=0XB0;
m++;
if(m==20)
{
m=0;
n1--;
shi=n1/10;
ge=n1%10;
}
if(n1==0)
{i=i+1;
n2=3;
TR1=1;
TR0=0;
}
//if(ge==0)
//{ge=2;}
}
void TIMERO_1() interrupt 3
{
TH1=0X3C;
TL1=0XB0;
m2++;
if(m2==20)
{
m2=0;
n2--;
shi=n2/10;
ge=n2%10;
}
if(n2==0)
{
i=i+1;
n1=js;
TR0=1;
TR1=0;
if(i== 4)
{
i=0;
}
//if(ge==0)
//{ge=js;}
}
}
void display(unsigned char a,b,c,d,e,f)
{
P2_1=1;
P2_0=0;
P0=0x20;
P2_0=1;
P2_1=0;
P0=tabe[a];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0X10;
P2_0=1;
P2_1=0;
P0=tabe[b];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x08;
P2_0=1;
P2_1=0;
P0=tabe[c];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x04;
P2_0=1;
P2_1=0;
P0=tabe[d];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x02;
P2_0=1;
P2_1=0;
P0=tabe[e];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x01;
P2_0=1;
P2_1=0;
P0=tabe[f];
delay(10);
P0=0x00;
delay(10);
}
void main()
{
TMOD=0X11;
TH0=0X3C;
TL0=0XB0;
TH1=0X3C;
TL1=0XB0;
ET1=1;
ET0=1;
EA=1;
P1=0XFF;
while(1)
{
P0=0;
if(key_press())
{ num=key_scan();
if(num<=9)
{
shi=ge;
ge=num;
js=shi10+ge;
n1=js;
}
if(num==10)
{
TR0=0;
TR1=0;
shi=ge;
ge=num;
}
if(num==11)
{
TR0=1;
i=0;
js=shi10+ge;
}
}
P1=led[i];
display(12,12,12,12,shi,ge);
}
}
void delay(unsigned char i )
{
unsigned char j, k;
for(k=0;k<i;k++);
for(j=0;j<255;j++);
}
你好,
关于C#中timer类 在C#里关于定时器类就有3个 (winform3个,wpf1个我们这里不说)
1定义在SystemWindowsForms里 工具拖放(不精确)
2定义在SystemThreadingTimer类里 计时精确
3定义在SystemTimersTimer类里 计时精确(对前者封装,增加了一些特性)
你这个从代码上看应该是用的第1个控件, 该计时器使用消息循环机制来取代线程池产生消息的机制,意味着Tick事件总是在创建timer的那个线程上执行(一般就是你的主线程),同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息,换句话说, 也意味着可能会无限期的把实际要用的5秒计时变为100秒 1000秒
虽然计时不精确,但是是单线程,永远只执行一个,不会出现同一时间两次执行(也就是说不会出现两个线程同时执行这段代码,所以是线性安全的!!!!!这个用在交通灯上面很好,但是,这个不应该是工业级的代码,这段代码不安全因为如果系统突然出现问题,这个程序 会有时间差,如果是一个软件中的一个计时器控制一个十字路口的多个红绿灯就没有问题,但是如果这个软件有多个计时器,那么还是可能会在极端情况下,出现问题的,老兄,你这代码不要真用于工作啊罗嗦了,O(∩_∩)O)
你的系统每规定时间执行void timer1_Tick()这个方法
下面的文字乱糟糟的,你放在vs2012之类的编辑器中重新格式化一下
Graphics g =thisCreateGraphics();//创建图形
if (intTime!= 0) //这个变量是外部定义的
{
if(intTime < 10) //如果小于10 ,按照里面的代码说,是10 9 8 7 6 5这样减少,一直到0就停止,顺道再把 intTime 设置为5 ,搞不懂这样写代码的意义,可能代码外面还有其他作用吧
{
label1Text = "0" + intTimeToString();//将控件值弄为 09 06 04之类的值
label1ForeColor = ColorRed;//并且label1的文字颜色变为红色 }
else
{
label1Text = intTimeToString();//否则就刷新0-9的值在label1空间商
label1ForeColor = ColorRed;//颜色依然是红色
}
intTime--;//减去1,
intFalg= 1;//这是外部变量, 标志为1 (估计这个就是你说的交通灯切换信号,至于1是红色还是绿色,你调试程序的时候才知道啊)
getFillColor();//填充图形,这是外部方法
}
else //如果intTime ==0
{
label1Text = "0" + intTimeToString();//写成"00"
timer1Enabled = false;//计时器停止工作/
intFalg= 0;//信号设置为0
intTime= 5;//同时将外部值intTime设置为5
timer1Enabled = false;//当前计时器不可用 (也就是停止工作了)
timer3Enabled = true;//另外一个计时器可用,是否立即执行,看这个的设置(timer3这个可以用了,但是是不是立即执行,是有一个设置的,在vs的编辑器里面,你找找属性,里面有一个规定,规定了timer是立即执行一次,然后循环,还是完全不执行等待系统调用,然后循环(这是两种工作模式))
}
东西和南北的时间不同步,楼主没有说得很清楚
你把时间流程说清楚我可以把代码写出来
//以下代码经过Keil C51软件调试通过
#include "reg51h" //头文件包含
//宏定义
#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 @ 110592MHz)
{
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);
}
}
以上就是关于c语言怎么写出交通灯的简单程序全部的内容,包括:c语言怎么写出交通灯的简单程序、C#中的交通信号灯问题,请帮忙具体解释下其中的部分程序,急求、用Keilc软件设计一个交通灯程序C程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)