标题:
单片机+MAX7219驱动数码管实现交通信号灯的程序和Proteus仿真
[打印本页]
作者:
wang0312
时间:
2018-12-6 16:40
标题:
单片机+MAX7219驱动数码管实现交通信号灯的程序和Proteus仿真
51单片机和MAX7219数码管驱动芯片做的交通信号灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(25.01 KB, 下载次数: 60)
下载附件
2018-12-7 03:50 上传
单片机源程序如下:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DIG0 0x01 // 定义数码管1
#define DIG1 0x02 // 定义数码管2
#define DIG2 0x03 // 定义数码管3
#define DIG3 0x04 // 定义数码管4
void delay(uint i);
void T0_init();
void MAX7219(uchar addr,uchar num);
void MAX7219_init(); //MAX7219初始化
void display();
sbit DIN=P3^0; //连接MAX7219 DIN引脚
sbit LOAD=P3^1; //连接MAX7219 LOAD 引脚
sbit CLK=P3^2; //连接MAX7219 CLK 引脚
sbit G1=P0^0; //南北红绿灯
sbit Y1=P0^1;
sbit R1=P0^2;
sbit G2=P1^0; //东西红绿灯
sbit Y2=P1^1;
sbit R2=P1^2;
uchar NS_S,NS_G,EW_S,EW_G;
uchar NS,EW;
uchar temp=0,i;
uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,
0x5b,0x5f,0x70,0x7f,0x7b}; //共阴级数码管数组
void delay(uint i)
{
uint j;
for(j=0;j<i;j++);
}
void T0_init()
{ //装初值10MS
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
ET0=1;
TR0=1;
}
void MAX_write(uchar ch) //以8位一个字节进行写值
{
uchar j,ads;
for(j=0;j<8;j++) //8位
{
ads=ch&0x80; //取最高位
CLK = 0; //时钟线置低
if(ads) DIN = 1;
else DIN = 0;
ch=ch<<1; //左移一位
CLK=1; //上升沿,DIN的数据写入到7219
}
}
void MAX7219(uchar addr, uchar num) //写地址,写数据
{
LOAD = 0;
_nop_();
MAX_write(addr);
_nop_();
MAX_write(num);
_nop_();
LOAD = 1; //锁存
}
void MAX7219_init()
{
MAX7219(0x0c,0x01); //正常状态
MAX7219(0x0b,0x03); //设置扫描范围DIG0-3
MAX7219(0x0a,0x05); //设置亮度11/32
MAX7219(0x09,0x00); //采用译码方式 ,不译码
}
void display()
{
NS_S=NS/10; //南北十位,个位
NS_G=NS%10;
EW_S=EW/10; //东西十位,个位
EW_G=EW%10;
MAX7219(DIG0,table[NS_S]); //南北十位,个位
MAX7219(DIG1,table[NS_G]);
MAX7219(DIG2,table[EW_S]); //东西十位,个位
MAX7219(DIG3,table[EW_G]);
}
void T0_(void)interrupt 1
{
temp++;
TH0=0XD8;
TL0=0XF0;
if(temp==100)
{
temp=0;
NS--;
EW--;
if((NS==0)&&(EW==3))
{
NS=3;
EW=3;
i=1;
}
if((NS==0)&&(EW==0)&&(i==1))
{
NS=83;
EW=80;
i=2;
}
if((NS==3)&&(EW==0))
{
NS=3;
EW=3;
i=3;
}
if((NS==0)&&(EW==0)&&(i==3))
{
NS=60;
EW=63;
i=4;
}
}
display();
}
void main()
{
T0_init();
MAX7219_init();
EA=1;
NS=60; //初始南北通行60秒
EW=63;
R2=0,G1=0; //南北绿灯亮,东西红灯亮
while (1)
{
uint k;
display();
switch(i)
{
case 1: R2=1,G1=1; //关闭南北绿灯,东西红灯
Y1=0,Y2=0; //黄灯闪烁
for(k=0;k<3;k++)
{
Y1=~Y1;
Y2=~Y2;
delay(10000);
}
break;
case 2: G2=0,R1=0; //东西绿灯亮,南北红灯亮
break;
case 3: G2=1,R1=1;
Y1=0,Y2=0; //黄灯闪烁
for(k=0;k<3;k++) //循环三次进行延时闪烁
{
Y1=~Y1;
Y2=~Y2;
delay(10000);
}
break;
case 4: R2=0,G1=0; //东西红灯亮,南北绿灯亮
break;
}
}
}
复制代码
所有资料51hei提供下载:
12通信交通灯.zip
(66.58 KB, 下载次数: 61)
2018-12-6 16:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
jjwangxu2008
时间:
2020-3-5 18:36
这个挺好。。。
作者:
TJR
时间:
2020-3-7 19:57
您好,我都按着您的搞好了,仿真的时候显示频率太快了
请问下你怎么改呢
作者:
TJR
时间:
2020-3-7 19:59
您好,我都按您的搞好了,可以仿真的时候显示频率太快了
这个要怎么改一下呢
或者说我的操作哪一步出错了嘛
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1