版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 控制程序放在AT89C51单片机中,在十字路口的四组红、黄、绿交通灯中,由单片机的P2.1、P2.2、P2.3、P2.4、P2.5、P2.6口控制,由于交通灯为发光二极管且阳极通过限流电阻和电源正极连接,因此I/O口输出高电平时,与之相连的相应指示灯会亮,并通过LED数码管显示时间倒计时,I/O输出低电平时,相应指示灯会灭2. 排阻,一般是接在51单片机的P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。排阻就是好多电阻连载一起,他们有一个公共端 。1端为公共端接VCC或地以STC89C52为例,延时函数自己写#include<reg52.h>sbit B
2、eep=P10; /蜂鸣器接在P1.0上,低电平驱动,电路图网上一搜一大堆void main(void) while(1) Beep=0; DELAY(500); /延时500ms 嘀的时间 Beep=1; DELAY(500)
3、; /延时500ms 不响的时间 #include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar data buf4;uchar data sec_dx=20; /东西数默认uchar data sec_nb=30; /南北默认值uchar data set_timedx=20; /设置东西方向的时间uchar data set_timenb=30; /设置南北方向的时间int n;uchar data countt0;/定时器0中断次数/定义5组开关sbit k4=P
4、37; /切换方向sbit k1=P35; /时间加sbit k2=P36; /时间减sbit k3=P34; /确认sbit k5=P31; /禁止sbit k6=P15; /夜间模式/ P32 /只允许东西方向通行,中断0/ P33 /只允许南北方向通行,中断1sbit Red_nb=P26; /南北红灯标志sbit Yellow_nb=P25; /南北黄灯标志sbit Green_nb=P24; /南北绿灯标志sbit Red_dx=P23; /东西红灯标志sbit Yellow_dx=P22; /东西黄灯标志sbit Green_dx=P21; /东西绿灯标志sbit Buzz=P30
5、;bit Buzzer_Indicate;bit set=0; /调时方向切换键标志 =1时,南北,=0时,东西bit dx_nb=0; /东西南北控制位bit shanruo=0;uchar code table11= /共阴极字型码0x3f, /-00x06, /-10x5b, /-20x4f, /-30x66, /-40x6d, /-50x7d, /-60x07, /-70x7f, /-80x6f, /-90x00 /-NULL;/函数的声明部分void delay(int ms); /延时子程序void key(); /按键扫描子程序void key_to1(); /键处理子程序voi
6、d key_to2();void key_to3();void display(); /显示子程序void logo(); /开机LOGOvoid Buzzer();/主程序void main()TMOD=0X11; /定时器设置TH0=0X3C; /定时器0置初值 0.05STL0=0XB0;EA=1; /开总中断ET0=1; /定时器0中断开启TR0=1; /启动定时0EX0=1; /开外部中断0EX1=1; /开外部中断1logo();P2=0Xc3; / 开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5; /默认南北通行时间比东西多5秒while(1)key(); /调用
7、按键扫描程序display(); /调用显示程序Buzzer();/函数的定义部分void key(void) /按键扫描子程序if(k1!=1) /当K1(时间加)按下时display(); /调用显示,用于延时消抖if(k1!=1)TR0=0; /关定时器shanruo=0;P2=0x00;if(set=0)set_timedx+; /南北加1Selseset_timenb+; /东西加1Sif(set_timenb=100)set_timenb=1;if( set_timedx=100)set_timedx=1; /加到100置1sec_nb=set_timenb ; /设置的数值赋给东
8、西南北sec_dx=set_timedx; /dodisplay();while(k1!=1);if(k2!=1) /当K2(时间减)按键按下时display(); /调用显示,用于延时消抖if(k2!=1)TR0=0; /关定时器shanruo=0;P2=0x00;if(set=0)set_timedx-; /南北减1Selseset_timenb-; /东西减1Sif(set_timenb=0)set_timenb=99;if( set_timedx=0 )set_timedx=99; /减到1重置99sec_nb=set_timenb ; /设置的数值赋给东西南北sec_dx=set_t
9、imedx;dodisplay(); /调用显示,用于延时while(k2!=1);if(k3!=1) /当K3(确认)键按下时display(); /调用显示,用于延时消抖if(k3!=1)TR0=1; /启动定时器Buzzer_Indicate=0;sec_nb=set_timenb; /从中断回复,仍显示设置过的数值sec_dx=set_timedx; /显示设置过的时间if(set=0) /时间倒时到0时P2=0X00; /东西绿灯,南北红灯Green_dx=1;Red_nb=1;sec_nb=sec_dx+5; /回到初值elseP2=0x00; /南北绿灯,东西红灯Green_nb
10、=1;Red_dx=1;sec_dx=sec_nb+5;if(k4!=1) /当K4(切换)键按下display(); /调用显示,用于延时消抖if(k4!=1)TR0=0;set=!set; /取反set标志位,以切换调节方向dx_nb=set;dodisplay();while(k4!=1);if(k5!=1) /当K5(禁止)键按下时display(); /调用显示,用于延时消抖if(k5!=1)TR0=0; /关定时器P2=0x00;Red_dx=1;Red_nb=1; /全部置红灯sec_dx=00; /四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;d
11、odisplay();while(k5!=1);if(k6!=1) /当K6(夜间模式)按下display(); /调用显示,用于延时消抖if(k6!=1)TR0=0; /关定时器P2=0x00;Yellow_dx=1;Yellow_nb=1; /全部置黄灯sec_dx=00; /四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;dodisplay();while(k6!=1);void display(void) /显示子程序buf1=sec_nb/10; /第1位 东西秒十位buf2=sec_nb%10; /第2位 东西秒个位buf3=sec_dx/10; /第
12、3位 南北秒十位buf0=sec_dx%10; /第4位 南北秒个位P1=0xff; / 初始灯为灭的P0=0x00;P1=0xfe; /片选LED1P0=tablebuf1; /送东西时间十位的数码管编码delay(1); /延时P1=0xff; /关显示P0=0x00;P1=0xfd; /片选LED2P0=tablebuf2;delay(1);P1=0xff;P0=0x00;P1=0Xfb; /片选LED3P0=tablebuf3;delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=tablebuf0; /片选LED4delay(1);void time0(void)
13、interrupt 1 using 1 /定时中断子程序TH0=0X3C; /重赋初值TL0=0XB0;TR0=1; /重新启动定时器countt0+; /软件计数加1if(countt0=10)if(sec_nb<=5)&&(dx_nb=0)&&(shanruo=1) /东西黄灯闪Green_dx=0;Yellow_dx=0;Buzz=0;if(sec_dx<=5)&&(dx_nb=1)&&(shanruo=1) /南北黄灯闪Green_nb=0;Yellow_nb=0;Buzz=0;if(countt0=20) /
14、 定时器中断次数=20时(即1秒时) countt0=0; /清零计数器sec_dx-; /东西时间减1sec_nb-; /南北时间减1if(sec_nb<=5)&&(dx_nb=0)&&(shanruo=1) /东西黄灯闪Green_dx=0;Yellow_dx=1;Buzz=1;if(sec_dx<=5)&&(dx_nb=1)&&(shanruo=1) /南北黄灯闪Green_nb=0;Yellow_nb=1;Buzz=1;if(sec_dx=0&&sec_nb=5) /当东西倒计时到0时,重置5秒
15、,用于黄灯闪烁时间sec_dx=5;shanruo=1;if(sec_nb=0&&sec_dx=5) /当南北倒计时到0时,重置5秒,用于黄灯闪烁时间sec_nb=5;shanruo=1;if(dx_nb=0&&sec_nb=0) /当黄灯闪烁时间倒计时到0时,Buzz=1;P2=0x00; /重置东西南背方向的红绿灯Green_nb=1;Red_dx=1;dx_nb=!dx_nb;shanruo=0;sec_nb=set_timenb; /重赋南北方向的起始值sec_dx=set_timenb+5; /重赋东西方向的起始值if(dx_nb=1&&
16、;sec_dx=0) /当黄灯闪烁时间到P2=0X00; /重置东西南北的红绿灯状态Green_dx=1;Red_nb=1;dx_nb=!dx_nb;shanruo=0;sec_dx=set_timedx; /重赋东西方向的起始值sec_nb=set_timedx+5; /重赋南北方向的起始值/外部中断0void int0(void) interrupt 0 using 1 /只允许东西通行TR0=0; /关定时器P2=0x00;Green_dx=1; /东西方向置绿灯Red_nb=1; /南北方向为红灯Buzzer_Indicate=0;sec_dx=00; /四个方向的时间都为00sec_
17、nb=00;/外部中断1void int1(void) interrupt 2 using 1 /只允许南北通行TR0=0; /关定时器P2=0x00;Green_nb=1; /置南北方向为绿灯Red_dx=1; /东西方向为红灯Buzzer_Indicate=0;sec_nb=00; /四个方向的时间都为00sec_dx=00;void logo()/开机的Logo "- - - -"for(n=0;n<50;n+)P0=0x40;P1=0xfe;delay(1);P1=0xfd;delay(1);P1=0Xfb;delay(1);P1=0Xf7;delay(1);
18、P1 = 0xff;void Buzzer()if(Buzzer_Indicate=1)Buzz=!Buzz;else Buzz=1;void delay(int ms) /延时子程序uint j,k;for(j=0;j<ms;j+) /延时msfor(k=0;k<124;k+); /大约1毫秒的延时窗体顶端窗体底端 #include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar data buf4;/缓冲区uchar data sec_dx=20;/东西数默认uchar data
19、sec_nb=30;/南北默认值uchar data set_timedx=20;uchar data set_timenb=30;int n;uchar data b;/定时器中断次数sbit k1=P16;/定义5组开关sbit k2=P17;sbit k3=P27;sbit k4=P30;sbit k5=P31;sbit Yellow_nb=P25;/南北黄灯标志sbit Yellow_dx=P22;/东西黄灯标志sbit Green_nb=P24;sbit Green_dx=P21;sbit Buzz=P37;/蜂鸣器bit Buzzer_Indicate;bit time=0;/灯状
20、态循环标志bit set=1;/调时方向切换键标志uchar code table11= /共阴极字型码0x3f, /-00x06, /-10x5b, /-20x4f, /-30x66, /-40x6d, /-50x7d, /-60x07, /-70x7f, /-80x6f, /-90x00 /-NULL;/函数的声明部分void delay(int ms);/延时子程序void key();/按键扫描子程序void key_to1();/键处理子程序void key_to2();void key_to3();void display();/显示子程序void logo(); /开机LOGOv
21、oid Buzzer();/蜂鸣器子程序/主程序void main()TMOD=0X01;/定时器0,工作方式1TH0=0XD8;TL0=0XF0;EA=1;/开中断ET0=1;/内部定时器T0开中断TR0=1;EX0=1;/外部中断0开中断EX1=1;/外部中断1开中断 logo();/开机P2=0Xc3;/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5; while(1) key(); /调用按键扫描程序display(); /调用显示程序Buzzer();/函数的定义部分void key()/按键扫描子程序 if(k1!=1)delay(10);if(k1!=1)wh
22、ile(k1!=1) key_to1(); for(n=0;n<40;n+) display();TR0=1;/sec_nb=set_timenb ; /设置的数值赋给东西南北 /sec_dx=set_timedx;/display();/for(n=0;n<40;n+) / / display(); TR0=1; /启动定时器Buzzer_Indicate=0;/sec_nb=set_timenb;/从中断回复,仍显示设置过的数值/sec_dx=set_timedx;/if(time=0)/ sec_nb=sec_dx+5; /else sec_dx=sec_nb+5; if(k
23、2!=1)delay(10);if(k2!=1)while(k2!=1) TR0=0; /关定时器if(set=0)set_timenb-; /南北减1Selseset_timedx-; /东西减1Sif(set_timenb=0)set_timenb=99;if(set_timedx=0 )set_timedx=99; /减到1重置99 sec_nb=set_timenb ; /设置的数值赋给东西南北sec_dx=set_timedx; /key_to2(); /for(n=0;n<40;n+) / display(); TR0=1; /sec_nb=set_timenb;/从中断回复
24、,仍显示设置过的数值/sec_dx=set_timedx; if(time=0) sec_nb=sec_dx+5; else sec_dx=sec_nb+5; if(k3!=1)if(set=0)TR0=1; /启动定时器Buzzer_Indicate=0;sec_nb=set_timenb;/从中断回复,仍显示设置过的数值sec_dx=set_timedx;if(time=0) P2=0X99;sec_nb=sec_dx+5; else P2=0xC3;sec_dx=sec_nb+5; elseTR0=1; /启动定时器Buzzer_Indicate=0;sec_nb=set_timenb;
25、/从中断回复,仍显示设置过的数值sec_dx=set_timedx;if(time=0) P2=0xC3;sec_dx=sec_nb+5; /P2=0X99;sec_nb=sec_dx+5; else P2=0X99;sec_nb=sec_dx+5;/ P2=0xC3;sec_dx=sec_nb+5; if(k4!=1) /当K4(切换)键按下 TR0=1; /启动定时器Buzzer_Indicate=0;sec_nb=set_timenb; sec_dx=set_timedx; set=!set; /取反set标志位,以切换调节方向 time=set; if(time=0) P2=0X99;
26、 /东西显示红灯,南北显示绿灯 sec_nb=sec_dx+5; /南北通行时间比东西多5秒 else P2=0xC3; /东西显示绿灯,南北显示红灯 sec_dx=sec_nb+5;/东西通行时间比南北多5秒 while(k4!=1); /保证灯位不会重复切换 if(k5!=1) delay(5); if(k5!=1) while(k5!=1) key_to3(); void display() /显示子程序buf1=sec_dx/10; /第1位 东西秒十位buf2=sec_dx%10; /第2位 东西秒个位buf3=sec_nb/10; /第3位 南北秒十位buf0=sec_nb%10;
27、 /第4位 南北秒个位 P1=0xff; / 初始灯为灭的 P0=0x00; P1=0xfe; /片选LCD1 P0=tablebuf1; delay(1); P1=0xff; P0=0x00; P1=0xfd; /片选LCD2 P0=tablebuf2; delay(1); P1=0xff; P0=0x00; P1=0Xfb; /片选LCD3P0=tablebuf3; delay(1);P1=0xff; P0=0x00;P1=0Xf7;P0=tablebuf0; /片选LCD4 delay(1);void time0(void) interrupt 1 using 1 /定时中断子程序b+;
28、if(b=19) / 定时器中断次数b=0;sec_dx-;sec_nb-;if(sec_nb<=5&&time=0) /东西黄灯闪 Green_dx=0;Yellow_dx=!Yellow_dx; if(sec_dx<=5&&time=1) /南北黄灯闪 Green_nb=0;Yellow_nb=!Yellow_nb; if(sec_dx=0&&sec_nb=5) sec_dx=5;if(sec_nb=0&&sec_dx=5)sec_nb=5;if(time=0&&sec_nb=0) P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;if(time=1&&sec_dx=0)P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;void key_to1()/键盘处理子程序之+T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年春统编版语文三年级下册教学工作计划
- 医保基金监管中的法律风险防范
- 区块链赋能围手术期患者数据安全共享
- 区块链技术保障患者满意度数据真实性监测
- 年会新年活动策划方案(3篇)
- 电灯水电施工方案(3篇)
- 国道大修施工方案(3篇)
- 初中作业管理制度范文英语(3篇)
- 产品五一活动策划方案(3篇)
- 小型施工方案格式(3篇)
- 中国烟草笔试试题及答案
- 招聘笔试题(某大型国企)2025年题库(附答案)
- 2025天津津南国有资本投资运营集团有限公司及实控子公司招聘工作人员招聘5人笔试历年参考题库附带答案详解(3卷合一)
- 2025-2030中国精酿啤酒市场消费特征与渠道拓展战略研究报告
- 2025年青海省高考生物真题(含答案解析)
- 廉洁从业宣教培训手册
- 伤寒课件教学课件
- 环境监测系毕业论文
- 吊车承包合同2025年
- 城市地下管网建设实施方案
- 智能采矿技术课件
评论
0/150
提交评论