#define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2; //东西向指示灯 sbit RED_B=P0^3; sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;//南北向指示灯
uchar Time_Count=0,Flash_Count=0,Operation_Type=1;//延时倍数,闪烁次数,操作类型
void T0_INT() interrupt 1 //定时器 0 中断函数 {
TMOD=0x01; IE=0x82; TR0=1;
TH0=(65535-50000)/256; TL0=(65535-50000)%256; switch(Operation_Type) {
case 1:
RED_A=0;YELLOW_A=0;GREEN_A=1; RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=100) return; //5s( 100*50ms)切换 Time_Count=0;
4
Operation_Type=2; break; case 2:
if(++Time_Count!=10) return; Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;//东西向黄灯开始闪烁,绿灯关闭 if(++Flash_Count!=10) return; //黄灯闪烁5次 Flash_Count=0; Operation_Type=3; break; case 3:
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;//东西向红灯与南北向绿灯亮 5s if(++Time_Count!=100) return; //5s( 100*50ms) Time_Count=0;
Operation_Type=4; break; case 4:
if(++Time_Count!=10) return; Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;//南北向黄灯开始闪烁,绿灯关闭 if(++Flash_Count!=10) return; //黄灯闪烁5次 Flash_Count=0; Operation_Type=1; break; } }
//主程序 void main() {
TMOD=0x01; //T0 方式 1 IE=0x82; TR0=1; while(1); }
八、调试与运行
按照总原理图开始接线,在完成电路原理图以及编写程序后,开始用proteus软件开始仿真。整体运行后,电路显示结果与目标设想的一致,因此led模拟交通灯设计任务取得成功。
九、设计总结
通过一个星期的交通灯课程设计,我对单片机相关知识有了更深的了解,特别对protues软件画电路图及仿真的过程,我几乎是从零开始学习并使用的。这
5
次设计过程中,遇到了很多棘手的问题,很多东西,动起手来束手无策,大多都只得先通过查阅资料或者参考别人做类似课题,才能自己动手设计画图,编程调试。过程中还错误不少,就这个程序吧,我写了改,改了写,花了很长时间。还有就是protues软件仿真原来及整个过程,虽然并不太难,但是我是花了挺多时间才真正弄明白的。
这次的课程设计让我明白,在以后的学习中,应更注重知识的应用,更注重实质的掌握,自己也开始对单片机产生了浓厚的兴趣。
十、设计资料及参考文献
1、张毅刚.单片机原理及应用-C51编程+Proteus仿真.高等教育出版社,2012.11(2015.5重印)。
2、郭天祥.新概念51单片机C语言教.电子工业出版社,2009.1 3、阎石.数字电子技术基础教程. 清华大学出版社,2007.8
6