五、调试
把程序从KEIL中生成HEX文件,导入单片机中,测试是否实现题目要求的各个功能。
1.由于开始计算中断初始时间不准确,故重新设置初始化时间; 2.经过调试,延时时间设为1000效果最佳; 3.由于3通道数要求过于复杂,故采用双通道设计;
4.由于难以实现一个按键具备:开始、停止及清零功能,所以只能采用三个按键分别控制。
经过耐心的调试,最终实现设计要求。PROTEUS仿真图如图:
图05.01 一通道图
16
图05.02 二通道图
六、课程设计心得体会
回顾起此次课程设计,感觉受益匪浅,从拿到题目到完成整个编程,从理论实践,学到很多很多的课堂理论中没学到过的东西,不仅对键盘的识别技术这章节的知识点有了深刻的认识,而且对这学期开设的单片机这门课程有了更全面的了解,尤其是在学习使用proteus软件片编程和仿真时收获良多。通过这次单片机课程设计,还使我懂得了实践的重要性。同时在程序调试的过程中提高己的发现问题、解决问题、实际动手和独立思考的能力。
使用软件和编写程序时一定要注意每一个细节,一个分号的遗漏也会造成错误。制作前一定要做好规划设计,反复论证和计算,防止考虑不到的地方使得做好的东西需要翻工。如果制作或使用中发现问题,既极大地打击积极性和自信心,还会极大地消耗时间,拖延项目的进度。制作硬件也一定要耐心细致,极小的失误都会造成短路等问题而直接造成大错。在设计中,如果没有考虑到哪怕何一个
17
细节,都有可能让没考虑到的情况造成失误,使各个子程序的时序和运行之间可能会互相干涉和冲突。
此外遇到问题有时候凭借一个人或一组人的智慧是不好解决的。我们周围有许多很强的同学,还有许多经验丰富,实力雄厚的学长,通过请教和讨论可以产生一种茅塞顿开的效果。事情总是越说越明白,而且好多非常有新意和实用价值的想法也是在大家的讨论中得到和发展出来的。
参考文献
[1] 刘娟,梁卫文等编著.单片机C语言与PROTEUS仿真技能实训【M】.北京:中国电力出版社,2010.
[2] 彭伟编著.单片机C语言程序设计试训100例—基于8051+Proteus仿真【M】.北京:电子工业出版社,2009.
[3] 吴亦锋、陈德为.单片机原理与接口技术.北京:电子工业出版社,2010.
[4] 边清远、王志强.MCS-51单片机运用开发实用子程序.北京:人民邮电出版社,2005. [5] 姚国林.单片机原理与应用技术.北京:清华大学出版社,2009.
附录:源程序代码
#include \
#define THC0 0xd8 #define TLC0 0xf0 void StarandStop();
unsigned char code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0-9段数码管,共阴极 unsigned char DataBuffer[4]={0,0,0,0},DataBuffer_1[4]={0,0,0,0},DataBuffer_2[4]={0,0,0,0};
//四个数码管显示数值,数组变量定义 unsigned int a=1;
unsigned int hdrSec_1=0,miao_1=0,hdrSec_2=0,miao_2=0; bit flag_1=0,flag_2=0;//三个通道数码管刷新标志位 sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2;
18
sbit P13=P1^3; sbit P14=P1^4; sbit P15=P1^5; sbit P16=P1^6; sbit P17=P1^7; sbit P07=P0^7;
/*************************程序初始化**************************************/ void timer1_init() { TMOD=0x11;//初始化两个定时器 TR0=1; //启动定时器0 ET0=1; //允许定时器中断 EA=1; //总中断打开 TH0=THC0; TL0=TLC0; }
/*********显示程序****************************/ void display() { unsigned char b; int x; while(1) { if(miao_1==10)P16=0; if(miao_2==10)P17=0; if(a==1) { if(miao_1%2==1)P15=0; else if(miao_1%2==0) P15=1; DataBuffer[0]=DataBuffer_1[0]; DataBuffer[1]=DataBuffer_1[1]; DataBuffer[2]=DataBuffer_1[2]; DataBuffer[3]=DataBuffer_1[3]; } if(a==2) { if(miao_2%2==1)P15=0; else if(miao_2%2==0)P15=1; DataBuffer[0]=DataBuffer_2[0]; DataBuffer[1]=DataBuffer_2[1]; DataBuffer[2]=DataBuffer_2[2]; DataBuffer[3]=DataBuffer_2[3]; } for(b=0;b<6;b++)
19
{ P2=0xFF; switch(b) { case 0:P2 = 0xFE;P0 = 0x3F;break; case 1:P2 = 0xFD;P0 = Duan[a];break; case 2:P2 = 0xFB;P0 = Duan[DataBuffer[0]];break; case 3:P2 = 0xF7;P0 = Duan[DataBuffer[1]];P07=0x80;break; case 4:P2 = 0xEF;P0 = Duan[DataBuffer[2]];break; case 5:P2 = 0xDF;P0 = Duan[DataBuffer[3]];break; } for(x=1000;x>1;x--); } } }
/************************中断程序***********************************/ void timer0() interrupt 1 { TMOD=0x11;//初始化两个定时器 TH0=THC0; TL0=TLC0;
/*********************通道设置*****************************************/ if(P13==0) { a=1; } if(P14==0) { a=2; } StarandStop();
if(flag_1==1&&flag_2==1) { hdrSec_1++; hdrSec_2++; if(hdrSec_2>=99) { hdrSec_2=0; miao_2++; } if(miao_2>=99) miao_2=0; DataBuffer_2[0]=miao_20/10; //前两位显示秒表 DataBuffer_2[1]=miao_2;
20