找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1907|回复: 1
收起左侧

利用51单片机制作十字路交通灯

[复制链接]
ID:622411 发表于 2019-10-11 17:03 | 显示全部楼层 |阅读模式
南北交通灯
#include<reg51.h>

#define  unint unsigned int

#define  unchar unsigned char
sbit NS_G=P1^0;
sbit NS_Y=P1^1;
sbit NS_R=P1^2;
sbit EW_G=P0^0;
sbit EW_Y=P0^1;
sbit EW_R=P0^2;

//管脚定义

sbit DIN=P3^0;

//MAX7219 串行数据 1 脚

sbit LOAD=P3^1;

//MAX7219 片选 12

sbit CLK=P3^2;

//MAX7219 串行时钟 13 脚

sbit P10=P1^0;

sbit P11=P1^1;

sbit P12=P1^2;

sbit P15=P1^5;

sbit P16=P1^6;

sbit P17=P1^7;

//寄存器宏定义

#define DECODE_MODE  0x09

//译码控制寄存器

#define INTENSITY      0x0A   
//亮度控制寄存器
#define SCAN_LIMIT    0x0B

//扫描界限寄存器

#define SHUT_DOWN  0x0C

//关断模式寄存器

#define DISPLAY_TEST 0x0F

//测试控制寄存器

//定义全局变量

unchar t,dte,dts;

//t为1ms脉冲产生标志,dte、dts分别为东西方向、南北方向数字变化标志

unchar Easw,Soun;            

//东西、南北方数码管数字变量

//函数声明

void Write7219(unchar address,unchar dat);

//MAX7219控制处理函数声明

void Display();                       

//数码管数字显示处理函数声明

void Initial(void);

//MAX7219初始化函数声明

void Init(void);                     

//定时器初始化函数声明

/*主函数:交通等控制器,东西通行时间为80s,南北通行时间为60s,缓冲时间为3s。*/

void main(void)

{

Initial();   

//MAX7219 初始化

Init();                             

//变量初始化

while(1)

{

Display();                      //调用显示函数

}

}

/*MAX7219初始化函数:MAX7219 初始化,设置MAX7219 内部的控制寄存器*/

void Initial(void)

{

Write7219(SHUT_DOWN,0x01);

//开启正常工作模式(0xX1)

Write7219(DISPLAY_TEST,0x00);

//选择工作模式(0xX0)

Write7219(DECODE_MODE,0xff);

//选用全译码模式

Write7219(SCAN_LIMIT,0x03);

//选用前4只LED

Write7219(INTENSITY,0x04);

//设置初始亮度

}

/*初始化函数:设置定时/计数器0工作方式1,设置50ms定时时间,并进行初始化。开总中断、定时/计数器0,初始化所需全局变量 */

void init()                       

{

TMOD = 0X01;

//设置定时器0工作方式1

TH0 = 0X4C;

//定时器0高八位初始化

TL0 = 0X00;

//定时器0低八位初始化

ET0 = 1;

//定时器0中断允许

TR0 = 1;

//开定时器0

EA = 1;

//开总中断

t = 0;

dte = 0;

dts = 0;

Easw = 79;

//东西方向数码管初值79

Soun = 82;

//南北方向数码管初值82



//P0 = 0x21;
//初始化东西方向亮绿灯
EW_G=0;EW_Y=1,EW_R=1;
//P1 = 0X24;
//初始化南北方向亮红灯
NS_G=1;NS_Y=1;NS_R=0;
}

/*数码管数字显示处理函数:通过定时器精确定时,动态地显示交通灯时间的变化 */

void Display()

{

unchar i;

unchar Ewsn[4]={0};

//定义一个只含四个元素的一位数组

void Digit_deal();

//数字变化处理函数声明

if(t >= 20)

//t=20时,定时1秒,Easw、Soun做自减

{

t= 0;

Easw--;

Soun--;

}

Digit_deal();

//数字变化处理函数

Ewsn[0] = Easw/10;

//东西显示数字十位

Ewsn[1] = Easw%10;

//东西显示数字个位

Ewsn[2] = Soun/10;

//南北显示数字十位

Ewsn[3] = Soun%10;

//南北显示数字个位

for(i=1;i<5;i++)

{

Write7219(i,Ewsn[i-1]);

//4位共阴数码管显示

}

}

剩余部分附件查看
图片1.png
0.png

红绿灯3.zip

91.59 KB, 下载次数: 13, 下载积分: 黑币 -5

回复

使用道具 举报

ID:628922 发表于 2019-11-7 15:38 | 显示全部楼层
谁能帮我解决怎么做按键控制双机通信
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表