一、 课程设计目的
- 熟悉AT89C51单片机各引脚的用法
- 学会使用protues仿真原理图的设计和C51语言keil软件编程完成设计的交通灯控制系统
- (1)通过使用《单片机原理与应用》课程的基础理论知识和设计方法,进一步加深对课程所讲理论知识的理解;
(2)通过查阅资料,阅读程序,提高使用单片机分析问题、解决问题的能力;
(3)通过实际动手进行硬件设计及软件程序设计,达到理论联系实际、灵活应用单片机解决实际问题的目的。
二、 课程设计内容
1、电路设计
①交通灯系统整体设计构想:系统东西通行时间都为13秒,包含黄灯闪烁3秒,南北通行14秒。这样一直循环。交通灯运行流程图如下:
②仿真图里所用到的元件
表1 元器件清单
元器件名称 | 数量 |
---|---|
单片机AT89C51 | 1个 |
电阻 R | 13个 |
发光二极管 红、黄、绿 | 各4个 |
电容 C1 、C2 | 3个 |
晶振X1 | 1个 |
共阴极数码管 2位8段共阴极 | 4个 |
排阻 RP1 1 | 1 |
按钮 | 1个 |
74H573 锁存器 | 1个 |
其他 |
2、电路各部分组成
①本设计单片机最小系统:晶振电路、复位电路、单片机组成。
②红绿灯电路
③数码管电路
3.仿真截图
--------------------------------------南北主干道绿灯通行时间10秒--------------------------------------------------
-------------------------------------------南北主干道黄灯准备倒数3秒--------------------------------------------------
4、主函数和部分功能代码
sbit dula=P3^6; //段选锁存器锁存端
sbit wela=P3^7; //位选锁存器锁存端
sbit EW=P1^4; //东西黄灯
sbit SN=P1^1; //南北黄灯
char time1=11; //初值南北时间
char time2=14; //初值东西时间
char huang=3; //黄灯时间
char time11=13,time22=10; //变换后南北,东西时间
//共阴极数字显示编码
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code wei[]={0xfd,0xfe,0xf7,0xfb,
0xdf,0xef,0x7f,0xbf}; //位选
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--) //定时x毫秒
for(j=110;j>0;j--);
}
void display(uint ge1,uint shi1,uint ge2,uint shi2) //数码管显示
{
//显示北
wela=1; //打开位选锁存器
P0=wei[0]; //送入位选码(北个位)
wela=0; //关闭位选锁存器
P0=0; //消影
dula=1; //打开段选锁存器
P0=table[ge1]; //送入段选
dula=0; //关闭段选锁存器
delay(1);
wela=1; //打开位选锁存器
P0=wei[1]; //送入位选码(北十位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[shi1]; //送入段选
dula=0; //关闭段选锁存器
delay(1);
//显示东西
wela=1; //打开位选锁存器
P0=wei[2]; //送入位选码(东个位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[ge2];
dula=0; //关闭段选锁存器
delay(1);
wela=1; //打开位选锁存器
P0=wei[3]; //送入位选码(东十位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[shi2];
dula=0; //关闭段选锁存器
delay(1);
}
void main()
{
P1=0x0c; //刚开始南北通,东西禁行
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256; //初值
EA=1; //打开总中断
ET0=1; //定时器0允许中断
TR0=1; //定时器0开始计时
EX0=1; //外部中断0允许位
IT0=1; //外部中断0触发方式(下降沿)
while(1)
{
if(flag)
{
flag=0;
}
if(!p)
{
shi1=time1/10; //南北十位
ge1=time1%10; //南北个位
shi2=time2/10; //东西十位
ge2=time2%10; //东西个位
display(ge1,shi1,ge2,shi2); //显示函数
}
if(p)
dis(); //不显示函数
}
}
void ext0() interrupt 0
{
flag=1;
status=P2;
}
void timer() interrupt 1 //定时中断程序
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256; //重新赋初值
temp++;
if(temp==20) //说明过去了1秒
{
temp=0; //清零,重新计算
//东西方向南北方向时间自减
time1--;
time2--;
if(zhuangtai_flag==0) zhuangtai1();
if(zhuangtai_flag==1) zhuangtai2();
if(zhuangtai_flag==2) zhuangtai3();
if(zhuangtai_flag==3) zhuangtai4();
}
}
资源文件夹包含:proteus仿真+原理图;keil编写的C语言程序;详细设计说明书。
资源链接:
加我QQ:1271370903