只有自己真正接触尝试了,才知道自己的真实水平。也使我看清了自己的知识水平与各种综合能力,找出了自己的不足和差距。我将明确自己在今后要奋斗的目标与方向,勇往直前。 致谢
感谢老师、学校、同学、父母等。自己写
参考文献
1.周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真.北京航空航天大学出版社,2006
2.李朝青.单片机原理及接口技术.北京航空航天大学出版社.2009
3.沈德金,陈粤初.MCS-51系列单片机接口电路与应用程序实例.北京航空航天大学出版社.1990
4.数字电子技术基础.高等教育出版社.2001.
8.胡汉才.单片机原理及接口技术.清华大学出版社.1996.
9.何利民.MCS-51系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,2001
10.百度、谷歌、电子发烧友、VeryCD互联网共享等网站。
附录 源程序
/*********************************************************** 十字路口交通灯控制 C 程序
***********************************************************/ #include
typedef unsigned char uint8; typedef unsigned int uint16;
/*****定义控制位*******************************************/
sbit Time_Show_LED2 = P2^5; //Time_Show_LED2(直行时间显示)控制位 sbit Time_Show_LED1 = P2^4; //Time_Show_LED1(直行时间显示)控制位
sbit EW_LED2 = P2^3; //东西数码管个位控制
sbit EW_LED1 = P2^2; //东西数码管十位控制 sbit SN_LED2 = P2^1; //南北数码管个位控制 sbit SN_LED1 = P2^0; //南北数码管十位控制 sbit SN_Yellow = P1^6; //SN黄灯 sbit EW_Yellow = P1^2; //EW黄灯
sbit Nomor_Button = P3^5; //交通正常按键 sbit Busy_Btton = P3^6; //交通繁忙按键 sbit Special_Btton = P3^7; //交通特殊按键 sbit Special_LED = P2^6; //交通特殊指示灯 sbit Busy_LED = P2^7; //交通繁忙指示灯
sbit EW_ManGreen = P3^0; //EW人行道绿灯 sbit SN_ManGreen = P3^1; //SN人行道绿灯 sbit EW_ManRed = P3^3; //EW人行道红灯 sbit SN_ManRed = P3^4; //SN人行道红灯
bit Flag_SN_Yellow; //SN黄灯标志位 bit Flag_EW_Yellow; //EW黄灯标志位 char Time_EW; //东西方向倒计时单元 char Time_SN; //南北方向倒计时单元
uint8 EW = 60,SN = 40,EWL = 19,SNL = 19; //程序初始化赋值,正常模式 uint8 EW1 = 60,SN1 = 40,EWL1 = 19,SNL1 = 19; //用于存放修改值的变量
code uint8 table[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //1~~~~9段选码
code uint8 S[8] = {0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84}; //交通信号灯控制代码
/**********************延时子程序**************************/ void Delay(uint8 a) {
uint8 i; i = a;
while(i--); }
/*****************显示子函数******************************/ void Display(void) {
uint8 h,l;
h = Time_EW/10; l = Time_EW; P0 = table[l];
EW_LED2 = 1; //点亮EW_LED2
Delay(2);
EW_LED2 = 0; //熄灭EW_LED2 P0 = table[h];
EW_LED1 = 1; //点亮EW_LED1 Delay(2);
EW_LED1 = 0;
h = Time_SN/10; l = Time_SN; P0 = table[l];
SN_LED2 = 1; //点亮SN_LED2 Delay(2);
SN_LED2 = 0; P0 = table[h]; SN_LED1 = 1; //点亮SN_LED1 Delay(2);
SN_LED1 = 0;
h = EW1/10; l = EW1; P0 = table[l];
Time_Show_LED1 = 1; //点亮Time_Show_LED1 Delay(2);
Time_Show_LED1 = 0; P0 = table[h];
Time_Show_LED2 = 1; //点亮Time_Show_LED2 Delay(2);
Time_Show_LED2 = 0; }
/**********************外部0中断服务程序******************/
void ineterrupt_extern0(void) interrupt 0 {
EX0=0; //关中断
if(Nomor_Button==0) //测试按键是否按下,按下为正常状态 {
EW1=60; SN1=40; EWL1=19; SNL1=19; Busy_LED=0; //关繁忙信号灯 Special_LED =0; //关特殊信号灯 }
if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态 { EW1=45; SN1=30; EWL1=14; SNL1=14; Special_LED=0; //关特殊信号灯 Busy_LED=1; //开繁忙信号灯 }
if(Special_Btton==0)//测试按键是否按下,按下为特殊状态 { EW1=75; SN1=55; EWL1=19; SNL1=19; Busy_LED=0; //关繁忙信号灯 Special_LED =1;//开特殊信号灯 } EX0=1; //开中断 }
/**********************T0中断服务程序*******************/ void timer0(void)interrupt 1 using 1 {
static uint8 counter; TH0 = 0x3C;
TL0 = 0xB0; //定时器定时20ms重新装入初值 counter++;
if (counter == 10) {
if (Flag_SN_Yellow == 1) //测试南北黄灯标志位 { SN_Yellow = ~SN_Yellow; }
if (Flag_EW_Yellow == 1) //测试东西黄灯标志位 { EW_Yellow = ~EW_Yellow; } }
if (counter == 20) {
Time_EW--;
Time_SN--;
if (Flag_SN_Yellow == 1) //测试南北黄灯标志位 {SN_Yellow = ~SN_Yellow;}
if (Flag_EW_Yellow==1) //测试东西黄灯标志位 {EW_Yellow = ~EW_Yellow;} counter = 0; } }
void timer0_init() {
TMOD |= 0x01;
TMOD &= 0x01; //定时器0工作方式设置 TH0 = 0x3C;
TL0 = 0xB0; //定时器定时20ms装初值 TR0 = 1; //打开定时器0 }
void int0_init() //定时器0初始化子函数 {
ET0 = 1; //定时器0中断使能打开 EA = 1; //CPU总中断使能打开 }
void ext_init() //外部中断初始化子函数 {
IT0=1; //INT0负跳变触发 EX0=1; //开外部INTO中断 }
/*********************主程序开始***********************/ void main(void) {
Busy_LED=0; Special_LED=0; timer0_init(); int0_init(); ext_init();
while(1) {
/*******S0状态**********/ SN_ManRed=0;
SN_ManGreen=1; //SN人行道通行 EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0;
Flag_EW_Yellow=0; //EW关黄灯显示信号