PAGE1-《单片机原理与应用》课程设计总结报告

…………………………………123.表一:元器件清单………………………………………134.时钟程序源码……………………………………………14题目:单片机电子时钟的设计与实现课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。

课程设计的基本任务是使用89C51单片机最小系统,综合应用单片机定时器、中断、数字显示、键盘输入等知识,设计一个由单片机和简单外设控制的电子时钟。 主要功能要求 最基本的要求 1) 使用MCS-51单片机设计时钟。 需要有一个 6 位 LED 显示屏和 3 个按键输入。 2)完成硬件的物理制作或者使用Pruteus仿真(注意位驱动器要能够提供足够的电流)。 3)6位LED数码管从左到右显示时、分、秒(各占2位),采用24小时标准计时系统。 从 000000 开始计时,到 235959 后变为 000000。 4) 使用 3 个按键分别作为时、分、秒的调节键。 每按一个键,对应的显示值加1。分、秒加到59,再按一下按键,变为00; 将小时添加到 23,然后按按钮更改为 00。调整期间不会向上舍入到上一个单位(例如,分钟添加到 59 并变为 00,但小时不会更改)。 5)软件设计必须使用MCS-51片内定时器并采用定时中断结构。 不得使用软件延迟方法或其他时钟芯片。 6)设计八段数码管显示电路并编写驱动程序,输入并调试字符分割程序和数码显示程序。 7)掌握软硬件联调的方法。 8) 完成系统硬件电路的设计和制作。 9) 完成系统程序的设计。 10) 完成整个系统的设计、调试和制作。

11)完成课程设计报告。 基本要求 1) 实施最基本要求的第 1 至 10 部分。 2)键盘输入可以控制电子钟的走时/调试。 3) 设计键盘输入电路并编程和调试。 4)掌握键盘与显示器配合使用的方法和技巧。 改进性能部分 1)设置三个附加按键,分别将时、分、秒调整为负1。 2)根据上述设计,修改程序,制作电子秒表。 分钟和秒各占2位显示,1/10秒和1/100秒各占1位显示。 设置两个按键分别为启动/停止和清除(清除应在停止后才有效)。 3)完成(2)后,时钟和秒表合二为一,同时使用时不会互相影响。 您可以随意切换时钟和秒表,而不影响走时和秒数。 总体设计框图及整机概述。 总体设计框图及整机概述。 1)在走时模式下打开电源,时间显示正常。 在此模式下,时钟是可调的。 2)共设置7个按钮,分别是模式按钮、功能按钮、加一按钮、减一按钮、复位按钮、秒表启动按钮、秒表复位按钮。 按下模式按钮,模式将在“走时/时间调整/显示和秒表显示与调整”两种模式之间切换。 3) 在时钟模式下,使用功能键选择是否正常运行时间或进入调试(时、分、秒)模式。 4) 按加一按钮将值(时、分、秒)加一。 5) 按减一按钮将值(时、分、秒)减一。 6) 按秒表上的开始/暂停按钮可随时启动和停止秒表。

7) 当按下秒表中的清除按钮时,秒表的计数将被清除(仅在秒表停止后)。 8) 按复位按钮后,无论状态如何,都会重新开始。 9) 开机时钟和闹钟均为00:00:00。 各硬件单元电路的设计、参数分析及原理说明。 电源电路元件有限,没有电源电路部分。 采用9V电池经7805稳压后供电。按键参见书P232键盘接口电路原理图。 P3 端口(不包括 P3.6)连接键盘按键。 当按下按钮时,P3端口被拉至低电平,向单片机发出信号,使单片机产生中断。 然后单片机指令对应的P0口,P2口发生变化。 单片机最小系统参考实验指南、教材和网络资料设计按钮级复位。 LED数码管首先使用P0口作为段码输出。 由于P0口输出级没有上拉电阻,所以需要增加一排电阻作为其上拉电阻。 其次,采用共阳极数码管。 当段码端为低电平时,LED点亮。 此时数码管将电流灌入89S51芯片的P0口。 为了防止烧坏芯片,需要添加1KΩ的限流电阻。 考虑到数码管的亮度,采用PNP晶体管作为驱动电路。 基极接1KΩ电阻,然后接P2口(P2.0~P2.5)进行位选择。 发射极接5V电源,集电极接数码管选择。 软件流程图及流程说明 调用显示子程序 调用显示子程序 调用启动时钟或秒表 查询程序 调用按键扫描 子程序 调用方式查询 子程序初始化 启动 等待定时器中断 1)主程序流程图 流程图说明 初始化:包括定时器赋值初始值并对每个存储单元进行初始化。

