西安文理学院课程设计报告
参考文献
[1]李全利、 迟荣强,单片机原理及接口技术[M],北京:高等教育出版社,2004
[2]凌玉华,单片机原理及应用系统设计[M],长沙:中南大学出版社,2006 [3]张毅刚,MCS-51单片机应用设计[M],哈尔宾:哈尔宾工业大学出版社,1997
[4]胡汉才,单片机原理及应用[M],北京:清华大学出版社,2004
[5]何立明,单片机应用系统设计[M],北京:北京航空航天大学出版社,1990
[6]王荣良,计算机接口技术[M],北京:电子工业出版社,2003
[7]陈光东,单片机微型计算机原理与接口技术[M],武汉:华中理工大学出版社,1998
[8]王幸之、钟爱琴、王雷、王闪,AT89系列单片机原理与接口技术[M],北京:北京航空航天大学出版社,2004
[9]张道德,单片机接口技术(C51版)[M],北京:中国水利水电出版社,2007
[10]王为青、程国钢,单片机KEIL CX51应用开发技术[M],北京:人民邮电出版社,2007
[11]张靖武、周灵彬,单片机系统的PROTEUS设计与仿真[M],北京:电子工业出版社,2007
第 16 页
西安文理学院课程设计报告
附 录
相关的程序代码:
//****************************头文件******************************** #INCLUDE
//****************************宏定义******************************** #DEFINE UCHAR UNSIGNED CHAR #DEFINE UINT UNSIGNED INT
//****************************位声明******************************** SBIT KEY1=P1^0; SBIT KEY2=P1^1; SBIT KEY3=P1^2; SBIT KEY4=P1^3;
SBIT KEY5=P1^4;//***开始计时 SBIT KEY6=P1^5;//***暂停 SBIT KEY7=P1^6;//***重置 SBIT FMQ=P2^1;
//************************数码管显示的数值************************** UCHAR CODE TABLE[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92, // 0 1 2 3 4 5
0X82,0XF8,0X80,0X90,0XBF,0X0FF};
// 6 7 8 9 - 灭
//****************************函数声明****************************** VOID JIA(); VOID JIAN();
//********************数组定义,数组内含有8个数值****************** UCHAR TABLE1[8],TABLE2[8],TABLE3[8],TABLE4[8];
//**************************时间显示初始值************************** UCHAR SHI=3,FEN=0,MIAO=0; UCHAR SHI2,FEN2,MIAO2;
//**************************定义全局变量**************************** UCHAR SHI1,FEN1,MIAO1; UCHAR SHI4,FEN4,MIAO4; UCHAR HMFLAG=0;
UCHAR FLAG, FLAG1, WSS, CNT, CNT1, ALM1; // 1秒 等时 位闪 次数 校时 闹1 UINT FLAG2; // 蜂鸣
//*********************延时函数,用于动态扫描数码管***************** VOID DELAY(UCHAR I) { UCHAR X,Y;
FOR(X=I;X>0;X--)
第 17 页
西安文理学院课程设计报告
FOR(Y=120;Y>0;Y--); }
//*******************************初始化函数************************* VOID INIT()
{ TMOD=0X11; //工作方式1
TH0=0X3C; //定时时间为:50MS (65536-50000)/256 TL0=0X0B0; //(65536-50000)%6 TH1=0XFE; TL1=0X0C; ET0=1;
ET1=1; //打开定时器 EA=1; //开总中断 TR0=1; //启动定时器 }
//********************显示子函数,用于显示时间数值***************** VOID DISPLAY() { UCHAR I,J;
IF(CNT!=4||WSS==0)
{ TABLE1[0]=MIAO; //分离秒的个位与十位 TABLE1[1]=MIAO/10; } ELSE
{ TABLE1[0]=TABLE1[1]=11;} IF(CNT!=5||WSS==0)
{ TABLE1[3]=FEN; //分离分的个位与十位 TABLE1[4]=FEN/10; } ELSE
{ TABLE1[3]=TABLE1[4]=11;} IF(CNT!=6||WSS==0)
{ TABLE1[6]=SHI; //分离时的个位与十位 TABLE1[7]=SHI/10; } ELSE
{ TABLE1[6]=TABLE1[7]=11;} TABLE1[2]=TABLE1[5]=10; J=0X7F;
FOR(I=0;I<=7;I++) //从秒到时的扫描 { P3=J;
P0=TABLE[TABLE1[I]]; //显示数值 DELAY(10);
J=_CROR_(J,1); //循环右移 } }
//*******************显示子函数,用于显示定时1时间***************** VOID DISPLAY1() { UCHAR I,J;
第 18 页
西安文理学院课程设计报告
IF(ALM1==0)
{ IF(CNT!=1||WSS==0)
{ TABLE2[0]=MIAO1; //以下含义同上 TABLE2[1]=MIAO1/10; } ELSE
{ TABLE2[0]=TABLE2[1]=11;} IF(CNT!=2||WSS==0)
{ TABLE2[3]=FEN1; TABLE2[4]=FEN1/10; } ELSE
{ TABLE2[3]=TABLE2[4]=11;} IF(CNT!=3||WSS==0)
{ TABLE2[6]=SHI1; TABLE2[7]=SHI1/10; } ELSE
{ TABLE2[6]=TABLE2[7]=11;} } ELSE
TABLE2[0]=TABLE2[1]=TABLE2[3]=TABLE2[4]=TABLE2[6]=TABLE2[7]=10; TABLE2[2]= TABLE2[5]=10; J=0X7F;
FOR(I=0;I<=7;I++) { P3=J;
P0=TABLE[TABLE2[I]]; DELAY(10);
J=_CROR_(J,1); } }
//********************显示秒表子函数,用于显示时间数值***************** VOID DISPLAY2() { UCHAR I,J;
{ TABLE2[0]=MIAO2; //分离秒的个位与十位 TABLE2[1]=MIAO2/10;
TABLE2[3]=FEN2; //分离分的个位与十位 TABLE2[4]=FEN2/10;
TABLE2[6]=SHI2; //分离时的个位与十位 TABLE2[7]=SHI2/10;}
TABLE2[2]=TABLE2[5]=10; J=0X7F;
FOR(I=0;I<=7;I++) //从秒到时的扫描 { P3=J;
P0=TABLE[TABLE2[I]]; //显示数值 DELAY(2);
J=_CROR_(J,1); //循环右移
第 19 页
西安文理学院课程设计报告
} }
//***********************时间子函数 *****************************// VOID SHIJIAN()
{ IF(FLAG>=20) //判断是否到一秒 { WSS=~WSS; FLAG=0; //到了,则标志位清零 IF(CNT1!=0)
{ MIAO4++; //秒加1
IF( MIAO4>59) //判断秒是否到60S { MIAO4=0; //到了,则清零 FEN4++; //分加1
IF(FEN4>59) //以下含义同上 { FEN4=0; SHI4++; IF(SHI4>23) SHI4=0;
} } } ELSE
{ MIAO++; //秒加1
IF( MIAO>59) //判断秒是否到60S { MIAO=0; //到了,则清零 FEN++; //分加1
IF(FEN>59) //以下含义同上 { FEN=0; SHI++; IF(SHI>23) SHI=0;
} } } } }
//**************************键盘扫描子函数************************// VOID KEY_SCAN() { IF(KEY1==0)
{ WHILE(!KEY1) //防止掉显 { IF(CNT==1||CNT==2||CNT==3) { DISPLAY1(); } IF(CNT==0||CNT==4||CNT==5||CNT==6||CNT==8) { DISPLAY(); } IF(CNT==7) {DISPLAY2();}
第 20 页