实验要求: 该课程设计是利用MCS-51单片机内部的定时/计数器、中断系统、以及行列键盘和LCD显示器等部件,设计一个单片机电子时钟。设计的电子时钟通过液晶显示,并能通过按键实现设置时间和暂停、启动控制等。用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数 实验原理: 用LCD显示一个数组.用定时计数器计时,以实现时钟自加.将记得的时间写入LCD显示数组.不停的刷新LCD显示,以达到LCD显示时间的目的 本次实验的体会(结论) 在这期间,我得到了同学的帮助。以前的汇编语言没学好,一开始的程序这块儿就要令我束手无策了。后来开始学C语言单片机。通过在仿真软件上一便一便的调试,完成了本程序。 最后说明自己对这门课程的感受,课堂教学考虑到大多数同学的需求,主要强调“基本”—基本知识、基本理论、基本方法、基本技能。而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。课外学习很重要,只用课堂上的时间想把单片机学好基本上是不可能的 仿真效果图: 流程图: 源代码: #include
#define uchar unsigned char #define uint unsigned int sbit rs=P2^0; sbit rw=P2^1; sbit lcden=P2^2; sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; uchar code table[]={\" 2010-06-17 wen\uchar code table1[]={\" 00:00:00\uchar m,keynum=0; char miao,shi,fen; void delay(uchar x) //延时 { uchar y; while(x--)for(y=110;y>0;y--); } void write_com(uchar com) //LCD写指令 { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;} void write_dat(uchar dat) //LCD写数据 { rs=1; lcden=0; P0=dat; delay(5); lcden=1; delay(5); lcden=0;} void ini() { //初始化 uchar i; k1=k2=k3=1; rw=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x80); for(i=0;i<16;i++) { write_dat(table[i]); delay(5);} write_com(0x80+0x40); for(i=0;i<16;i++) { write_dat(table1[i]); delay(5);} TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; IE=0x82; TCON=0x10; } void display_sj(uchar dat,uchar pos) //显示时间 { uchar ge,shi; shi=dat/10; ge=dat%10; write_com(0x80+0x40+pos); delay(5); write_dat(0x30+shi); delay(5); write_dat(0x30+ge); } void keyscan() //按键扫描 { if(k1==0) { delay(5); if(k1==0) { while(!k1); TR0=0; keynum++; if(keynum==1) //如果按下一次改秒钟 { write_com(0x80+0x40+14); write_com(0x0f); } if(keynum==2) //如果按下两次改分钟 { write_com(0x80+0x40+11); } if(keynum==3) //如果按下三次改小时 { write_com(0x80+0x40+8); } if(keynum==4) //如果按下四次,正常运行 { keynum=0; TR0=1; write_com(0x0c); } } } if(keynum!=0) { if(keynum==1) //开始改秒 { if(k2==0) //去抖 { delay(5); if(k2==0) { while(!k2); miao++; //秒加1 if(miao==60) miao=0; display_sj(miao,13); //刷新显示 write_com(0x80+0x40+14); //刷新LCD显示方式 write_com(0x0f); } } if(k3==0) { delay(5); if(k3==0) { while(!k3); miao--; if(miao==-1) miao=59; display_sj(miao,13); write_com(0x80+0x40+14); write_com(0x0f); } } } if(keynum==2) //开始改分 { if(k2==0) { delay(5); if(k2==0) { while(!k2); fen++; if(fen==60) fen=0; display_sj(fen,10); write_com(0x80+0x40+11); write_com(0x0f); } } if(k3==0) { delay(5); if(k3==0) { while(!k3); fen--; if(fen==-1) fen=59; display_sj(fen,10); write_com(0x80+0x40+11); write_com(0x0f); } } } if(keynum==3) //开始改小时 { if(k2==0) { delay(5); if(k2==0) { while(!k2); shi++; if(shi==60) shi=0; display_sj(shi,7); write_com(0x80+0x40+8); write_com(0x0f); } } if(k3==0) { delay(5); if(k3==0) { while(!k3); shi--; if(shi==-1) shi=23; display_sj(shi,7); write_com(0x80+0x40+8); write_com(0x0f); } } } } } void main() { ini(); //调初始化子程序 while(1) { keyscan(); //调用按键子程序 } } void t0() interrupt 1 //中断子程序 { TH0=(65536-50000)/256; //定时器置初始值 TL0=(65536-50000)%256; m++; if(m==17) { m=0; miao++; //秒加1 if(miao==60) {miao=0; fen++; //分加1 if(fen==60) {fen=0; shi++; //小时加1 if(shi==24) shi=0; display_sj(shi,7); } display_sj(fen,10); } display_sj(miao,13); } } 评阅教师特殊评语: 评阅教师: 日 期: