资料包内容:
课程设计论文模板:
目录
摘要 I
1 课程论文内容与要求: I
2 硬件系统的设计 I
2.1 各元器件选择及其功能介绍 I
2.2 STC89C5X II
2.3 单片机最小系统 VI
2.4 紧急通行模块 IX
2.5 忙等通行模块 X
2.6 总电路图 X
3 软件系统的设计 XII
3.1 概要设计 XII
3.1.1 程序流程图 XII
4 系统调试 XIII
4.1 功能测试 XIII
4.1.1 正常运行模块 XIII
4.1.2 紧急通行模块 XIV
4.1.3 忙等通行模块 XIV
5 收获与体会 XVI
附录 I
源程序清单 I
参考文献 I
单片机源程序如下:
- /**************************************************************************************
- * 交通灯实验 *
- 实现现象:模仿交通灯运作
- 注意事项:无
- ***************************************************************************************/
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- void delay();
- void display();
- void TrafficStart();
- void TrafficStop();
- void ledInit();
- void changeNSpass();
- void changeEWpass();
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef char u8;
- u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
- u8 code stop[]={0xbf}; //1011 1111
- u8 time1=3; //东西方向 第一位数字
- u8 time2=0; //东西方向 第二位数字
- u8 time3=2; //南北方向 第一位数字
- u8 time4=5; //南北方向 第一位数字
- u8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
- u8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯
- u8 ledset=0; //紧急状态标志位,0为允许紧急状态启动
- u8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯
- u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯
- u8 count=0; //紧急状态按键计数
- u8 count1=0; //方向转变计数
- sbit led0=P1^0; //将P1^0口定义为led0 绿色1
- sbit led1=P1^1; //将P1^1口定义为led1 黄色1
- sbit led2=P1^2; //将P1^2口定义为led2 红色1
- sbit led3=P1^3; //将P1^0口定义为led3 绿色2
- sbit led4=P1^4; //将P1^1口定义为led4 黄色2
- sbit led5=P1^5; //将P1^2口定义为led5 红色2
- sbit CK1 = P2^3; //东西方向第一位数码管
- sbit CK2 = P2^2; //东西方向第二位数码管
- sbit CK3 = P2^1; //南北方向第一位数码管
- sbit CK4 = P2^0; //南北方向第二位数码管
- sbit key2 = P3^0;
- sbit key3 = P3^1;
- sbit key4 = P3^2;
- void delay(u16 i)
- {
- while(i--);
- }
- void display(u8 time1,u8 time2,u8 time3,u8 time4);
- /*******************************************************************************
- * 函 数 名 : Timer1Init
- * 函数功能 : 定时器1初始化
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer1Init()
- {
- TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
- TH1=0X3c; //给定时器赋初值,定时50ms
- TL1=0Xb0;
- ET1=1;//打开定时器1中断允许
- EA=1;//打开总中断
- TR1=1;//打开定时器
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- CK1=0;
- CK2=0;
- led2=0;
- led3=0;
- Timer1Init(); //定时器1初始化
- while(1)
- {
- //*******************************************************************************
- if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效
- delay(1000);
- if(key3==0&&count%2==0)
- {
- TR1=0; //关闭定时器,防止切换时仍然计时
- count1++;
- if(count1%2==1){ //(非红灯状态下允许执行)
- TR1=1; //打开定时器
- changeEWpass();
- }
- if(count1%2==0){
- TR1=1;
- changeNSpass();
- }
- }
- while(!key3);
- }
- //*******************************************************************************
- if(key2==0){
- delay(1000);
- if(key2==0)
- {
- count++;
- }
- while(!key2);
- }
- if(count%2==0){ //为0则将状态恢复为运行状态
- if(ledset==0){ //判断上次是否为紧急状态
- ledset=1;
- ledInit();
- templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)
- templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)
- }
- TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数
- }
- if(count%2==1){ //为1将状态修改为紧急状态
- ledset=0;
- TrafficStop();
- }
-
- }
- }
- /*******************************************************************************
- * 函 数 名 : void Timer1() interrupt 3
- * 函数功能 : 定时器1中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- static u16 i;
- TH1=0X3c; //给定时器赋初值,定时50ms
- TL1=0Xb0;
- i++;
- if(i==20) //i等20时为1秒
- {
- i=0;
- //-------------------------------------东西 方向-------------------------------------
- time2--;
- if(time2==-1&&time1!=0){
- time1--;
- time2=9;
- }
- if((time2==0&&time1==0)){
- if(change==0){ //东西方向 如果为红灯
- change=1; //下次为绿灯
- time1=5;
- time2=0;
- led2=1;
- led1=1;
- led0=0; //绿灯亮
- count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
- }
- else if(change==1){ //东西方向 如果为绿灯
- change=2; //下次为黄灯
- time1=1;
- time2=0;
- led2=1;
- led1=0;
- led0=1;
- }
- else if(change==2){ //东西方向 如果为黄灯
- change=0; //下次为红灯
- time1=3;
- time2=0;
- led2=0;
- led1=1;
- led0=1;
-
- }
- }
- //-------------------------------------南北 方向-------------------------------------
- time4--;
- if(time4==-1&&time3!=0){
- time3--;
- time4=9;
- }
- if(time4==0&&time3==0){
- if(change1==2){ //南北方向 如果为绿灯
- change1=1; //下次为黄灯
- time3=0;
- time4=5;
- led3=1;
- led4=0;
- led5=1;
- }
- else if(change1==1){ //南北方向 如果为黄灯
- change1=0; //下次为红灯
- time3=6;
- time4=0;
- led3=1;
- led4=1;
- led5=0;
- }
- else if(change1==0){ //南北方向 如果为红灯
- change1=2; //下次为绿灯
- time3=2;
- time4=5;
- led3=0;
- led4=1;
- led5=1;
- count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
-
- }
- }
- //------------------------------------------------------------------------------------
- }
- }
- void display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
- {
- P0=table[time1];
- CK1=0;
- delay(100);
- CK1=1;
- P0=table[time2];
- CK2=0;
- delay(100);
- CK2=1;
- P0=table[time3];
- CK3=0;
- delay(100);
- CK3=1;
- P0=table[time4];
- CK4=0;
- delay(100);
- CK4=1;
- }
- void TrafficStart()
- {
- TR1=1;//打开定时器
- display(time1,time2,time3,time4);
- }
- void TrafficStop()
- {
- TR1=0;//关闭定时器
- CK1=CK2=CK3=CK4=0;
- P0=stop[0];
- if(led0==0){
- templed=0; //记录当前灯状态 东西方向
- led0=1; //将原来灯熄灭
- led2=0; //亮红灯
- }
- if(led1==0){
- templed=1;
- led1=1;
- led2=0;
- }
- if(led3==0){
- templed1=3; //记录当前灯状态 南北方向
- led3=1;
- led5=0;
- }
- if(led4==0){
- templed1=4;
- led4=1;
- led5=0;
- }
- }
- void ledInit()
- {
- if(templed==0){ //恢复紧急状态前时的灯状态 东西方向
- led2=1; //熄灭其他灯
- led1=1; //熄灭其他灯
- led0=0; //恢复灯的状态
- }
- if(templed==1){
- led2=1;
- led1=0;
- led0=1;
- }
- if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向
- led5=1; //熄灭其他灯
- led4=1; //熄灭其他灯
- led3=0; //恢复灯的状态
- }
- if(templed1==4){
- led5=1;
- led4=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
单片机大作业.rar
(3.65 MB, 下载次数: 46)
|