|
南北交通灯
#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位共阴数码管显示
}
}
剩余部分附件查看
|
|