:基于单片机的交通灯设计 致 谢
在本次设计论文完成之际,首先要向我的指导老师霍老师表示真挚的谢意。在设计过程、论文写作期间,正是霍老师的指点,我才能顺利完成设计。
其次,还要感谢大学四年各位老师的悉心教导,本设计是围绕单片机而设计的,需要用到数电、模电、电路设计、C语言等方方面面的知识。在老师的指导下,同学的帮助下,加上个人的努力,本设计才能顺利完成。
由于本人学识有限,设计中、论文中难免有错,欢迎各位老师对本设计提出宝贵的意见。
32
附录1
源程序:
#include
void delayms(u8 ms); void tim_init(); u8 j=0;u8 flag; u8 numb=count1;
u8 led_buf[2]={0xed,0xde}; u8 disp_buf[4]={16,16,6,0}; bit modflag=0; bit dirflag=0; void main() {u8 keybuf;
ledout=led_buf[dirflag]; led_t2init(disp_buf); tim_init(); while(1)
{keybuf=scan_key(); switch(keybuf)
{case 0x0f: break;
case 0x0e: model0();break; case 0x0d: model1(0);break; case 0x0b: model1(1);break; default:break; } } } u8 scan_key() {u8 keybuf; key=0xff;
keybuf=key&0x0f; if(keybuf!=0x0f) {delayms(20);
if(keybuf!=(key&0x0f)) keybuf=0x0f;
:基于单片机的交通灯设计 }
return(keybuf); }
void model0() {if(modflag!=0) {modflag=0; numb=count2;
TR1=1;ET1=1; flag=1; } } void model1(bit k) {u8 i;
if(modflag==0) {modflag=1; if(dirflag==k)
{TR1=0;ET1=0; flag=0; ledout=led_buf[k]; for(i=0;i<4;i++) disp_buf[i]=9; }
else numb=count2; }
else if((flag==0)&&(dirflag!=k)) {ledout=led_buf[k];
dirflag=~dirflag; } } void tim_init() {TH1=0X3C; TL1=0XB0; TMOD=0X11; ET1=1;
TR1=1; flag=1; }
void t1_50ms(void) interrupt 3 {TH1=0X3C; TL1=0XB0; if(++j==10)
{unsigned char count,i; j=0;
count=numb>>1; disp_buf[0]=16; disp_buf[1]=16;
disp_buf[2]=count/10; disp_buf[3]=count; if(numb<=20)
{if(dirflag==0)sngreen=~sngreen; else ewgreen=~ewgreen;
34
} numb--; if(numb==0)
{if(modflag==1)
{TR1=0;ET1=0; flag=0; for(i=0;i<4;i++) disp_buf[i]=9; } numb=count1; dirflag=~dirflag; ledout=led_buf[dirflag]; } } } void delayms(u8 ms) {u8 i;
while(ms--)
{for(i=0;i<123;i++);} }
数码管驱动子程序: #define u8 unsigned char #define u16 unsigned int #define led_seg P0 #define led_dig P2 #define led_num 4
void led_t2init(u8 *dispbuf);
code u8 led_table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; u8 led_digset=0xfe; u8 led_dignum=0; u8 *led_dispbuf;
void led_t2init(u8 *dispbuf) {
led_dispbuf=dispbuf; EA=1; TH0=0xfe; TL0=0x0c; ET0=1; TR0=1;
TMOD=0x11; }
void led_t2(void) interrupt 1 {u8 i;
TH0=0xfe; TL0=0x0c; led_seg=0xff;
:基于单片机的交通灯设计 led_dig=0xff;
led_dig=led_digset;
i=*(led_dispbuf+led_dignum); i=led_table[i]; led_seg=i;
led_dignum++; led_digset<<=1; led_digset|=0x01;
if(led_dignum==led_num) {led_dignum=0; led_digset=0xfe; } }
36