C语言代码-交通灯控制器.doc_第1页
C语言代码-交通灯控制器.doc_第2页
C语言代码-交通灯控制器.doc_第3页
C语言代码-交通灯控制器.doc_第4页
C语言代码-交通灯控制器.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include/头文件/* 定义max7219 内部寄存器 */#define reg_decode 0x09 / 译码方式寄存器#define reg_intensity 0x0a / 亮度寄存器#define reg_scan_limit 0x0b / 扫描界限寄存器#define reg_shutdown 0x0c / 停机寄存器#define reg_display_test 0x0f / 显示测试寄存器#define intensity_min 0x00 / 最小显示亮度#define intensity_max 0x0f / 最大显示亮度/* 定义各路交通灯信号 */sbit alg = p12;/ a路左转绿灯sbit alr = p10;/ a路左转红灯sbit aly = p11;/ a路左转黄灯sbit asg = p15;/ a路直行绿灯sbit asr = p13;/ a路直行红灯sbit asy = p14;/ a路直行黄灯sbit blg = p20;/ b路左转绿灯sbit blr = p16;/ b路左转红灯sbit bly = p17;/ b路左转黄灯sbit bsg = p23;/ b路直行绿灯sbit bsr = p21;/ b路直行红灯sbit bsy = p22;/ b路直行黄灯/* 定义max7219 端口信号 */sbit data = p25;sbit load = p26;sbit clk = p27;/* 定义设定按键 端口信号 */sbit next_switch = p05;sbit add_switch = p06;sbit sub_switch = p07;/* 时间及显示全局变量 */int aa,shi,ge,shi1,ge1,temp1;int p=0;int set1=10;int set2=5;int flag = 0;int gt4 = 14,13,12,11;/*数码管显示0-9,a,l*/unsigned char table=0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x73,0x77,0x0e;unsigned char table0=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08;/*子函数声明*/void delay(int z);/延迟void xtimer0();/定时中断void xtimer1();void check();void step1();void step2();void step3();void step4();void step5();void step6();void step7();void step8();void step9();void xint0();void xint1();void a_s_g();void b_s_g();int judge_key();void set_led_time();static void write (unsigned char reg_number, unsigned char dataout);/向指定的max7219内部寄存器写入数据static void sendbyte (unsigned char dataout);/向max7219发送一个字节串行数据static unsigned char lookupcode (int num);/查段码表将显示字符转换为显示段码static unsigned char lookupnum (int num);void init (void);/对max7219进行初始化,调用任何其他函数之前必需先调用此函数void shutdownstart (void);/进入停机方式void shutdownstop (void);/结束停机方式void displayteststart (void);/启动显示测试void displayteststop (void);/结束显示测试void setbrightness (char brightness);/设置led显示亮度,亮度值(brightness = 0-15)void clear (void);/关闭全部显示器void display (int num0, int num);/在指定数位上显示字符 /*主函数*/void main()ea=1;/开中断ex0=1;/允许外部中断int0中断it0=0;/定义int0触发方式px0=1;/中断优先级高ex1=1;/允许外部中断int1中断it1=0;/定义int1触发方式px1=1;/中断优先级高check();/开机自检step1();/第1个状态p0=0xff; while(1) step2();/第2个状态 step3();/第3个状态 step4();/第4个状态 step5();/第5个状态step6();/第6个状态step7();/第7个状态step8();/第8个状态step9();/第9个状态 void check()/开机自检子程序asg=1;alg=1;asr=1;alr=1;asy=1;aly=1;blg=1;bsg=1;blr=1;bsr=1;bly=1;bsy=1;delay(600);asg=0;alg=0;asr=0;alr=0;asy=0;aly=0;blg=0;bsg=0;blr=0;bsr=0;bly=0;bsy=0;init (); / 初始化max7219shutdownstart (); / 停机 shutdownstop (); / 结束停机displayteststart (); / 显示测试displayteststop (); / 结束显示测试setbrightness (0x0f); / 设置显示亮度/display (1,1); / 第1位led显示1/display (2,2); / 第2位led显示2/display (3,3); / 第3位led显示3/display (4,4); / 第4位led显示4/display (5,5); / 第5位led显示5/display (6,6); / 第6位led显示6/*定时中断子函数*/void xtimer0() interrupt 1th0=0x4c;tl0=0x00;aa+;/*延时子函数*/void delay(int z)int i,j;for(i=0;iz;i+)for(j=0;j110;j+);void step1()/第一个状态:ab道均亮红灯3s int temp;temp=4;/变量赋初值tmod=0x11;/定时器t0工作于方式1th1=0x20;tl1=0x10;th0=0x4c;tl0=0x00;/定时器赋初值 11.0592mhzea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)alr=1;asr=1; blr=1;bsr=1;alg=0;asg=0;blg=0;bsg=0;aly=0;bly=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减if(temp0)break;shi=temp/10;/显示十位ge=temp%10;/显示个位 display(1,shi);display(2,ge);display(3,shi);display(4,ge);void step2()/第二个状态:a直行绿 a左红 b全红int temp;temp=gt0+1;/变量赋初值temp1=temp+gt1;tmod=0x11;/定时器t0工作于方式1th0=0x00;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1) asg=1;asr=0;alr=1;alg=0;blg=0; blr=1;bsg=0;bsr=1;aly=0; bly=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;if(temp=5)temp1+;break;shi=temp/10;/显示十位ge=temp%10;/显示个位shi1=temp1/10;ge1=temp1%10;display(1,shi);display(2,ge);display(3,shi1);display(4,ge1);void step3()/第三个状态:a直行黄 a左红闪 b全红int temp;temp=6;/变量赋初值temp1=temp+gt1;tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)asg=0;asr=0;alg=0;aly=0;bsg=0;blg=0;blr=1;bsr=1; bly=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;asy=asy;alr=alr;if(temp0)temp1+;break;shi=temp/10;/显示十位ge=temp%10;/显示个位 shi1=temp1/10;ge1=temp1%10; display(1,shi);display(2,ge);display(3,shi1);display(4,ge1);void step4()/第四个状态:a左绿 a直红 b全红int temp;temp1+;temp=gt1+1;/变量赋初值tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1) asg=0;asr=1;alr=0;alg=1;blg=0; blr=1;bsg=0;bsr=1;aly=0; bly=0;asy=0;bsy=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;if(temp=5)temp1+;break; shi1=temp1/10;ge1=temp1%10;shi=temp/10;/显示十位ge=temp%10;/显示个位display(1,shi);display(2,ge);display(3,shi1);display(4,ge1);void step5()/第五个状态:a左黄闪 b直红闪int temp;temp=6;/变量赋初值tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)asg=0;asr=1;alg=0;alr=0;bsg=0;blg=0;blr=1; bly=0;bsy=0;asy=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;aly=aly;bsr=bsr;if(temp0)break;shi=temp/10;/显示十位ge=temp%10;/显示个位 shi1=temp1/10;ge1=temp1%10; display(1,shi);display(2,ge);display(3,shi1);display(4,ge1);void step6()/第六个状态:a全红b直绿左红int temp;temp=gt2+1;/变量赋初值temp1=temp+gt3;tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)asr=1;asg=0;alr=1;alg=0;bsg=1;bsr=0;blr=1;blg=0;aly=0; bly=0;asy=0;bsy=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;if(temp=5)temp1+;break;shi=temp/10;/显示十位ge=temp%10;/显示个位 shi1=temp1/10;/显示十位ge1=temp1%10;/显示个位 display(1,shi1);display(2,ge1);display(3,shi);display(4,ge);void step7()/第七个状态:a全红 b直行黄闪 b左红闪int temp;temp=6;/变量赋初值tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)blg=0;bly=0;bsr=0;bsg=0;asg=0;alg=0;alr=1;asr=1;aly=0;asy=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;bsy=bsy;blr=blr;if(temp0)temp1+;break;shi=temp/10;/显示十位ge=temp%10;/显示个位shi1=temp1/10;/显示十位ge1=temp1%10;/显示个位 display(1,shi1);display(2,ge1);display(3,shi);display(4,ge);void step8()/第八个状态:a全红b左绿直红 int temp;temp=gt3+1;/变量赋初值temp1+;tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)asr=1;asg=0;alr=1;alg=0;aly=0;asy=0;bsg=0;bsr=1;blr=0;blg=1; bly=0;bsy=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;if(temp=5)temp1+;break;shi=temp/10;/显示十位ge=temp%10;/显示个位 shi1=temp1/10;/显示十位ge1=temp1%10;/显示个位 display(1,shi1);display(2,ge1);display(3,shi);display(4,ge);void step9()/第九个状态:a直红闪,b左黄闪int temp;temp=6;/变量赋初值tmod=0x11;/定时器t0工作于方式1th0=0x4c;tl0=0x00;/定时器赋初值ea=1;/开中断et0=1;/开定时中断tr0=1;/开定时器t0et1=1;tr1=1;while(1)blr=0;blg=0;bsr=0;bsg=0;bsy=0;asg=0;alg=0;alr=0;aly=0;asy=0;if(aa=20)/定时20*50ms=1saa=0;/定时完成一次后清0temp-;/变量自减temp1-;bly=bly;asr=asr;if(temp0)temp1+;break;shi=temp/10;/显示十位ge=temp%10;/显示个位 shi1=temp1/10;/显示十位ge1=temp1%10;/显示个位 display(1,shi1);display(2,ge1);display(3,shi);display(4,ge);void init (void) data=1;load=1;clk=1; write(reg_scan_limit, 7); / 扫描8位数字 write(reg_decode, 0x00); / 设置不译码方式 shutdownstop(); / 结束停机方式,正常工作 displayteststop(); / 结束显示测试,正常工作 clear(); / 清零全部显示器 setbrightness(intensity_max); / 设置最大亮度void shutdownstart (void) write(reg_shutdown, 0); void shutdownstop (void) write(reg_shutdown, 1); void displayteststart (void) write(reg_display_test, 1);void displayteststop (void) write(reg_display_test, 0);void setbrightness (char brightness) brightness &= 0x0f; / 屏蔽参数中的多余位 write(reg_intensity, brightness); / 设置亮度void clear (void) char i; for (i=1; i 0; i-) unsigned char mask = 1 (i - 1); clk=0; / 使clk变低 if (dataout & mask) / 发送一位数据1或0 data=1; else data=0; clk=1; / 使clk变高 void xint0() interrupt 0 /外部中断int0a_s_g();void xint1() interrupt 2 /外部中断int1b_s_g();v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论