图如图所示。
开 始 设置定时,显示初南北绿灯亮,东西红灯亮,南北黄灯闪烁,东西红灯 南北红灯亮,东西绿灯亮,南北红灯亮,东西黄灯闪
图3-1 主程序框图
3.3 软件设计 交通灯定时器模块
AT89S52单片机内部有3个定时器T0,T1和T2,本次设计中使用T0工作在方式1,即16位定时器,定时50ms,20次中断产生秒信号,从而控制红绿灯的点亮时间。
工作方式寄存器TMOD用来设置T0、T1的工作方式。这次实习中设置TMOD=0x01,即T0工作于方式0(16位定时器)。
内部定时器/计数器用作定时器时,是对机器周期计数,每个机器周期的长度是12个振荡周期。定时常数的设置可用一下方式计算:
机器周期=12/12MHz=1us
(65536-定时常数)*1.0us=50ms 所以定时常数是50000。
第四章 调试
调试图:
实物图:
第五章 体会
值此论文完成之际,谨向我们的导师老师表示衷心的感谢!我们六个同学分工合作,在整个项目中学会了multisim,keil等电路相关软件的使用,大致掌握了电路设计的基本方法。在项目进行中由于所学课程限制,遇到了诸多困难,通过自学也客服了许多。
总之,在整个项目中,学到的不仅仅是制作一个电子产品,更多的是对电子设计的兴趣和学到的创新精神。
附件一:源程序代码
#include
#define uchar unsigned char //宏定义\代替\。 #define uint unsigned int
#include \
//数码管段选定义 0 1 2 3 4 5 //
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; uchar smg_i = 4; //显示数码管的个位数
//数码管位选定义
sbit smg_we1 = P2^0; //数码管位选定义 sbit smg_we2 = P2^1; sbit smg_we3 = P3^6; sbit smg_we4 = P3^7;
char dx_s = 0; //东西 南北 倒计时变量 sbit dx_red = P2^4; //东西红灯 sbit dx_green = P2^3; sbit dx_yellow = P2^2;
sbit nb_red = P2^7; sbit nb_green = P2^6; sbit nb_yellow = P2^5;
uchar flag_jtd_mode; //交通灯的模式 根据时间 bit flag_1s = 0; bit flag_500ms; bit flag_dx_nb; uchar i;
uchar flag_alarm; //模式
uchar dx_time = 30,nb_time = 20; //东西、南北的时间 uchar flag_jdgz ; //交通管制
/***********************数码位选函数*****************************/ void smg_we_switch(uchar i)
//宏定义\用来定义无符号整型数。
6 7 8 9 不显示
//断码
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
A
B
C D E F
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
//东西绿灯 //东西黄灯 //南北红灯 //南北绿灯 //南北黄灯
//东西南北模式
uchar flag_5m_value;
{ }
/******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { }
/******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { }
/**************开机自检eeprom初始化*****************/ void init_eeprom() ///开机自检eeprom初始化 { }
switch(i) { }
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break; case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break; case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break; case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
SectorErase(0x2000); byte_write(0x2000, dx_time); byte_write(0x2001, nb_time); byte_write(0x2058, a_a);
dx_time = byte_read(0x2000); nb_time = byte_read(0x2001); a_a = byte_read(0x2058);
read_eeprom(); if(a_a != 1) { }
a_a = 1; dx_time = 30;
//先读
//新的单片机初始单片机内问eeprom
nb_time = 20; //东西、南北的时间 write_eeprom();
//保存数据