启用定时器中断并启用CPU 中断。 时间显示和调整子程序、秒表显示和调整子程序的流程图与时间调整模式子程序类似。 时间调整模式设置 时间调整模式设置秒/分/小时数据分别发送到显示功能Num11? 获取key值并发送给cpuY。 分钟值加 1。键值被清除。 NNum11 的值为 2? 数据等决定参数。 然后通过仿真软件等调试,确保参数正确后开始使用AD绘制原理图,然后生成PCB进行布局。 焊接电路板时,也出现了问题。 我不小心把7805焊接到了7905上,导致又要调试一段时间。 软件设计部分:设计软件时首先要考虑要完成的功能,确定合理的算法。 一个合理的算法不仅要能够实现功能,而且在添加功能时要方便灵活。 有些人使用各种方法来实现某种功能,结果破坏了程序结构。 当他们想要添加功能或修改其他功能时,大部分程序结构都会被修改,这意味着程序将被破坏。 现有结构。 关于调试:Keil软件调试单片机程序时,编译通过并不意味着程序正确。 编译仅表明程序没有语法错误。 在进行软件仿真或下载到开发板进行调试时,经常会出现各种错误。 很多超出预期结果的现象往往是由微小的错误造成的。

比如没有现场保护和现场恢复,所以养成良好的编程习惯也很重要。 有些为了实现某些功能而添加的语句实际上根本没有任何效果。 举个编程中的小问题:按下按钮时,我们都需要软件防抖。 正常的做法是打电话延迟。 实际调试时,跳过这个抖动大约需要100MS。 如果采用普通延时,也就是说按下按钮时CPU100MS内部不能进行其他操作。 平均1秒内有100MS不调用显示子程序,会导致亮度下降。 此时考虑到显示子程序一次持续十几毫秒,所以专门写了一个程序作为按键防抖的延时。 事实上,效果非常好。 这个思路是我多次修改程序但未能达到想要的效果(按下按钮时显示亮度不降低)后最终想出的方法。 最后,完成电路板和焊接电路后,在打开电源之前,用万用表仔细检查电路中是否有错误的连接,以免烧坏芯片和数码管。 设计课程的其他心得:要有积极的态度,不要认为这很容易,慢慢来。 很多事情并不像你想象的那么顺利。 有时,一个小问题可能会花费你半天甚至一天的时间。 虽然程序上没有遇到什么大问题,但由于态度不够积极,对于之前没画过的PCB图入手犹豫不决,周四晚上才解决。 本以为周五一天就可以完成板子调试整机,但是各种突发情况让我猝不及防。

板子后发现程序功能扩展来不及完成。 这是我在这次实验中得到的教训,也让我明白了不能对自己太自信。 态度决定一切。 图1:系统电路原理图 图2:系统电路PCB在protues中调试的结果,在开发板上的效果(见实物),在焊接好的PCB板上的效果(见实物), protu中和开发板上的模拟在网上实现时看到的现象和实际做的时候看到的现象是不一样的。 在protues中,不用接三极管(NPN)就可以达到效果,但是自己做板子的时候就不行了,因为51单片机的输出电流无法驱动数码管发光,而加了一个9014三极管需要驱动器。 另外protues中的reset按钮不起作用(软件就是这样设计的)。 在开发板上使用PCB上实现的程序时出现了另一个问题。 延迟(3)的延迟子程序不合理,导致闪烁问题,所以将延迟(3)改为延迟(1),这样问题就解决了。 我在段选上加了一个三极管,并加了一个限流电流,这样数码管也能亮起来。 另一方面,如果相同的程序在不同的显示器上使用,则现象会有所不同。 因此,我需要不断修正定时器的加载值。 TH1=(65536-49997)/256;//重装初始值 TL1=(65536-49997)%256;TH0=(65536-8000)/256;TL0=(65536-8000)%256;实测后,这个值是最合适的,精确到每小时一秒。

