跪求51单片机交通信号灯c语言程序设计
发布网友
发布时间:2022-05-05 04:30
我来回答
共4个回答
热心网友
时间:2022-07-01 13:10
///******************************************************************************** 实验名 : 动态显示数码管实验* 使用的IO : * 实验效果 : 数码管显示76543210。* 注意 :当位选用P1口的时候注意可能会有一位不亮,那么调整J21*******************************************************************************/#include<reg51.h>
//--定义使用的IO口--//#define GPIO_DIG P0#define GPIO_PLACE P1
#define GPIO_TRAFFIC P2
sbit RED10 = P2^0; //上人行道红灯sbit GREEN10 = P2^1; //上人行道绿灯sbit RED11 = P2^2;sbit YELLOW11= P2^3;sbit GREEN11 = P2^4;
sbit RED00 = P3^0; //右人行道红灯sbit GREEN00 = P3^1; //右人行道绿灯sbit RED01 = P2^5;sbit YELLOW01= P2^6;sbit GREEN01 = P2^7;
//--定义全局变量--//unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制unsigned char code DIG_CODE[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char DisplayData[8];//用来存放要显示的8位数的值unsigned char Time, Second; //用来存放定时时间
//--声明全局函数--//void DigDisplay(); //动态显示函数void Timer0Cofig(void);
/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/
void main(void){ Second = 1;
Timer0Cofig();
while(1) { if(Second == 70) { Second = 1; }
//--宝田路通行,30秒--// if(Second < 31) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(30 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--宝田路通行--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1;
GREEN11 = 0; //宝田路绿灯亮 GREEN10 = 0; //宝田路人行道绿灯亮
RED01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 }
//--黄灯等待切换状态,5秒--// else if(Second < 36) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(35 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1;
YELLOW11 = 0; //宝田路黄灯亮 RED10 = 0; //宝田路人行道红灯亮
YELLOW01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 }
//--前进路通行--// else if(Second < 66) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(65 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1;
RED11 = 0; //宝田路红灯亮 RED10 = 0; //宝田路人行道红灯亮
GREEN01 = 0; //前进路绿灯亮 GREEN00 = 0; //前进路人行道绿灯亮 }
//--黄灯等待切换状态,5秒--// else { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(70 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1;
YELLOW11 = 0; //宝田路黄灯亮 RED10 = 0; //宝田路人行道红灯亮
YELLOW01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 } } }
/******************************************************************************** 函 数 名 : DigDisplay* 函数功能 : 使用数码管显示* 输 入 : 无* 输 出 : 无*******************************************************************************/
void DigDisplay(){ unsigned char i; unsigned int j;
for(i=0; i<8; i++) { GPIO_PLACE = DIG_PLACE[i]; //发送位选 GPIO_DIG = DisplayData[i]; //发送段码 j = 10; //扫描间隔时间设定 while(j--); GPIO_DIG = 0x00; //消隐 }}
/******************************************************************************** 函 数 名 : Timer0Cofig* 函数功能 : 配置定时器* 输 入 : 无* 输 出 : 无*******************************************************************************/
void Timer0Cofig(void){ TMOD = 0x01; //定时器0选择工作方式1 TH0 = 0x3C; //设置初始值,定时50MS TL0 = 0xB0; EA = 1; //打开总中断 ET0 = 1; //打开定时器0中断 TR0 = 1; //启动定时器0 }
/******************************************************************************** 函 数 名 : Timer0* 函数功能 : 定时器0中断函数* 输 入 : 无* 输 出 : 无*******************************************************************************/
void Timer0() interrupt 1{ TH0 = 0x3C; //设置初始值 TL0 = 0xB0; Time++; if(Time == 20) { Second ++; Time = 0; }}追问请问这些条件都满足吗,
追答时间延时不同,其他的有
热心网友
时间:2022-07-01 13:10
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar a=5,b=25,c;
sbit SDA = P1^1;sbit SHIFT = P1^2;sbit ST = P1^0;sbit L1=P3^0;sbit Y1=P3^1;sbit H1=P3^2;sbit L2=P3^3;sbit Y2=P3^4;sbit H2=P3^5;
#define NOP _nop_()
uchar led[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar select[] = {0x0fe,0xfd,0xfb,0xf7};uchar i=0;
void delay_us(uint us){ while(us--);}
void Init( ){ SDA = 0; SHIFT = 0; ST = 0; TMOD=0x11; TH0=(65536-1000)/256; TL0=(65536-1000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; TR0=1; EA=1; ET0=1; ET1=1; c=a+b;}
void delay(){ uchar jj; for(jj=0;jj<200;jj++); while(jj--);}
void display(uchar dat){ uchar ii; uchar sdata=dat; for(ii=0;ii<8;ii++) { if(sdata&0x80)SDA=1; else SDA = 0; sdata<<=1; SHIFT =0; NOP; NOP; SHIFT = 1; NOP; NOP; } ST = 1; NOP; NOP; ST = 0;}
void display1() //绿灯{ P2 = select[0]; display(led[c%100/10]);delay_us(500); P2 = select[1]; display(led[c%10]);delay_us(500); }
void display2() //红灯{ P2 = select[2]; display(led[c%100/10]);delay_us(500); P2 = select[3]; display(led[c%10]);delay_us(500);}
void zidong(){}
void main(){ Init(); while(1){ delay(); delay(); display1(); display2(); }}
void timer0() interrupt 1 //绿灯{ uint jj; TH0=(65536-1000)/256; TL0=(65536-1000)%256; jj++; if(jj==1000) { c--; jj=0; } if(c>5) { L1=0;Y1=1;H1=1; L2=1;Y2=1;H2=0; } if(c<=5) { L1=1;Y1=0;H1=1; L2=1;Y2=1;H2=0; } if(c<=0) { TR0=0; TR1=1; c=30; } } void timer1() interrupt 3 //红灯{ uint nn; TH1=(65536-1000)/256; TL1=(65536-1000)%256; nn++; if(nn==1000) { c--; nn=0; } if(b>5) { L1=1;Y1=1;H1=0; L2=0;Y2=1;H2=1; } if(c<=5) { L1=1;Y1=1;H1=0; L2=1;Y2=0;H2=1; } if(c<=0) { TR0=1; TR1=0; c=30; }}
时间自己修改啦
热心网友
时间:2022-07-01 13:11
求51单片机交通信号灯c语言程序设计
你这个是电路,程序
论文 多少字
热心网友
时间:2022-07-01 13:11