单片机/微机接口课程设计说明书 开始 上电数码管显示初始化 判断有无按键 N Y 按键次数累加为1,秒表开始计时 判断有无按键 Y N 按键次数累加为2,秒表计时停止 N 数码管显示计时时间 判断有无按键 Y 按键次数累加为3,秒表计时清零 结束 判断有无按键 Y 按键次数累加为4,秒表启动计时 N 判断有无按键 Y 按键次数累加为5次,随后被置为1,秒表计时启动 N 11
单片机/微机接口课程设计说明书 图5.2按键控制主控器流程图
5.3 源程序
见附录1。
6 调试过程
6.1 硬件调试
电路板焊接好之后,接通5V稳压电源。按照设计要求下载程序到51单片机中。按下对应的按键,如果数码管显示,并且计时时间正确,说明电路焊接良好,程序正确。
若数码管不显示,立即查看是否有虚焊或露焊现象,及时补焊。若数码管还是不显示,则用万用表测试芯片上供电端,是否有5V电压供电,若万用表显示不在5V左右,判断出供电端错接,则检查供电电路,重新连接供电电路。之后,测试所有线路的接地端,看是否接地。若接线良好,则切断电源,继续检测电感、三极管等器件的
焊接是否正确。将万用表调到电阻“蜂鸣器”档,按顺序依次检测所有的管脚连接是
否正常。若电阻“蜂鸣器”响起,则表明管脚接线正常,否则检查线路,直至每一个芯片和按键的管脚连接良好,数码管显示正确。 若数码管显示依然有误,则尝试调整程序。
6.2 软件调试
软件调试首先用Keil C51编译器进行调试。在使用Keil C51编译器时,对工程成功地进行调试、编译、连接以后,在主菜单中打开“调试”栏,点击“开始/停止调试模式”,即可进入软件模拟仿真调试状态,Keil C51内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能非常强大,可以在没有硬件和仿真器的情况下进行程序的调试,但是在时序上,软件模拟仿真是达不到硬件的时序的。
进入调试状态后,“调试”栏菜单项中原来不能用的命令现在已经可以使用了。调试程序看是否能仿真,如果运行正常再将在Keil C51编译器中调试好的程序烧写至单片机。可根据电路的运行情况推测出程序出错的部分,修改程序后再经过Keil C51编译器调试后烧到单片机,反复检测直到能工作完全正常。
本程序采用单片机C语言编写,用Keil C51编译器编程调试。在程序调试中解决了“按键的抖动”问题,为了使数码管的显示更清晰,通过程序对数码管做了“消影”处理。对于程序扫描并识别按键的部分,通过“多分支选择语句” 实现。定时器计时,10ms产生执行一次中断服务,经过10次中断,实现0.1s显示。
最终,软件调试到能准确显示计时数据,并且能通过按键控制计时模式,停止、
12
单片机/微机接口课程设计说明书 读取、清零。
7 结论
本次的课程设计使我进一步巩固了书本上的知识,做到了学以致用。通过STC下载软件、PROTEUS仿真软件和编译软件KEIL.C使我进一步了解了基于单片机的设计制作过程。其中最为困难的是编程部分,我们上网找了好多资料,虽然经过自己的修改,但还是有很多功能不能实现。总结经验的时候我们得出这样的结论,学习应该学以致用,有目的的去学习,如果学了不用等于没学。其次,要理论联系实际,这样才会取得事半功倍的效果。此次课程设计历时两个周,从最开始的资料的收集,核对元器件,程序的设计,到最后的调试和再调试。我从中学到了许多知识。通过查找各种资料,我更加熟练的运用所学过的信息检索方法。也懂得了耐心的重要性,调试过程挑战了我的坚持能力,磨砺了我的性格。这次经历不仅仅扩充了我的知识面,培养了动手能力,合作的意识,还教会了我怎样做好一件事的方法。课程设计的过程带给我的是对所学知识的复习是对新知识的拓展,是对遇到各种困难的坚持,也是对坚持就是胜利这种信仰的肯定。虽然在这中间走过许多歪路,遇到很多失败,但是最终带给我是收获。
13
单片机/微机接口课程设计说明书 8 附录
附录1 源程序代码 #include
//包含52单片机头文件
#define uchar unsigned char //宏定义 #define uint unsigned int
sbit simuseri_CLK=P2^5; //声明P2口第六位,作为74LS164的时钟信号 sbit simuseri_DATA=P2^4; //声明P2口第五位,作为74LS164的串行输入 sbit a0=ACC^0;
uint temp,aa,count,dd,bai,shi,ge;
uchar code table1[]={0x18,0x5F,0x68,0x4A,0x0F,0x8A,0x88,0x5E,0x08,0x0A}; uchar code table2[]={0x10,0x57,0x60,0x42,0x07,0x82,0x80,0x56,0x00,0x02};
//共阳极数码管码表
void display(uint bai,uint shi,uint ge);//声明子函数 void delay(uint z); void init(); uint key1times; sbit key1=P1^3; void keyscan()
//位声明
//按键扫描执行函数
//声明子函数 //声明子函数
{ if(key1times==0)
temp=0; if(key1==0)
{
delay(5); if(key1==0)
{
while(!key1);
//等待按键释放
start:key1times++; //累计按键的次数 switch(key1times) //多分支选择语句
{
case 1:
temp=0; break;
//按键消抖
case 2:
14