表 1:元件清单 器件名称 数量 电池 1 个 Lm7805 1 个自锁开关 1 个 51 单片机 1 个 LED 2 个有极性电容 1 个无极性电容 2 个晶振 1 个 10K 电阻 9 个 1K 电阻 2 个按钮 7 个 100 电阻 8 个 PNP 晶体管 8 个 4 位数码管(共阴极)二时钟程序源代码# include #define uchar unsigned char#define uint unsigned intuchar码表[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 ,0x7f,0x6f,0x77 ,0x7c,0x39,0x5e,0x79,0x71};sbit led=P1^1;//指示灯 sbit qiehuan_key=P3^7;//秒表和时钟模式切换按钮 sbit sp_key=P3^4 ;//开始/暂停秒表中的按钮 sbit clf_key=P3^5; //清除秒表中的按钮 sbit func_key=P3^1; //时钟换位按钮(时、分、秒) sbit add_key=P3^2; //时钟加1个key sbit sub_key=P3^3; //时钟减1键 uchar k1_bit=0; //切换按键标志 uchar shi1,shi2,fen1,fen2,miao1,miao2,fen3,fen4,miao3,miao4 ,num9,num10;uint num1,num2,num3,num4,num5,num6,num7,num8,num11;void delay(uint xms) //延迟函数 {uint i,j;for(i=xms;i>0 ;i–) for(j=110;j>0;j–);}void init()/ /中断初始化函数{EA=1;//使能总中断 TMOD=0X11;//定时器工作模式选择,定时器0和定时器1都选择第一种工作模式 TH0=(65536-10000)/256;//定时器0加载初始值,定时器10ms(对于秒表) TL0=(65536-10000)% 256;ET0=1;//打开定时器0小开关 TR0=0;//打开定时器0小开关 TH1=(65536 -50000)/256;//定时器1加载初始值,定时50ms(用于时钟)TL1=(65536-50000)%256;ET1=1;//打开定时器1开关 TR1=1;//关闭定时器1小开关}void mode_key()//模式选择键,本程序中两种模式,分别是时间显示和秒表。

K1_bit为0时显示时钟,为1时进入秒表{if(qiehuan_key==0){delay(5);if(qiehuan_key==0){k1_bit++;if(k1_bit==2 ){k1_bit=0;} while(!qiehuan_key);}}}void display1(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2) //显示时钟函数{shi1=num1/10;shi2 =num1;fen1=num2/ 10;fen2=num2;miao1=num3/10;miao2=num3;P2=0xff;P0=table[shi1];//第一位 P2=0xfe;delay(3);P2= 0xff;P0=table[shi2 ];//第二位 P2=0xfd;delay(3);P2=0xff;P0=0x40;//第三位 P2=0xfb;delay(3);P2=0xff;P0 =table[fen1];//第四位 P2=0xf7;delay(3);P2=0xff;P0=table[fen2];//第五位 P2=0xef;delay(3);P2=0xff;P0 =0x40;//第六位 Bit P2=0xdf;delay(3);P2=0xff;P0=table[miao1]; //第七位 P2=0xbf;delay(3);P2=0xff;P0=table[miao2]; //第八位 Bit P2=0x7f;delay(3);P2=0xff;}void display0(uchar fen3,uchar fen4,uchar miao3,uchar miao4,uchar num9,uchar num10) //显示秒表功能{fen3=num8 /10;fen4= num8;miao3=num7/10;miao4=num7;num9=num6;num10=num5;P2=0xff;P0=table[fen3];//第一个数字 P2=0xfe;delay(3); P2=0xff;P0 =table[fen4];//第二位 P2=0xfd;delay(3);P2=0xff;P0=0x40;//第三位 P2=0xfb;delay(3);P2=0xff ;P0=table[ miao3];//第四位 P2=0xf7;delay(3);P2=0xff;P0=table[miao4];//第五位 P2=0xef;delay(3);P2=0xff ;P0=0x40; //第六位 P2=0xdf;delay(3);P2=0xff;P0=table[num9]; //第七位 P2=0xbf;delay(3);P2=0xff;P0=table[num10]; //第八位 P2=0x7f;delay(3);P2=0xff;}void key_miaobiao(){if(k1_bit==1){if(sp_key==0){delay(5);if(sp_key== 0){TR0=~TR0;while(!sp_key)display0(fen3,fen4,miao3,miao4,num9,num10);}}if(TR0==0){led=0;if(clf_key==0){ delay(5);if(clf_key==0){led=1;while(!clf_key){num5=num6=num7=num8=0;}}}}}}void keyscan() //时钟按键扫描{if (func_key==0){延迟(5);if(func_key==0){led=0;num11++;while(!func_key);if(num11==1){TR1=0;}if(num11== 2){TR1=1;}if(num11==3){TR1=1;}if(num11==4){num11=0;TR1=1;}}}if(num11!=0){if( add_key==0){延迟(5);if(add_key==0){while(!add_key);if(num11==1){num3++;if(num3==60)num3=0;}if(num11 ==2){num2++;if(num2==60)num2=0;}if(num11==3){num1++;if(num1==24)num1=0;}}}if(sub_key==0) {延迟(5);if(sub_key==0){while(!sub_key);if(num11==1){num3–;if(num3==-1)num3=59;}if(num11== 2){num2–;if(num2==-1)num2=59;}if(num11==3

单片机

单片机原理和单片机的应用是什么?单片机应用的特性和应用

2024-2-9 2:02:15

单片机

USB接rI的5v电压和低电压、低功耗的控制开关

2024-2-9 3:01:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索