《单片机原理》期中考试
适用班级:电子A1621,电子A1622
注意事项:
1. 课外开放设计,开卷考核,可查阅任意资料。
2. 单人考核,独立完成,如有雷同,一律0分。
3. 不允许对电路图做任意形式修改。
4. 提交以“电子A1622_01_陈**_期中测试”格式命名的项目文件夹。
这是我们学校单片机课程的期中考试自己写的程序,花了两周时间,压缩包里面包含了keil的源代码和protuse电路仿真图,可能也还有很多不完善的地方,望大家多多见谅。
电路如图所示,设计程序实现如下功能:
1. 能根据交通规律正确设置交通灯状态及数码管显示内容(60分)
2. 能手动调节时间(30分)
3. 能根据交通状况自动延长直行时间;(10分)
带行人与繁忙检测的单片机交通灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
注:通过键盘调节时间项目中,分为东西直行时间、东西左转时间、南北直行时间、南北左转时间4个项目,每个项目7.5分,小数点四舍五入。
东西向交通繁忙探头,1正常,0繁忙
南北向交通繁忙探头,1正常,0繁忙
1. 模式键用来选择设定的时间,如东西直行时间、南北左转时间等。
时间加减键用于手动调节直行时间,每按键一次加减5s。
2. 交通繁忙探头用于探测道路交通状况,如果当前道路排队较长,
则繁忙探头返回0,可临时延长当前方向直行通道时间10s,一个
红绿灯周期最多延长3次。本设计用逻辑状态输入端口模拟。
单片机源程序如下:
- #include <REGX51.H>
- #define uchar unsigned char
- sbit NSgreen = P3^1; //南北人行道绿灯
- sbit WEgreen = P3^0; //东西人行道绿灯
- sbit Add_Button = P3^5;//加时间按键
- sbit Sub_Button = P3^4;//减时间按键
- sbit Reduces_Button = P3^3;//模式选择按键
- sbit Y1 = P3^2;
- sbit WEbuy_Button = P3^6 ;
- sbit NSbuy_Button = P3^7 ;
- uchar qiehuan=0;
- uchar red = 33,yellow = 3,green_strant = 30,green_left = 30;
- uchar Mode = 0;
- uchar KeyDown=0;
- uchar DisplayTab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79}; // 0 1 2 3 4 5 6 7 8 9 E
- uchar led[8];
- uchar Display_Number[] = {0x82,0x84,0x28,0x48,0x81,0x84,0x18,0x48}; //路口红绿灯状态
- //延时
- void Delay_ms(unsigned int Cnt )
- {
- unsigned int t;
- while (Cnt--)
- {
- t=100;
- while(t--);
- }
- }
-
- //动态显示
- void Dynamic_display()
- {
- uchar i = 0;
- for(i = 0; i < 8; i++)
- {
- P0 = DisplayTab[ led[i] ];
- P2 = ~(0x01<<i);
- Delay_ms(1);
- P0 = 0x00;
- }
- }
- /***************中断程序***********************************/
- /*******外部中断0**********/
- void function_isr(void) interrupt 0
- {
- EX0=0; //关中断
- qiehuan++;
- if(qiehuan == 5) Mode=0;
- EX0=1; //开中断
-
- }
- //状态1
- void luzhi1()
- {
- led[4] = green_strant % 10;
- led[5] = green_strant / 10;
- led[6] = 1;
- led[7] = 10;
- if(WEbuy_Button == 0) //时间加
- {
- green_strant += 10;
- }
- }
- //状态2
- void luzhi2()
- {
- led[4] = green_strant % 10;
- led[5] = green_strant / 10;
- led[6] = 3;
- led[7] = 5;
- if(NSbuy_Button == 0) //时间加
- {
- green_strant += 10;
-
- }
- }
- /******外部中断2********/
- void function_lib(void) interrupt 2
- {
- Mode++;
- if(Mode == 5) Mode=0;
- KeyDown=1;
- }
- //模式1
- void function1()
- {
- led[4] = green_strant % 10;
- led[5] = green_strant / 10;
- led[6] = 1;
- led[7] = 10;
- if(Add_Button == 0) //时间加
- {
- green_strant += 5;
- green_left += 5;
- red += 5;
- }
- if(Sub_Button == 0) //时间减
- {
- green_strant -= 5;
- green_left -= 5;
- red -= 5;
- }
-
- }
- //模式2
- void function2()
- {
- led[4] = green_left % 10;
- led[5] = green_left / 10;
- led[6] = 2;
- led[7] = 10;
- if(Add_Button == 0) //时间加
- {
- green_strant += 5;
- green_left += 5;
- red += 5;
-
- }
- if(Sub_Button == 0) //时间减
- {
- green_strant -= 5;
- green_left -= 5;
- red -= 5;
- }
-
- }
- //模式3
- void function3()
- {
- led[4] = green_strant % 10;
- led[5] = green_strant / 10;
- led[6] = 3;
- led[7] = 5;
- if(Add_Button == 0) //时间加
- {
- green_strant += 5;
- green_left += 5;
- red += 5;
- }
- if(Sub_Button == 0) //时间减
- {
- green_strant -= 5;
- green_left -= 5;
- red -= 5;
- }
- }
- //模式4
- void function4()
- {
- led[4] = green_left % 10;
- led[5] = green_left / 10;
- led[6] = 4;
- led[7] = 5;
- if(Add_Button == 0) //时间加
- {
- green_strant += 5;
- green_left += 5;
- red += 5;
- }
- if(Sub_Button == 0) //时间减
- {
- green_strant -= 5;
- green_left += 5;
- red -= 5;
- }
- }
- /*************计时程序*************/
- void count_down()
- {
- uchar time = 0;
- uchar Temp,state;
- uchar Red,Yellow,Greens,Greenl;
- Red = red;
- Yellow = yellow;
- Greens = green_strant;
- Greenl = green_left;
-
- while(1)
- {
- if(time < green_strant )
- {
- led[0] = Red % 10;
- led[1] = Red / 10;
- led[2] = Greens % 10;
- led[3] = Greens / 10;
- state=0;
- WEgreen = 1;
- NSgreen = 0;
- Red--;
- Greens--;
- }
- if(time >= green_strant & time < (green_strant +yellow ))
- {
- led[0]=Red % 10;
- led[1]=Red / 10;
- led[2]=Yellow % 10;
- led[3]=Yellow / 10;
- state=1;
- WEgreen = 1;
- NSgreen = 0;
- Red--;
- Yellow--;
- Greens=green_strant; //给直行绿灯恢复初值
- }
- if(time >= (green_strant +yellow ) & time < (green_strant +yellow+green_strant ) )
- {
- if(time == (green_strant +yellow ))
- {
- Red = red; //给红灯赋值
- }
- led[0]= Greens % 10;
- led[1]= Greens / 10;
- led[2]= Red % 10;
- led[3]= Red / 10;
- state=2;
- WEgreen = 0;
- NSgreen = 1;
- Red--;
- Greens--;
- Yellow=yellow; //给黄灯恢复初值
- }
- if(time >= (green_strant +yellow+green_strant ) & time < (green_strant +yellow+green_strant+yellow ) )
- {
- led[0]= Yellow % 10;
- led[1]= Yellow / 10;
- led[2]= Red % 10;
- led[3]= Red / 10;
-
- state=3;
- WEgreen = 0;
- NSgreen = 1;
- Greens=green_strant; //给直行绿灯恢复初值
- Yellow--;
- Red--;
-
- }
- if(time >= (green_strant +yellow+green_strant+yellow ) & time < (green_strant +yellow+green_strant+yellow+green_left ) )
- {
- if(time == (green_strant +yellow+green_strant+yellow ) )
- {
- Red = red; //给红灯赋值
- }
- led[0] = Red % 10;
- led[1] = Red / 10;
- led[2]= Greenl % 10;
- led[3]= Greenl / 10;
- state=4;
- WEgreen = 1;
- NSgreen = 0;
- Greenl--;
- Red--;
- Yellow = yellow; //给黄灯赋初值
- }
- if(time >= (green_strant +yellow+green_strant+yellow+green_left ) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow ) )
- {
- led[0] = Red % 10;
- led[1] = Red / 10;
- led[2] = Yellow % 10;
- led[3] = Yellow / 10;
-
- state=5;
- WEgreen = 1;
- NSgreen = 0;
- Yellow--;
- Red--;
- Greenl = green_left; //给左转绿灯赋初值
- }
- if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow ) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left) )
- {
- if(time == (green_strant +yellow+green_strant+yellow+green_left+yellow ) )
- {
- Red = red; //给红灯赋值
- }
- led[0] = Greenl % 10;
- led[1] = Greenl / 10;
- led[2] = Red % 10;
- led[3] = Red / 10;
-
- state=6;
- WEgreen = 0;
- NSgreen = 1;
- Yellow = yellow; //给黄灯赋初值
- Greenl--;
- Red--;
- }
- if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left) & time < (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left+yellow) )
- {
- led[0]= Yellow % 10;
- led[1]= Yellow / 10;
- led[2]= Red % 10;
- led[3]= Red / 10;
- state=7;
- WEgreen = 0;
- NSgreen = 1;
- Greenl = green_left; //给左转绿灯赋初值
- Yellow--;
- Red--;
- }
- if(time >= (green_strant +yellow+green_strant+yellow+green_left+yellow + green_left+yellow))
- {
- Yellow = yellow; //给黄灯赋初值
- break;
- }
- time++;
- Y1= 1 ;
- Reduces_Button = 1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
51单片机交通灯程序_期中测试.zip
(307.52 KB, 下载次数: 260)
|