预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

一、课程设计的目的: 1.增进对单片机的感性认识,加深对单片机理论方面的理解。 2.掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通讯等。 3.了解和掌握单片机应用系统的软/硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。 二、课程设计题目:电子秒表 设计一个电子秒表,该秒表在一个按键K控制下工作,当该按键K第一次按下时,秒表开始计数;第二次按下时,秒表停止计数;第三次按下时,秒表清零。 课程设计实验板 流程图 开始 按键K第一次按下 按键K第二次按下 按键K第三次按下 秒表计数 秒表停止计数 秒表清零 主程序 结束 程序 程序中:nn是主函数中的延时循环变量,同时也是中断服务程序中的局部静态变量;kk是按键值;state是状态变量;t0是随时定时器中断次数递增的变量。 P3.0引脚接按键K(n0);P2.0~P2.2引脚连接的LED灯显示状态。 #include"AT89X51.h" Unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; unsignedcharn0; unsignedcharkk=8,t0=0,state=0; voidmain() { unsignedintnn; TMOD=0x01; //定时器T0,工作方式1 TH0=0x3c; //设置初值0x3cb0=65535-50000,50ms中断一次 TL0=0xb0; TR0=1; //启动定时器T0 ET0=1; //允许定时器T0中断 EA=1; //开总中断 while(1) { P3=0xff; if(P3_0==0) //如果P3.0引脚连接的按键K按下 { for(nn=0;nn<1000;nn++) //循环语句延时,消除抖动 if(P3_0==0){n0=1;kk=0;} //如果按键还在按下状态,则n0=1,kk=0; else{n0=0;} //否则n0=0,kk=8 while(!P3_0); //等待按键抬起 } P1=table[t0/10]; //P1口连接的数码管显示t0的高位 P0=table[t0%10]; //P0口连接的数码管显示t0的低位 switch(state) {case0: //状态0(清零) P2_0=0;P2_1=1;P2_2=1; //P2.0连接的LED灯亮 if(n0==1)state=1; //如果按键K按下,进入状态1 break; case1: //状态1(计数) P2_0=1;P2_1=0;P2_2=1; //P2.1=0相连的LED灯亮 if(n0==1)state=2; //如果按键K按下,进入状态2 break; case2: //状态2(保持) P2_0=1;P2_1=1;P2_2=0; //P2.2=0相连的LED灯亮 if(n0==1)state=0; //如果按键K按下,进入状态0 break; } n0=0; //键值变量清零 }} voidtimer0()interrupt1 //定时器T0中断服务程序 {staticunsignedcharnn; //设置局部静态变量 TH0=0x3c; //重置初值 TL0=0xb0; nn++; if(nn==20) //中断20次,为1S {nn=0; if(state==0) //状态0,清零,使t0=0 t0=0; if(state==1) //状态1,计数,使t0加1 t0=t0+1; if(state==2) //状态2,保持,使t0等于t0 t0=t0; if(t0>100) t0=0; }}