C语言代码交通灯控制器

上传人:1666****666 文档编号:39152556 上传时间:2021-11-10 格式:DOC 页数:18 大小:95KB
返回 下载 相关 举报
C语言代码交通灯控制器_第1页
第1页 / 共18页
C语言代码交通灯控制器_第2页
第2页 / 共18页
C语言代码交通灯控制器_第3页
第3页 / 共18页
点击查看更多>>
资源描述
#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();void A_S_G()/外部中断INT0显示子程序ASG=1;ASR=0;ALG=1;ALR=0;BSG=0;BSR=1;BLG=0;BLR=1; BLY=0;BSY=0;ALY=0;ASY=0;delay(1000);return;void B_S_G()/外部中断INT1显示子程序ASG=0;ASR=1;ALG=0;ALR=1;BSG=1;BSR=0;BLG=1;BLR=0; BLY=0;BSY=0;ALY=0;ASY=0;delay(1000);return;void xtimer1() interrupt 3set_led_time();void set_led_time()int value;value = judge_key();TH1 = 0x20;TL1 = 0x10;ET1 = 0;if(flag = 3)flag = 0;switch(value)case 1:p = (p+1)%4;if(p = 0)set1 = 10;set2 = 5;if(p = 1)set1 = 10;set2 = 11;if(p = 2) set1 = 8;set2 = 5;if(p = 3) set1 = 8;set2 = 11;break;case 2:gtp += 1;set1 = gtp/10;/显示十位set2 = gtp%10;/显示个位break;case 3:gtp = gtp-1;set1 = gtp/10;/显示十位set2 = gtp%10;/显示个位break;default:break;else flag+;display(5,set1);display(6,set2);ET1=1;int judge_key() if(next_switch = 0)return(1);if(add_switch = 0) return(2);if(sub_switch = 0) return(3);return(0);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 其他分类


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!