第一篇:基于AT89C51单片机的电子计算器的课程设计
C51单片机电子计算器课程设计
一.课程设计背景
当今时代,是一个新技术层出不穷的时代。在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。
它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。本设计是由单片机实现的模拟计算器,它不仅能实现数据的加减乘除运算,而且还能使数据及其计算结果在数码管上显示出来,能够实现0-256的数字四则运算。本设计是用单片机AT89C51来控制,采用共阳极数码显示,软件部分是由C语言来编写的。设计任务
二、元器件清单及简介
89c51型芯片 一片
排阻 两个
晶振12MHZ 一个
电容22uf 两个
面包板 三个
导线 若干
三、设计原理及分析
根据功能和指标要求,本系统选用MCS 51 单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计考虑如下: ①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。
②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。系统模块图:
2.1 输入模块:
键盘扫描计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图所示:一般有16 个键组成,在单片机中正好可以用一个P 口实现16 个按键功能,这种形式在单片机系统中也最常用。
以上键盘从上到下依次编号为1,2,3,4,D,C,B,A 1
由图 3 矩阵键盘内部电路图可以知道,当无按键闭合时,P10~P13 与P14~P17 之间开路。当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14~P17 为输入状态,从行线P10~P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14~P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。2.2 运算模块:(单片机控制)AT89C51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。[3][5]单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。2.3 显示模块:
LED 显示发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。LED 具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用。[2][4]通常的数码显示器是由7 段条形的LED 组成(如图4 所示),点亮适当的字段,就可显示出不同的数字。我们采用8 段数码管,其中位于显示器右下角的LED 作小数点用。LED 显示器有两种不同的形式:共阴极和共阳极。本次设计采用共阴极接法(如图5所示)。
3、软件设计
在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。功能流程图如下:
4、硬件原理 以下为简易计算器的总体电路图
加运算:
减运算:
乘运算:
除运算:
清零: 四.总结
通过此次单片机实训设计,我们学到了很多东西,在器件的了解和器件选择上有个明确的认识,并在程序的设计,及理论在实践反面的运用能力有巨大的提高。
这次单片机课程设计由我们六位同学经过一周努力设计得到。软件的编程要我们不断的调试,最终我们终于完成了单片机实训课程设计,很高兴它能按着设计思想与要求运动起来。
当然,这其中也有很多的问题。第一、不够细心,由于对课本理论的不熟悉导致的编程错误,对于器件的实际情况的不了解,理论与实践的差距导致我们在设计实际电路时出现了很多错误,使得实验不能一次通过。第二、是在学习态度上,这次课程设计是对我们的学习态度的一次体验。对于这次单片机综合课程实习,我们的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨,这次的课程设计我们所遇到的问题多半是由于我们不够严谨。第三、在做人上,我们认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没什么办不到的。还有就是团队的合作精神。
在这次难得的课程设计过程中我们锻炼了自己的思考能力和动手能力,加强了我们思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题、解决问题的能力。
五.参考文献
《单片机原理及应用》 张毅刚 高等教育出版社
《MCS—51单片机应用设计》 张毅刚 哈尔滨工业大学出版社 《MCS—51系列单片机实用接口技术》 李华 北京航空航天大学出版社 《单片机应用技术选集》 何立民 北京航空航天大学出版社 《单片机原理及其接口技术》 胡汉才 《数码管显示驱动和键盘扫描控制器CH451及其应用》
清华大学出版社 施隆照 /*********************************************** **实现说明:
1:变量flag_fuhao为键入+、-、*、/运算符标志
(即当前一个键值为+、-、*、/运算符时,flag_fuhao为1,其他键值则flag_fuhao置零,其用在显示时)
2:变量flag_shu数输入情况,flag_shu为0时,输入的符号无效(flag_shu为2时,变量fuhao更新为新键值)
*********************************************/ #include
sbit OFF = P1^0;//关机键定义
float shu1,shu2;//进行运算的两个变量数 uchar num;////键盘扫描返回值
char flag1,flag_shu,flag_fuhao,fuhao,newkey,update;
//flag1开机标志newkey新按键标志,fuhao运算符,update表示等于号 //之后紧接着输入的是数的话则清零shu1
char key_shu;//按键值 char ge=0xdf;//char code Wela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//六位数码管的位选
unsigned char code Duan[]={0x3f,0x06,0x5b, //
0 1 2 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 3 4 5 6 7 8 9 无显示
共阴极数码管
// 函数声明
uchar keyscan();//键盘扫描函数
void display(float);//数码管显示函数
void delay(uint i)//延时函数 {
while(i--);}
/***********************************************
主函数
************************************************/ void main(){
flag1=0;//标志关机
while(1){
if(keyscan()==15)//开机检测
{
flag1=1;//标志开机
shu1=shu2=fuhao=flag_shu=newkey=0;//初始化变量
while(flag1)//判断是否已开机
{
if(!flag_fuhao)
display(shu1);//如果输入的不是
else
display(shu2);
key_shu=keyscan();
if(newkey==1)//有新键值
{
if(key_shu==15)//按下ON/C键,清零
{
flag_fuhao=update=0;
shu1=shu2=fuhao=flag_shu=newkey=0;
}
else if(key_shu==14&&flag_shu==1&&fuhao)//按下“=”
{
switch(fuhao)
{
case 10:shu1=shu2+shu1;break;
case 11:shu1=shu2-shu1;break;
case 12:shu1=shu2*shu1;break;
case 13:shu1=shu2/shu1;break;
}
flag_fuhao=0;
fuhao=0;
update=1;
} 10
else if((key_shu>=0)&&(key_shu<=9))//按下数字键
{
if(update)
shu1=0;
if(shu1<100000)
{
shu1=key_shu+shu1*10;
flag_shu=1;
}
update=0;
flag_fuhao=0;
}
else if((key_shu>=10)&&(key_shu<=13))//按下运算符
{
flag_fuhao=1;//表示按下了运算符号键
update=0;
if(flag_shu==1)//表示之前有数字键按下
{
if(fuhao==0)//表示计算时只有一次按下运算符,如1*8=8,第二个数字后面是=,而不是其他运算符
{
shu2=shu1;
shu1=0;
fuhao=key_shu;//将按下的运算符号的键的值赋值给fuhao,记录前一个运算符,以便按=后实现相应的计算。
flag_shu=2;
}
else
//表示计算时按了多次运算符,如1*8*9=72,第二个数字后面并没有=,而是*
{
switch(fuhao)
{
case 10:shu2=shu2+shu1;break;
case 11:shu2=shu2-shu1;break;
case 12:shu2=shu2*shu1;break;
case 13:shu2=shu2/shu1;break;
}
shu1=0;
fuhao=key_shu;//将按下的运算符号的键的值赋值给fuhao,记录前一个运算符,以便按=后实现相应的计算。
}
}
else if(flag_shu==2)
fuhao=key_shu;//将按下的运算符号的键的值赋值给fuhao,记录前一个运算符,以便按=后实现相应的计算。
}
newkey=0;
}
}
} } }
/***********************************************
数码管显示函数
************************************************/ void display(float dis_shu){
long zhengshu=(long)dis_shu;char dis_flag,dis_aa,dis_zero=0;uchar dis_data[6]={0,0,0,0,0,0},xiaoshu[6]={0,0,0,0,0,0};
ge=0xdf;//11 01 111 if(zhengshu>99999)dis_flag=6;else if(zhengshu>9999)dis_flag=5;else if(zhengshu>999)dis_flag=4;else if(zhengshu>99)dis_flag=3;else if(zhengshu>9)dis_flag=2;else dis_flag=1;
dis_shu=dis_shu-zhengshu;
for(dis_aa=0;(dis_aa<6-dis_flag)&&(dis_shu=(dis_shu-(char)dis_shu)*10);dis_aa++){
xiaoshu[dis_aa]=(long)dis_shu;}
for(dis_aa=0;(dis_aa<6-dis_flag);dis_aa++){
if(dis_zero||xiaoshu[5-dis_flag-dis_aa])12
{
duan=Duan[xiaoshu[5-dis_flag-dis_aa]];
wei=ge;
ge>>=1;
delay(100);
wei=0xff;
dis_zero=1;
} }
// for(dis_aa=0;dis_aa dis_data[dis_aa]=zhengshu%10; zhengshu=zhengshu/10;} //数码管段选 for(dis_aa=0;dis_aa if(0xdf!=ge&&dis_aa==0) { duan=Duan[dis_data[dis_aa]]|0x80; wei=ge; ge>>=1; delay(100); wei=0xff; } else { duan=Duan[dis_data[dis_aa]]; wei=ge; ge>>=1; delay(100); wei=0xff; } } //数码管位选 } /*********************************************** 键盘扫描函数 ************************************************/ uchar keyscan()// 函数返回按键的值 { //将第一行线置低电平,其余行线全部为高电平,即扫描第一行 key=0xfe; if(key!=0xfe){ delay(500);//延时消抖操作 if(key!=0xfe) { switch(key) { case 0xee:num=7;break;//7 case 0xde:num=8;break;//8 case 0xbe:num=9;break;//9 case 0x7e:num=13;break;//除号 ”/” } newkey=1; delay(500); while(key!=0xfe) { if(flag1)//如果已开机 if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字 display(num); else display(shu1); } return num; } } //将第二行线置低电平,其余行线全部为高电平,即扫描第二行 key=0xfd;if(key!=0xfd){ delay(500);//延时消抖操作 if(key!=0xfd) { switch(key) { case 0xed:num=4;break;//4 case 0xdd:num=5;break;//5 case 0xbd:num=6;break;//6 case 0x7d:num=12;break;//* } newkey=1; delay(500); while(key!=0xfd) { if(flag1) if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字 display(num); else display(shu1); } return num; } } //将第三行线置低电平,其余行线全部为高电平,即扫描第三行 key=0xfb;if(key!=0xfb){ delay(500); if(key!=0xfb) { switch(key) { case 0xeb:num=1;break;//1 case 0xdb:num=2;break;//2 case 0xbb:num=3;break;//3 15 case 0x7b:num=11;break;//- } newkey=1; delay(500); while(key!=0xfb) { if(flag1) if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字 display(num); else display(shu1); } return num; } } //将第四行线置低电平,其余行线全部为高电平,即扫描第四行 key=0xf7;if(key!=0xf7){ delay(500); if(key!=0xf7) { switch(key) { case 0xe7:num=15;break;// ON/C:开关机按键 case 0xd7:num=0;break;// 0 case 0xb7:num=14;break;// = case 0x77:num=10;break;// + } newkey=1; delay(500); while(key!=0xf7) { if(flag1) if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字 display(num); else display(shu1); } 16 return num; } } //判断关机按键是否被按下 if(!OFF){ delay(500);//延时消抖操作 if(!OFF) { flag1=0;// } } return 100; } 若关机按键被按下,则将关机标志位flag1置1 17 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 机电信息工程学院 单片机系统课程设计报告 完成日期:2010年5月31日 系: 专 业: 班 级: 设计题目: 学生姓名: 指导教师: 多功能简易计算器 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 目 录 一、设计任务和性能指标......................................................................2 1.1设计任务..............................................................................................................................2 1.2性能指标..............................................................................................................................2 二.设计方案.............................................................................................2 三.系统硬件设计.....................................................................................3 3.1单片机最小系统......................................................................................3 3.2键盘接口电路.....................................................................................................................3 3.3数码管显示电路.................................................................................................................4 3.4错误报警电路.....................................................................................................................5 四、系统软件设计..................................................................................6 4.1键盘扫描子程序设计..........................................................................................................6 4.2移位子程序及结果计算子程序设计................................................................................10 4.3显示子程序设计...............................................................................................................12 4.4主程序设计.......................................................................................................................13 五、调试及性能分析............................................................................13 5.1调试步骤...........................................................................................................................13 5.2性能分析...........................................................................................................................14 六、心得体会........................................................................................14 参考文献................................................................................................14 附录1 系统硬件电路图.......................................................................15 附录2 程序清单.................................................................................16 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 一、设计任务和性能指标 1.1设计任务 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用LED显示计算数值及结果。 要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标 1.2.3.4.5.加法:四位加法,计算结果若超过四位则显示计算错误 减法:四位减法,计算结果若小于零则显示计算错误 乘法:个位数乘法 除法:整数除法 有清零功能,计算错误报警 二.设计方案 按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、错误报警模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。 键盘电路采用4*4矩阵键盘电路。 显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。 错误报警电路采用5V蜂鸣器。 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 三.系统硬件设计 3.1单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。 主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。 晶振选取11.0592MHz,晶振旁电容选取30pF。 采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。以下为单片机最小系统硬件电路图。 单片机最小系统硬件电路 3.2键盘接口电路 计算器所需按键有: 数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’ 共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。 以下为键盘接口电路的硬件电路图 键盘接口电路 3.3数码管显示电路 采用4位数码管对计算数据和结果的显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。 利用74273锁存器来实现数码管的动态显示,P0口输出显示值,P2.4为段选口,控制273锁存器的时钟引脚,从而得到对数码管输入数据的控制。 P2.0~P2.3用来作为位选端,控制哪几位数码管进行显示。 以下为数码显示电路的硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 数码显示电路硬件电路图 3.4错误报警电路 错误报警电路就是在计算结果出现错误时或输入数据出现错误时,发出声音警报,提示使用者错误出现。 这里就采用5V蜂鸣器作为报警设备,利用PNP三极管对蜂鸣器进行驱动,有P2.5对其进行控制,这样在出现错误的同时用P2.5输出低,就可以使蜂鸣器工作,完成报警任务。 以下为报警电路硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 报警电路硬件电路图 系统整体硬件电路图见附录一 四、系统软件设计 4.1键盘扫描子程序设计 要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。 对于键盘的扫描,既可以用行扫描也可以用列扫描,这里采用行扫描的方法来完成对键盘的扫描。 行扫描就是逐行扫描键盘,看是哪一行有键按下,再通过返回的键码来确定究竟是哪个按键按下。如对第一行扫描就令P1.0为低,P1口其余为高,这样若第一行有键按下,则P1口的值就会由0xfe变为其他值,再由这个值来确定是哪个键按下。 以下为键盘扫描子程序的程序清单。 uchar keyscan(){ int i; P1=0xfe; temp=P1; temp=temp&0xf0;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:{rdat++;num=1;left(rdat,num);} break; case 0xde:{rdat++;num=2;left(rdat,num);} break; case 0xbe:{rdat++;num=3;left(rdat,num);} break; case 0x7e:{rdat++;num=4;left(rdat,num);} break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xed:{rdat++;num=5;left(rdat,num);} break; case 0xdd:{rdat++;num=6;left(rdat,num);} break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } case 0xbd:{rdat++;num=7;left(rdat,num);} break; case 0x7d:{rdat++;num=8;left(rdat,num);} break;} while(temp!=0xf0){ temp=P1; temp=temp&0xf0;} } P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb:{rdat++;num=9;left(rdat,num);} break; case 0xdb:{rdat++;num=10;left(rdat,num);} break; case 0xbb:{equ();} break; case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0; result=0; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } } P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } return num;} } while(temp!=0xf0){ temp=P1; temp=temp&0xf0;} } for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break;4.2移位子程序及结果计算子程序设计 输入数据要存储在一四位数组内,而我们键入的值是数据的高位,后键入的值是低位,这样我们就需要在输入低位数值时将高位数值从数组的低位移向数组的高位,这就是编写移位子程序的目的。 对于结果计算子程序,包含加、减、乘、除四种运算。以加法运算为例,各种运算各有其标志位来代表计算类型,当加法标志位add=1是,就将输入的两个数据按照加法进行计算。 首先将数组内的数按照对应的位关系,将其转化为一个十进制数,这样我们就得到了加速和被加数这样俩个十进制数,从而我们就可以简单的将两个数进行相加,结果就是我们所求的数值。但这个数值不能直接显示到数码管上,我们还要对其进行处理,使其变为对应进位的四个数存入数组内,以便显示。既通过对结果数值分别除以1000、100、10和对10取余,得到我们想要的四个数,送显示子程序显示。其余减、乘、除的计算方法与加法的计算方法一样,这里不再累述。 以下为移位子程序和结果计算子程序的程序清单。 void left(uchar rx,uchar date){ switch(rx) { case 1:dat[0]=date;break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 void equ(){ int i,j,k; long int s; if(add==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; result=result+s;add=0;} if(subb==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; result=result-s;subb=0;} if(mul==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; result=result*s;mul=0; } if(div==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; result=result/s;div=0; } If(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;} if(result<=9999) { dat[0]=result%10; dat[1]=(result/10)%10; dat[2]=(result/100)%10; dat[3]=(result/1000)%10; } for(j=3;j>0;j--) { if(dat[j]>0) { case 2:dat[1]=dat[0],dat[0]=date;break; case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break; case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break; } } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 for(k=j-1;k>=0;k--) { if(dat[k]==0){dat[k]=10;} } } } if(dat[0]==0){dat[0]=10;} } 4.3显示子程序设计 从始至终无论是输入的计算数据,还是计算后的结果值。都存储在同一数组dat[ ]中,这样我们只要在显示时一直调用dat[ ]中的值,就能正确的显示数据。 以下为显示子程序的程序清单。 void display(){ uchar aa; keyscan(); P2=0x07; aa=dat[0]; P0=table[aa]; P2=0x27; delay(3); P2=0x0b; aa=dat[1]; P0=table[aa]; P2=0x2b; delay(3); P2=0x0d; aa=dat[2]; P0=table[aa]; P2=0x2d; delay(3); P2=0x0e; aa=dat[3]; P0=table[aa]; P2=0x2e; delay(3); } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 4.4主程序设计 主程序既把以上各子程序串连成一个整体,使整个程序循环运行。而在以上程序中也已经加入了个程序之间的连接点,首先进入程序后就立即进入显示子程序,而显示子程序内又调用键盘扫描子程序,若有键按下,则会跳转到移位子程序和结果计算子程序进行相应的处理。通过计算或移位后,数组内的值发生改变,显示的值也会同时发生改变。之后再进行键盘扫描,如此反复运行,就构成了程序的整体。 以下为主程序清单。 void main(){ num=0; while(1) { display(); } } 整体程序清单见附录二。 五、调试及性能分析 5.1调试步骤 在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。 将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。 各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。 在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的对比发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。 成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。大连民族学院2007级电子信息工程专业单片机系统课程设计报告 5.2性能分析 对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下: 加法运算:四位加法运算,和值不超过9999,若超过上限,则显示错误提示E,蜂鸣器报警提示。 减法运算:四位减法运算,若结果为负,对其取绝对值。 乘法运算:积不超过9999的乘法运算,若超出上限,显示错误提示E,蜂鸣器报警提示。 除法运算:整数除法,既计算结果为整数,若除数为零,则显示错误提示E,蜂鸣器报警提示。 通过对实际性能的分析,可以得到本次设计满足设计的要求。 六、心得体会 通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。从整个过程中学习到了很多方面的知识,了解到以往学习中自己知识在某方面的不足之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。 从本次课设中我也看到了自身的很多不足之处,对知识的掌握不够扎实,有一知半解的现象。有时做事不够稳定,过于毛躁,不能平心静气的去分析所遇到的问题和错误。这在以后的工作和生活中是不可取的,通过对自身问题的认识与改正相信再遇到同样问题时会更好的解决。以后的设计实验也会更好的完成。 参考文献 [1] 徐维祥、刘旭敏.单片微型机原理及应用.大连:大连理工大学出版社,1996 [2] 李光飞、楼然苗、胡佳文、谢象佐.单片机课程设计与实例指导.北京: 北京航空航天大学出版社,2004 [3] 余永权.89系列FLASH单片机原理及应用.北京:电子工业出版社,2002 [4] 李群芳,黄建.单片机微型计算机与接口技术.北京:电子工业出版社,2001 [5] 楼然苗、李光飞.51系列单片机设计实例.北京:北京航空航天大学出版社,2003 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 附录1 系统硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 附录2 程序清单 #include for(y=110;y>0;y--);} void display();void main(){ num=0; while(1) { display(); } } void display(){ uchar aa; keyscan(); P2=0x07; aa=dat[0];大连民族学院2007级电子信息工程专业单片机系统课程设计报告 P0=table[aa]; P2=0x27; delay(3); P2=0x0b; aa=dat[1]; P0=table[aa]; P2=0x2b; delay(3); P2=0x0d; aa=dat[2]; P0=table[aa]; P2=0x2d; delay(3); P2=0x0e; aa=dat[3]; P0=table[aa]; P2=0x2e; delay(3); } uchar keyscan(){ int i; P1=0xfe; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:{rdat++;num=1;left(rdat,num);} break; case 0xde:{rdat++;num=2;left(rdat,num);} break; case 0xbe:{rdat++;num=3;left(rdat,num);} break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } case 0x7e:{rdat++;num=4;left(rdat,num);} break;} while(temp!=0xf0){ temp=P1; temp=temp&0xf0;} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xed:{rdat++;num=5;left(rdat,num);} break; case 0xdd:{rdat++;num=6;left(rdat,num);} break; case 0xbd:{rdat++;num=7;left(rdat,num);} break; case 0x7d:{rdat++;num=8;left(rdat,num);} break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb;temp=P1;大连民族学院2007级电子信息工程专业单片机系统课程设计报告 temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb:{rdat++;num=9;left(rdat,num);} break; case 0xdb:{rdat++;num=10;left(rdat,num);} break; case 0xbb:{equ();} break; case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0; result=0; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp)大连民族学院2007级电子信息工程专业单片机系统课程设计报告 { case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1; for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; dat[0]=10;dat[1]=dat[2]=dat[3]=0; } break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 } return num;} void left(uchar rx,uchar date){ switch(rx) { case 1:dat[0]=date;break; case 2:dat[1]=dat[0],dat[0]=date;break; case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break; case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break; } } void equ(){ int i,j,k;long int s; if(add==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; result=result+s;add=0;} if(subb==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; if(s>result){result=s-result;} else result=result-s;subb=0;} if(mul==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; result=result*s;mul=0; } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告 if(div==1){for(i=0;i<5;i++){ if(dat[i]==10){dat[i]=0;} } s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3]; if(s==0)result=10000; else result=result/s;div=0; } if(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;} if(result<=9999){ dat[0]=result%10;dat[1]=(result/10)%10;dat[2]=(result/100)%10;dat[3]=(result/1000)%10;} for(j=3;j>0;j--) { if(dat[j]>0) { for(k=j-1;k>=0;k--) { if(dat[k]==0){dat[k]=10;} } } } if(dat[0]==0){dat[0]=10;} } 22 基于单片机的简易计算器设计 基于单片机的简易计算器设计 一、设计任务和性能指标 1.1设计任务 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用四位一体数码管显示计算数值及结果。要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),绘出程序流程图,并给出程序清单(要 求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标 1加法:能够计算四位以内的数的加法。2减法:能计算四位数以内的减法。3乘法:能够计算两位数以内的乘法。 4除法:能够计算四位数的乘法 5有清零功能,能随时对运算结果和数字输入进行清零。 二、系统设计方案 按照系统设计的功能的要求,初步确定设计系统由单片机主控模块、四位一体数码管显示模块、键扫描接口电路共三个主要模块组成。主控芯片使用51系列AT89C51单片机,采用高性能的静态80C51设计,它由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。 键盘电路采用4*4矩阵键盘电路。 显示模块采用四位一体共阳极数码管和SN74LS244锁存芯片构成等器件构成。 三、硬件系统设计 1.单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。 主控芯片选取STC89C51RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。 晶振选取11.0592MHz,晶振旁电容选取30pF。 采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。单片机最小系统硬件电路图如图(1)所示。 图(1)单片机最小系统 2.键盘接口电路 计算器所需按键有: 数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’ 共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行采用端口P0.0~P0.3,四列采用端口P3.0~P3.3,通过8个端口的的高低电平完成对矩阵键盘的控制。通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。 3.数码管显示电路 采用4位一体的数码管对计算数据和结果进行显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。 利用SN74LS244N锁存器来实现数码管的动态显示,P1口输出显示值,P2.0~P2.3为位选端口。通过锁存器对段选信号的锁存,最终得到对数码管输入数据的控制。 以下为数码显示电路的硬件电路图,左图为数码管驱动电路,右图为段选信号锁存电路。 四.软件设计部分 根据选题要求,系统编程如下所示: #include “reg51.h” sbit P3_0=P3^0;sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;unsigned char sz[11],xs1[4],xs2[4],sj;int i,cs,bb,t1,t2,fh,s1,s2;void chushihua(){ } void xianshi(unsigned char xs[4]){ int i,j;unsigned char zy;bb=1;xs1[0]=10;xs1[1]=10;xs1[2]=10;xs1[3]=10;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;t1=0;t2=0;s1=s2=0;fh=0;cs=1; // zy=0x08;for(i=0;i<4;i++){ P2=(0xff-zy); P1=sz[xs[i]]; } zy=(zy>>1);for(j=0;j<100;j++); for(i=0;i<100;i++);return;} unsigned char saomiao(){ int i,j;unsigned char pp;for(i=0;i<1000;i++);P0=0xfe;P3=0x0f;pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0) {P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 7;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 8;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 9;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 11;} //==========1 P0=0xfd;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 4;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 5;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 6;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 12;} //==========2 P0=0xfb;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 1;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 2;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 3;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 13;} //==========3 P0=0xf7;P3=0x0f; pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)return 10; {P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 16;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 0;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 15;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 14;} //===========4 } void chuli(unsigned char x){ int i;if(x==16){ } cs=0;return;if(x>=0 && x<10){ if(bb==1) { } if(s1= =4){cs=0;return;} else { for(i=3;i>0;i--)xs1[i]=xs1[i-1]; } xs1[0]=x;s1++;t1=t1*10+x;if(bb==2){ if(s2==4){cs=0;return;} else { } for(i=3;i>0;i--)xs2[i]=xs2[i-1];xs2[0]=x;s2++;t2=t2*10+x;} } if(x>10) { if(bb==1){fh=x;bb=2;return;} if(bb==2){ if(fh==11)t1=t1/t2; if(fh==12)t1=t1*t2;if(fh==13)t1=t1-t2;if(fh==14)t1=t1+t2;if(t1>=10000){cs=0;return;} else { if(t1>=0 && t1<10) {xs1[0]=t1;xs1[1]=10;xs1[2]=10;xs1[3]=10;} if(t1>=10 && t1<100){xs1[0]=t1%10;xs1[1]=t1/10;xs1[2]=10;xs1[3]=10;} if(t1>=100 && t1<1000) {xs1[0]=t1%10;xs1[1]=(t1-(t1/100)*100)/10;xs1[2]=t1/100;xs1[3]=10;} if(t1>=1000 && t1<10000) {xs1[0]=t1%10;xs1[1]=t1%100/10;xs1[2]=(t1-(t1/1000)*1000)/100;xs1[3]=t1/1000;} bb=2; } } } s2=0;t2=0;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;fh=x;} void main(){ sz[0]=0xfc;sz[1]=0x60;sz[2]=0xda;sz[3]=0xf2;sz[4]=0x66;sz[5]=0xb6;sz[6]=0xbe;sz[7]=0xe0;sz[8]=0xfe;sz[9]=0xf6;sz[10]=0x00;cs=0; for(;;) { if(cs==0)chushihua();if(cs==1)sj=saomiao();if(cs==1 && sj!=10)chuli(sj);if(cs==1 &&(bb==1 || bb==2 && s2==0))xianshi(xs1);if(cs==1 &&(bb==2 && s2!=0))xianshi(xs2); } } 软件设计好后,在KEIL上面进行仿真,把仿真得到的文件下载到Proteus里面进行仿真,得到Proteus仿真电路图如下所示: 图(2) 计算器Proteus仿真电路图 五.硬件电路焊接及调试 根据电路图纸,焊接好硬件电路,把程序下载到单片机芯片,接通好电源,进行调试。在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。 将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。 各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。 用所设计的单片机进行数字计算,显示结果与任务要求一致,焊接电路符合要求。六.课程设计心得 两周的时间,终于把单片机课程设计搞完了。整个体会还是比较多的。首先是题目的选择,各方面的原因,自己还是想选个简单点的题目,不过最后选来选去,还是选择了计算器。由于自己对单片机编程还不是很熟悉,结果在设计的时候遇到了一系列问题,程序总是调试部处理,不过还好,最后在同学的帮助下终于把程序调试出来了,虽然程序设计实现的功能与老师要求的不尽相同,不过勉强还算可以。从这里我知道了基本知识的重要性。其实进行程序设计的时候主要是对各功能模块的把握。计算器里面最难的一部分是矩阵键盘的扫描和编码,那个费了很大力气。 另外一点就是硬件焊接调试部分。焊接的时候到时轻松,一个下午就焊接好了,然后是调试部分。调试花费的时间还是比较长的。不过有了上个学期数字电路焊接调试的经验,这次单片机调试还算是比较顺利。我也是从电路板的正负电源检测起,一步一步来,最终得到了想要的结果。调试的时候主要遇到了两个问题。一个是键盘总是没有反应,为了这个自己调试了很久,前前后后把电路板检查了几次,最后才发现是键盘本身的问题,和同学们换了个好键盘才行。另一个问题是总是显示不出来1、4、7这三个数字。检测来检测去,发现来是在测试最小系统时在一个位选端接了高电平,对位选信号产生了影响。当把那个高电平去掉后,终于得到了正确的结果。 总的来说这次课程设计达到了完成了基本任务,达到了基本要求。通过亲身对程序设计和电路焊接调试的体会,自己对单片机有了进一步的了解,单片机编程能力也得到了提高。电路板的焊接与调试,使自己电路调试的方法和思想进一步加强了。这次单片机课程设计应该说是比较成功的。 参考文献: 【1】徐维祥、刘旭敏:,《单片微型机原理及应用》,大连理工大学出版社,1996年。【2】李光飞、楼然苗、胡佳文、谢象佐.,《单片机课程设计与实例指导.》,北京航空航天大学出版社,2004年。 【3】余永权,《89系列FLASH单片机原理及应用.》,电子工业出版社,2002。【4】杨恢先、黄辉先,《单片机原理及应用》,人民邮电出版社,2006年。【5】常敏、王涵、范江波,《单片机应用程序开发与实践》,电子工业出版社,2009年。 单片机及接口技术综合实验 ——————电子万年日历系统一、题目:电子实时时钟/万年日历系统 二、功能要求: 1. 基本要求: ⑴ 显示准确的北京时间(时、分、秒),可用24小时制式; ⑵ 随时可以调校时间。 2. 发挥要求: ⑴ 增加公历日期显示功能(年、月、日),年号只显示最后两位; ⑵ 随时可以调校年、月、日; ⑶ 允许通过转换功能键转换显示时间或日期。 三、方案考虑: 1、硬件方案: ⑴ 显示器采用6位LED数码管(共阳),可分别显示时间或日期;(通过KB键可切换)⑵ 显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码!⑶采用“一键多用方案”,以减少按键数目。本方案只采用了两个按键 ⑷ 整体上要考虑:结构简单、布局美观、操作方便、成本低廉。 2、设计电路图如下: 3、元件清单: ⑴ 89C51 1个 ⑵ IC座(40脚) 3个(其中1个用于接插89C51、2个用于接插LED段数码管)。⑶ 74LS244 1个(用于驱动6个共阳的LED段数码管)。⑷ IC座(20脚) 1个(用于接插74LS244)。(5)显示器:LED_8段数码管(共阳型)6个三极管: (6)PNP(8550) 6个(用于驱动6个共阳型LED段数码管)。 (7)微型开关: 3个(其中1个用于复位电路、其它用于键盘)。(8)晶体振荡器(12MHz):1个(用于振荡电路)。(9)电阻器: ⑴ 3KΩ 1个(用于系统复位电路)。 ⑵ 1KΩ 6个(用作PNP三极管基极电阻)。⑶ 100Ω 7个(驱动器用作74LS244输出限流电阻)。(10)电容器: ⑴ 10μF 1个(用于系统复位电路)。⑵ 30 pF 2个(用于系统振荡电路)。(11)其它: ⑴ 万能电路板(10×15): 1块 ⑵ 焊锡条: 2米 ⑶ 带插头、座的电源端子: 1条 ⑷ 各种颜色外皮的导线: 各1米(12)工具: 1.电烙铁: 1把 2.剪钳: 1把 3.镊子: 1把 4.万用表: 1个(13)设备: 编程器(MEP300或TOP851) 6个 4、软件方案: 只使用第一组工作寄存器,功能分布如下: ⑴ “时钟”基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到“秒”,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。一般来说,基准时间越短,越有利于提高时钟运行的精确度。本实验定时5mS。乘以一个整数200得到“1秒”.⑵ 用一个计数器(R4)对定时中断的次数进行计数,从而可以实现“秒”定时,同理可以实现“分”定时和“时”定时,甚至于“日”、“月”、“年”定时。 ⑶ 显示器采用动态驱动时要注意到:LED的 “启辉时间”和 “余辉时间”。驱动信号的维持时间必须大于启辉时间;而驱动信号的间歇时间必须小于余辉时间。“启辉时间”和 “余辉时间”与驱动电流的大小有关,驱动电流越大,启辉时间越短,而余辉时间越长。但是,驱动电流的大小受到驱动电路的驱动能力和LED极限功耗的限制。本实验采用了74ls244和晶体管8550驱动,并进行适当的延时3ms解决上述问题。 ⑷ LED的余辉时间使动态驱动显示得到保证,但也要注意到它在更新显示内容时,可能造成显示字符的混乱模糊。为此,在把“更新显示内容”写入显示器之前,必须把所有的LED熄灭,即要把一个“熄灭驱动信号”先写入显示器。 ⑸对于按键的处理,采用中断。产生中断后先判有无按键被按下,还要考虑到“去抖动影响”问题,可采用软件延迟法解决这个问题,延迟时间至少10mS。而单纯进行软件延时的话会令到显示管产生断续的情况,故调用显示程序作为延时时间。这样就合理地处理好这两者的矛盾了。 ⑹ 把键盘的按键分两种情况来处理,操作简单。 ① 调整时间时,先按下KA键,(KA键为选择调整位置的键,如选调整秒或分),而此时的KB键只是用来加一操作。在调整时间状态下,若在十秒内检测到没有任何按键按下,则返回正常显示时钟状态。 ② 而不调整时间,即不按下KA键,KB的键只用来切换显示日期和时钟。⑺ 对于自动识别“月大、月小”和“平年、闰年”的问题,主要考虑: ① 月大、月小: 1~7月:逢单月为31天;逢双月为30天,其中2月另行处理。8~12月:逢单月为30天;逢双月为31天。②平年、闰年: 仅仅处理2月份的天数:平年的2月份天数为28天,闰年的2月份天数为29天。 5、程序流程图如下:(1)电子时钟计算程序图 (2)调整流程图 程序编写如下: ;///////////////////////////////////////////////////////// ORG 0000H LJMP START ORG 0003H LJMP PROINT0 ;int0用来切换时钟调整位置 ORG 0013H ;用来调整时间,只加不减 LJMP PROINT1 ORG 001BH ;5ms的延迟,计数200次则为1秒 LJMP PROTIME ORG 0030H ;主程序 TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0 1 2 3 4 5 6 7 8 9 ORG 0050H START: MOV TCON,#05H ;中断初始化 MOV IE ,#8DH MOV TMOD,#10H MOV TH1,#0eCH ;定时器初始化 MOV TL1,#78H MOV 31H,#0AH ;10秒 MOV 32H,#1EH;30分 MOV 33H,#09H;9点 MOV 34H,#0AH MOV 35H,#06H MOV 36H,#05H MOV 37H,#14H ;10号;6月;2005年 ;R7 存放切换标志 0 NORMAL , 1 HOUR ,2 MINUTE ,3 SECOND ,4 YEAR,5 MONTH,6 DAY MOV R1,#00H ;确定在调时不按键的最长时间,10秒后返回normal状态 MOV R7,#00H ;切换标志 MOV 40H,#00H ;十六进制转换BCD的高位 MOV 41H,#00H ;十六进制转换BCD的低位 MOV R6,#00H ;调时的位闪烁的时间间隔 MOV R4,#00H ;用来计数5ms的中断次数,200次则一秒 mov r3,#00h SETB TR1 ;开始计时 AGAIN: ACALL PROSHOW ;显示 AJMP AGAIN PROSHOW: CJNE R3,#00H,SHOWDATE ;如果r3等于1就显示日期,等于0就显示时钟 CJNE R7,#04H,DATE1 ;显示程序 AJMP SHOWDATE ;showdate显示年月日 AJMP SHOWDATE DATE1: CJNE R7,#05H,DATE2 DATE2: CJNE R7,#06H,SHOWCLOCK AJMP SHOWDATE showCLOCK: MOV R0,33H ;showclock显示时分秒,先显示时 ACALL PROHTOD CJNE R7,#01H,CLK1 INC R6 CJNE R6,#03H,CLK2 ;若处于调时状态,则该位闪烁 MOV R6 ,#00H CLK1: clr P2.4 mov a,41H MOV P0, a ;显示时的低位 ACALL DELAY3MS CLK2: SETB P2.4 CLR P2.5 mov a,40H MOV P0,a ;显示时的高位 ACALL DELAY3MS SETB P2.5 MOV R0,32H ;显示分 ACALL PROHTOD CJNE R7,#02H,CLK3 INC R6 CJNE R6,#03H,CLK4 ;若处于调时状态,则该位闪烁 MOV R6,#00H CLK3: CLR P2.2 mov a,41H MOV P0, a ;显示分的低位 ACALL DELAY3MS CLK4: SETB P2.2 CLR P2.3 mov a,40h MOV P0,a ;显示分的高位 ACALL DELAY3MS SETB P2.3 MOV R0,31H ;显示秒 ACALL PROHTOD CJNE R7,#03H,CLK5 INC R6 CJNE R6,#03H,CLK6 MOV R6,#00H CLK5: CLR P2.0 mov a,41H MOV P0, a ACALL DELAY3MS CLK6: SETB P2.0 CLR P2.1 mov a,40h MOV P0,a ACALL DELAY3MS SETB P2.1 RET SHOWDATE: MOV R0,36H ACALL PROHTOD CJNE R7,#04H,DAY1 INC R6 CJNE R6,#03H,DAY2 MOV R6,#00H DAY1: CLR P2.4 MOV P0,41H ACALL DELAY3MS DAY2: SETB P2.4 CLR P2.5 MOV P0,40H ACALL DELAY3MS SETB P2.5 MOV R0,35H ACALL PROHTOD CJNE R7,#05H,MONTH1 ;若处于调时状态,则该位闪烁 ;显示秒的低位 ;显示秒的高位 ;显示年 ;若处于调时状态,则该位闪烁;显示年的低位 ;显示年的高位 ;显示月 INC R6 CJNE R6,#03H,MONTH2 ;若处于调时状态,则该位闪烁 MOV R6,#00H MONTH1: CLR P2.2 MOV P0,41H ;显示月的低位 ACALL DELAY3MS MONTH2: SETB P2.2 CLR P2.3 MOV P0,40H ;显示月的高位 ACALL DELAY3MS SETB P2.3 MOV R0,34H ACALL PROHTOD CJNE R7,#06H,YEAR1 INC R6 CJNE R6,#03H,YEAR2 MOV R6,#00H YEAR1: CLR P2.0 MOV P0,41H ACALL DELAY3MS YEAR2: SETB P2.0 CLR P2.1 MOV P0,40H ACALL DELAY3MS SETB P2.1 RET PROHTOD:PUSH ACC MOV A,R0 MOV B,#0AH DIV AB MOV DPTR,#0030H MOVC A,@A+DPTR MOV 40H,A MOV A,B MOVC A,@A+DPTR MOV 41H,A POP ACC RET ;显示日 ;若处于调时状态,则该位闪烁 ;十六进制数转换成bcd码,且可以直接输出p0口 DELAY3MS: ;DELAY3MS MOV 45H,#08H DELAY1: MOV 46H,#0FFH DELAY2: DJNZ 46H,DELAY2 DJNZ 45H,DELAY1 RET PROINT0: CLR EX0 ;切换键中断程序 MOV R3,#00H ACALL PROSHOW MOV C,P3.2 JC IEXIT0 MOV R1,#00H INC R7 CJNE R7,#07H,IEXIT0 MOV R7,#00H INT01: MOV C,P3.2 JC INT02 ACALL PROSHOW AJMP INT01 INT02: ACALL PROSHOW IEXIT0: SETB EX0 RETI PROINT1:CLR EX1 ACALL PROSHOW MOV C,P3.3 JC IEXIT1 LCALL ISYEAR ;判断平年闰年 LCALL ISMONTH ;判断月份,确定最大日数 MOV R1,#00H CJNE R7,#00H,NEXT1 ;若不是调时状态,按此键就是切换显示日期、时钟 INC R3 CJNE R3,#02H,IEXIT1 MOV R3,#00H AJMP IEXIT1 NEXT1: mov r3,#00h CJNE R7,#03H,NEXT2 ;修改秒位 INC 31H MOV A,31H CJNE A,#3CH,INT11 ;遇60变0 MOV 31H,#00H AJMP IEXIT1 NEXT2: CJNE R7,#02H,NEXT3 ;修改分位 INC 32H MOV A,31H CJNE A,#3CH,INT11 ;遇60变0 MOV 31H,#00H AJMP IEXIT1 NEXT3: CJNE R7,#01H,NEXT4 ;修改时位 INC 33H MOV A,33H CJNE A,#18H,INT11 ;遇24变0 MOV 33H,#00H AJMP IEXIT1 NEXT4: CJNE R7,#06H,NEXT5 ;修改日 INC 34H MOV A,34H CJNE A,49H,INT11 ;到月底就返回月初 MOV 34H,#01H AJMP IEXIT1 NEXT5: CJNE R7,#05H,NEXT6 ;修改月 INC 35H MOV A,35H CJNE A,#0DH,INT11 ;十二月过后就跳回1月 MOV 35H,#01H AJMP IEXIT1 NEXT6: CJNE R7,#04H,INT11 ;修改年 INC 36H MOV A,36H CJNE A,#64H,INT11 MOV 36H,#00H MOV C,P3.3 INT11: JC INT12 ACALL PROSHOW AJMP INT11 INT12: ACALL PROSHOW IEXIT1: setb EX1 RETI PROTIME: MOV TMOD,#10H MOV TH1,#3CH ;定时器初始化 MOV TL1,#60H setb tr1 INC R4 CJNE R4,#0c8H,EXIT MOV R4,#00H ;计满1秒则清零 CJNE R7,#00H,DIAOSHI AJMP NORMAL DIAOSHI:INC R1 ;调时不按键的最长时间为10秒,在此期间又键按下重新计时 CJNE R1,#0AH,EXIT MOV R7,#00H ;到10秒则返回正常显示状态 MOV R1,#00H AJMP EXIT NORMAL:ACALL ISYEAR ;判断平闰年,返回标志48h,0为平年,1为闰年 ACALL ISMONTH ;判断哪个月,返回该月的最大日数,存放在49h INC 31H MOV A,31H ;秒加一 CJNE A,#3CH,EXIT MOV 31H,#00H INC 32H ;分加一 MOV A,32H CJNE A,#3CH,EXIT MOV 32H,#00H INC 33H ;时加一 MOV A,33H CJNE A,#18H,EXIT MOV 33H,#00H INC 34H MOV A,34H CJNE A,49H,EXIT MOV 34H,#01H INC 35H MOV A,35H CJNE A,#0DH,EXIT MOV 35H,#01H INC 36H MOV A,36H CJNE A,#64H,EXIT MOV 36H,#00H;年加一;月加一;日加一 EXIT: RETI ISYEAR: MOV A,36H;判断平闰年 MOV B,#04H DIV AB MOV A,B CJNE A,#00H,EXITYEAR1 MOV 48H,#01H ;闰年 SJMP EXITYEAR MOV 48H,#00H ;平年 EXITYEAR1: EXITYEAR: RETI ISMONTH: MOV A,35H ;开始检查月份 CJNE A,#02H,NEXTMON1 ;判断二月 MOV R2,48H CJNE R2,#00H,RUNNIAN MOV 49H,#1DH ;平年为28天,赋29给49h AJMP EXITMONTH RUNNIAN:MOV 49H,#1EH ;闰年为29天,赋30天给49h AJMP EXITMONTH NEXTMON1: CJNE A,#04H,NEXTMON2 AJMP XIAOYUE NEXTMON2:CJNE A,#06H,NEXTMON3 AJMP XIAOYUE NEXTMON3:CJNE A,#09H,NEXTMON4 AJMP XIAOYUE NEXTMON4:CJNE A,#0BH,DAYUE XIAOYUE: MOV 49H,#1FH ;四,六,九,十一月是小月,30天,但应该赋31天给比较值49h,AJMP EXITMONTH DAYUE: MOV 49H,#20H ;其他月份为大月,31天,赋32天给49h EXITMONTH: RETI END 《电子课程设计心得体会范文》与《单片机课程设计心得体会》合集 电子课程设计心得体会范文(一) 通过这次为期近半月的课程设计,我们深感自己动手操作的重要性。我们在课堂上接触到的多半是苍白的理论,在实践层面上只有一定的指导作用。但是真正在实际运用过程中,我们如果缺乏必要的及时锻炼,那将会感觉到力不从心。理工科本来就是一门集思维和动手能力于一体的学科,要想真正掌握好,思考、假设和实验验证都是必不可少的。在通过很多的理论学习之后,我们通过课程设计和相关的实验把书本上的理论知识在实际运用中加以利用,巩固了理论知识的同时也增强了我们的动手能力。 另外,我们生活在一个讲究团队合作的社会里。通过团队的协作,也培养了我们团结互助,相互协调的团队合作能力。通过大家的努力,我们共同完成了小组的任务,大家集思广益,各抒己见,共同把一个个问题解决。虽然辛苦,但是我们也享受着这次课程设计中给我们带来的乐趣,那就是自己亲自动手解决好实际问题,虽然我们做的还不够,但是我们也算是迈出了艰难的一步。我们学习理论知识的最终目的还是要走向实际运用,通过这种模拟式的学习,我们加深认识到理论与实践的差异。通过这个课程设计,我们大家把整个学习阶段的各种学科知识窜联在一起,更好地认识到学习是一个系统工程。我们的每一个环节都是在为以后的实践环节做铺垫,我们的每一个环节都是要有所掌握才可以顺利完成任务。 通过这样的实践活动,我们还可以充分发挥自己的主观能动性,因人而异,合理分配任务,团结协作,一起朝着任务的方向不断地奋斗,大家都很辛苦,各自完成自己负责的那部分工作。我们都深感动手起来遇到的各种问题都要亲自去解决是一件很不容易的事情,同时我们也在实践过程中修复了以往学习的很多漏洞。我们也得到了不同程度的完善和提升。希望以后能多举行多参与这类型的实践活动。把理论知识结合到实践层面去,理论结合实际学习才会更有声有色。要把我们学到理论知识的真正利用到生产实际中还需要大量的实践和运用。 我们忘不了自己在这一过程中的努力与收获,我们也相信付出与收获成正比,我们付出的越多,相应地收获也就越多。我们有大块的时间在准备,在学习的过程中,我们要不断地改进和学习,多多交流才能更好更轻松地学习。 电子课程设计心得体会范文(二) 通过此次课程设计,使我更加扎实的掌握了有关高频电子线路方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。 过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了常用元件的识别和测试;熟悉了常用仪器、仪表;了解了电路的连线方法;以及如何提高电路的性能等等,掌握了焊接的方法和技术,通过查询资料,也了解了收音机的构造及原理。 我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。 实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。 此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。 电子课程设计心得体会范文(三) 本学期实时测量技术实验以电子设计大赛的形式,老师命题,学生可以选择老师的题目也可以自己命题,并且组队操作其他的事情(包括设计总体方案、硬件电路、软件设计、焊接、调试等工作)。趣味性强,同时也可以学到很多东西。 我们认为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。 之所以使用avr单片机作为我们的执行核心,不仅是因为老师说avr现在是社会上应用比较多的单片机,也因为想通过使用avr锻炼自己的c语言编程能力,养成良好的c语言编程风格。不管怎样,这些都是一种锻炼,一种知识的积累,能力的提高。完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。很少有人会一步登天吧。永不言弃才是最重要的。 与队友的合作更是一件快乐的事情,只有彼此都付出,彼此都努力维护才能将作品做的更加完美。而团队合作也是当今社会最提倡的。曾经听过,xx之所以最近不受欢迎就是因为欠缺团队合作的精神和技巧。 电压电流测量装置虽然结束了,也留下了很多遗憾,因为由于时间的紧缺和许多课业的繁忙,并没有做到最好,但是,最起码我们没有放弃,它是我们的骄傲!相信以后我们会以更加积极地态度对待我们的学习、对待我们的生活。我们的激情永远不会结束,相反,我们会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,我们会更加珍惜拥有的,更加努力的去完善它,增进它。只有不断的测试自己,挑战自己,才能拥有更多的成功和快乐!快乐至上,享受过程,而不是结果!认真对待每一个实验,珍惜每一分一秒,学到最多的知识和方法,锻炼自己的能力,这个是我们在实时测量技术试验上学到的最重要的东西,也是以后都将受益匪浅的! 单片机课程设计心得体会 单片机课程设计心得体会【一】 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说三极管PNP管脚不懂怎么放置,不懂分得二极管的正负极,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在信盈达刘老师的辛勤指导下,终于游逆而解。同时,在刘老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和信盈达各位指导老师再次表示忠心的感谢! 一、单片机课程设计总结 做了两周的课程设计,有很多的心得体会,有关于单片机方面的,更多的是关于人与人之间关系方面的。 我们组一共有三个人,但其他两个人是真的神龙见首不见尾,除了在最后答辩的时候他们一起坐在了我旁边,冠冕堂皇的指着我画了几遍的图说了几嘴,我想可能他们自己都不知道自己在说怎么,虽然有的东西他们也答出来了。我佩服他们的勇气,羡慕他们的运气(我见到的很多做了10 天的人最后的成绩都有不如他们的),但是鄙视他们的做法。 所幸的是,我得到了很多同学的帮助。我想没有他们我可能都要放弃了,因为我本人对单片机也并不是很熟悉,学的东西好像它是它,我是我似的,理论联系不了实际。以前的汇编语言没学好,一开始的程序这块儿就要令我抓狂了。后来请教我们班的一个男生,每次跟他一起到试验室调试程序(他们组也只有他一个人动手),看他边做边给我讲解。最后在开发机上做出来的时候,虽然不是我自己写的,但看他那么高兴,我也有一种分享到的成就感。后来我们组就用了他写的程序,他自己又抽空做了些拓展。 接下来就是做硬件方面的焊接工作了。没想到这项看起来不需要多少技术的工作却是非常的劳心劳力。很多次是早上起来带瓶水带些吃的到实训中心,一泡就是一天。我看到有很多人跟我一样,不同的是他们是三三两两,而我大部分时间都是一个人做。在这个时候也有很多人帮助我,或是热心的帮我带饭,或是在我打盹儿的时候帮我做点焊接。大家都鼓励我,即使最后出不来东西,但是一定要坚持把它做完。当我想放弃的时候,我也这么对自己说,即使你做出来的是次品甚至不合格品,但是你一定要拿出来一件成品。 在要验收前,终于做了一件成品出来,不幸的是它真的是一件不合格品。帮我的那个男生做的已经出来了,所以最后应该还是我的焊接方面的问题。有一点灰心,想再重做来不及了,单是检查线路却也查不出来什么问题。那么就准备答辩吧。我对着电路图再看课本,发现以前很多觉得很难记的东西现在记起来容易多了,因为整天都在同它们打交道。51的引脚及其功能,A/D转换器的,驱动器的,所有我用到的我都一再的看书了解,同时请教同学我看书过程当中的疑惑。在这个过程中又发现了以前焊接当中出的一些问题,能改的就改,不能改的,咳,要是时间再多一些,或者我能早点做好,要是不只是我一个人动手……算了吧,不要想那些如果,还是准备我自己的,做好我现在能做的吧。 还好,验收还算成功,得了3分,不是很高,但是我觉得对我来说已经很好,代表了我真实的水平,我觉得我对单片机的一些知识在这个动手的过程中真的是从无到有增长的。同时我也尽量不去想别人得了多少分,没有什么不平衡的,有些人付出的是努力,有些人付出的是风险代价,其实这也没有什么不一样,这一点我早就了解。 最后,我发现自己对单片机竟然也有了一点兴趣,想暑假回家以后自己去买一些东西来做,再补一补汇编语言。有什么问题请教下以前的那些老同学好了,他们好厉害,在高中劳动课就成功的做出过调频收音机,大一暑假的时候参加了学校的电子竞赛培训接着比赛,不过后来怎么样我就不知道了。汗。看来要多保持联络,这次回家就好好找他们叙叙旧。 二、单片机课程设计感想 通过一个学期的学习,我认为要学好C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。特别是作为高职生,更要注重实践这一环节,只有这样我们才能成为合格的计算机人材。 整个设计通过了软件和硬件上的调试。我想这对于自己以后的学习和工作都会有很大的帮助。在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。对于教材管理系统,其程序是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对系统的结构很熟悉。因此可以说系统的设计是软件和硬件的结合,二者是密不可分的。通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。 这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。其次,这次课程设计让我充分认识到团队合作的重要性,只有分工协作才能保证整个项目的有条不絮。另外在课程设计的过程中,当我们碰到不明白的问题时,指导老师总是耐心的讲解,给我们的设计以极大的帮助,使我们获益匪浅。因此非常感谢老师的教导。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名软件工程专业的学生,这次课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。 我认为这个收获应该说是相当大的。一开始我们从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是不完整的,这让我们伤透了脑筋。看着别的小组都弄得有模有样了,可是我们连一个课题都还没有定好。好不容易又找到了课题,可是结果还是很不尽人意。程序接线什么的都弄好了,调试也没有问题,可是就是无法达到预期想要的结果。参考书毕竟只是一个参考,设计这种东西最后还是要靠自己动脑筋。然后我们大家一起齐心协力,从平时做的实验﹑老师上课的举例﹑书本上的知识以及老师的辅导和其他同学的帮助下终于完成了。应该说这是通过我们小组成员的共同努力和动脑完成的,虽然内容并不是很复杂,但是我们觉得设计的过程相当重要,学到了很多,收获了很多。我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。 单片机课程设计心得体会【二】 两周的单片机课程设计最后顺利完成了,其中包含着快乐,也有辛酸。我们选的设计题目是“数字温度计”,大家都觉得这个题目是比较简单的。其实不然,做了之后,发现设计电路虽然简单,但我们认为它真正困难的地方是程序设计,但是在我们同心努力下最终完成了。 我们刚选该题目时,真的是一头雾水,硬件电路不知如何下手,更何谈解决程序那块,因为我们所学的都是单片机方面的理论知识,应用到实践中去还比较少。但是,我们三人也没偷下懒,迅速分工去查阅和收集资料。我们去了图书馆借一些参考书,上网找一些相关资料,并且请教指导老师。透过不断努力,最后把数字温度计的思路和模型定了下来并开始分一个人去焊接硬件电路,剩下的去整理和修改程序。 透过一番整理和修改后,在电脑上进行仿真,仿真成功后准备焊接电路板。在焊接电路板中,我们首先对硬件电路进行布局,然后确认无误后,在电路板上进行焊接,这个过程我们觉得是做得比较快的,以至于后面出现了虚焊的错误。 焊接电路板完工,细心检查后,进行通电测试。结果液晶LCD没有显示,透过检查,原先是LCD坏了,在换了块新的后,能显示显示值。但还有个问题是,当报警电路不会报警,在请教老师后,发现走动蜂鸣器的电压太低了,是因为串接了一个太大的电阻。然后,我们换了一个小电阻,但这时蜂鸣器却一向在叫,停不下来,但是,在我们三人的的细心检查下,原先是在放大电路的一端虚焊了,这说明我们焊接电路的技术还不够好。在重新焊接那端后,数字温度电路最后成功实现功能,当时我们的情绪都是无比兴奋和快乐的,因为我们两周的辛苦没有白费。 在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。但透过学习这一次实践,增强了我们的动手潜力,提高和巩固了单片机方面的知识,个性是软件方面。从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。 单片机课程设计心得体会【三】 做了两周的课程设计,有很多的心得体会,有关于单片机方面的,更多的是关于人与人之间关系方面的。 我们组一共有三个人,但其他两个人是真的神龙见首不见尾,除了在最后答辩的时候他们一齐坐在了我旁边,冠冕堂皇的指着我画了几遍的图说了几嘴,我想可能他们自己都不明白自己在说怎样,虽然有的东西他们也答出来了。我佩服他们的勇气,羡慕他们的运气(我见到的很多做了10天的人最后的成绩都有不如他们的),但是鄙视他们的做法。 所幸的是,我得到了很多同学的帮忙。我想没有他们我可能都要放下了,因为我本人对单片机也并不是很熟悉,学的东西好像它是它,我是我似的,理论联系不了实际。以前的汇编语言没学好,一开始的程序这块儿就要令我抓狂了。之后请教我们班的一个男生,每次跟他一齐到试验室调试程序(他们组也只有他一个人动手),看他边做边给我讲解。最后在开发机上做出来的时候,虽然不是我自己写的,但看他那么高兴,我也有一种分享到的成就感。之后我们组就用了他写的程序,他自己又抽空做了些拓展。 接下来就是做硬件方面的焊接工作了。没想到这项看起来不需要多少技术的工作却是十分的劳心劳力。很多次是早上起来带瓶水带些吃的到实训中心,一泡就是一天。我看到有很多人跟我一样,不同的是他们是三三两两,而我大部分时间都是一个人做。在这个时候也有很多人帮忙我,或是热心的帮我带饭,或是在我打盹儿的时候帮我做点焊接。大家都鼓励我,即使最后出不来东西,但是必须要坚持把它做完。当我想放下的时候,我也这么对自己说,即使你做出来的是次品甚至不合格品,但是你必须要拿出来一件成品。 在要验收前,最后做了一件成品出来,不幸的是它真的是一件不合格品。帮我的那个男生做的已经出来了,所以最后就应还是我的焊接方面的问题。有一点灰心,想再重做来不及了,单是检查线路却也查不出来什么问题。那么就准备答辩吧。我对着电路图再看课本,发现以前很多觉得很难记的东西此刻记起来容易多了,因为整天都在同它们打交道。51的引脚及其功能,a/d转换器的,驱动器的,所有我用到的我都一再的看书了解,同时请教同学我看书过程当中的疑惑。在这个过程中又发现了以前焊接当中出的一些问题,能改的就改,不能改的,咳,要是时间再多一些,或者我能早点做好,要是不只是我一个人动手……算了吧,不要想那些如果,还是准备我自己的,做好我此刻能做的吧。 还好,验收还算成功,得了3分,不是很高,但是我觉得对我来说已经很好,代表了我真实的水平,我觉得我对单片机的一些知识在这个动手的过程中真的是从无到有增长的。同时我也尽量不去想别人得了多少分,没有什么不平衡的,有些人付出的是努力,有些人付出的是风险代价,其实这也没有什么不一样,这一点我早就了解。 最后,我发现自己对单片机竟然也有了一点兴趣,想暑假回家以后自己去买一些东西来做,再补一补汇编语言。有什么问题请教下以前的那些老同学好了,他们好厉害,在高中劳动课就成功的做出过调频收音机,大一暑假的时候参加了学校的电子竞赛培训之后比赛,但是之后怎样样我就不明白了。汗。看来要多持续联络,这次回家就好好找他们叙叙旧。 单片机课程设计心得体会【四】 作为一名自动化专业的大三学生,我觉得做单片机课程设计是十分有好处的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践潜力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们带给了良好的实践平台。 这次单片机课程设计我们历时两个星期,在我们班里算是倒数几组完成的吧,但经过这两个星期的实践和体验下来,我们又怎样会去在乎那个先后问题呢,因为对我来说学到的不仅仅是那些知识,更多的是团队和合作。此刻想来,也许学校安排的课程设计有着它更深层的好处吧,它不仅仅仅让我们综合那些理论知识来运用到设计和创新,还让我们明白了一个团队凝聚在一齐时所能发挥出的巨大潜能! 单片机作为我们的主要专业课之一,虽然在大三开学初我对这门课并没有什么兴趣,觉得那些程序枯燥乏味,但在这次课程设计后我发现自己在一点一滴的努力中对单片机的兴趣也在逐渐增加。 两个星期前我们五个人还在为到底选那个课题而发生分歧,最后还是在龚老师的耐心分析和指导下完成了课题的选定,但是随之而来的问题却远比我们想想的要困难的多 过没想到这项看起来不需要多少技术的工作却是十分需要耐心和精力在两个星期后的这天我已明白课程设计对我来说的好处,它不仅仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手潜力和独立思考的潜力,更重要的是同学间的团结,虽然我们这次花去的时间比别人多,但我相信我们得到的也会更多! 在做本次课程设计的过程中,我感触最深的当属查阅超多的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片机课程设计,但我们不是艺术家,他们能够抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。 其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:CAD制图、汇编语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。后,要做好一个课程设计,就务必做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,明白该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改善是程序设计的必经之路; 要养成注释程序的好习惯,一个程序的完美与否不仅仅仅是实现功能,而就应让人一看就能明白你的思路,这样也为资料的保存和交流带给了方便;在设计课程过程中遇到问题是很正常德,但我们就应将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。 发现、提出、分析、解决问题和实践潜力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 我们透过查阅超多有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。 透过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生用心的影响。 透过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要好处,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名自动化专业的学生,单片机的课程设计是很有好处的。更重要的是如何把自己平时所学的东西应用到实际中。 虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法透过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮忙和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。 我认为这个收获就应说是相当大的。觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点能够联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合相处,以及自身的动脑和努力,都是以后工作中需要的。第二篇:单片机计算器课程设计报告
第三篇:单片机计算器课程设计报告
第四篇:单片机课程设计-电子万年历
第五篇:《电子课程设计心得体会》与《单片机课程设计心得体会》