单片机原理及应用课程设计

一.课程学习总结

  单片机课程设计是培养我们的总额学习的知识,发现、提出和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体和考察过程。
  回顾本学期单片机课程设计,,让我学到了许多知识,不仅可以巩固之前学的一些知识,而且也学到了很多书本上没有学到的知识。通过本学期的课程以及课程设计,是我懂得了单片机应用系统的设计过程,更加深刻的理解了与实际结合的重要性,锻炼了自己的动手能力。
  单片机能够用两种有眼编写,一种是C语言,另外一种是汇编语言。汇编语言是一种机器语言,并且代码繁琐,不易记忆。需要掌握到家的内部结构和逻辑结构,透过看了几本书让我了解认识到汇编语言太繁琐,但是还好我满五年上学期学过C语言,也参与了全国计算机二级考试,觉得自己在这一方面具有优势,可以很快的学好它。
  通过这次对LED和蜂鸣器的编写和模拟仿真的调试,让我对C51单片机有了更深的了解。这次的设计虽然我在程序编写上花了不少时间,但也收获了不少。对于要制作一个项目,首先不要着急写程序,应该搞清楚要干什么,完成什么功能;分几部分完成,每一部分完成什么功能,各部分之间的联系是什么。只要在设计前进行思考,才会保证在程序调试中不会出现那么多问题程序编译成功后,不要急于下载,一定要先进行仿真,根据仿真的效果才能到达要求。通过这次考试实验我也发现了自己的不足以及自己还存在的问题,因为在调试中还有很多自己弄不懂的。所以我觉得学习51单片机就是要多思考多练习多动手,只有这样我们才能把单片机学得更加精湛。
  通过本学期的课程来看,单片机学习的过程应该是一个循序渐进、不断学习、不断积累的过程,可以分为两个个阶段
  第一阶段:掌握开发单片机的必备基础知识。首先是熟练掌握单片机的基本原理,其实各家各门的单片机其基本结构和原理都差不多,特别是共有的知识霱要好好理解和掌握内核结构、内存分配、中断处理、定时计数、串行通信、端口复用等一些最基本的概念和原理。除此之外,我们还需要具备模拟电子、数字电子、C语言程序开发知识以及原理图和计等一些技能。在进行系统开发的时候,进行原理设计、pcb布板、程序编写、系统联调这些工作都是在所难免的在掌握好一款单片机原理和应用的基础上,开始学习其他各家单片机的独有技术,学不了那么多也要多了解了解,同时尽可能多地掌握单片机的一些外围器件和常用电路以备不时之需。比如,在项目开发过程中将一些常用的接口程序和控制算法整理成模块或者函数,在其他的项目开发中,有同样或者接近的需求时马上就可以使用,又快又好。
  第二阶段:在实际的项目开发过程中,不断深化单片机应用技术,不断积累应用行业的专业知识。例如,我完成了“基础实验例程”,紧接着就会实验“中级实验例程”,最后就是“高级实验例程”。有了扎实的单片机应用相关的基础知识,并且熟悉掌握了几款不同类型单片机的开发方法,再结合实际的应用背景,那么就可以随心所欲,设计出性能最优、理的单片机应用系统。这是我最大的奋斗目标我觉得这也应该是单片机应用的最高境界吧。
  通过这次单片机考查设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。 这个设计过程中,我们通过在原有的计数器系统进行了改进,使之增添了暂停、计数、清零等的三个控制功能,使之成为一个更加适用,功能更加完备的属于自己的一个系统。设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。

二.结课作品设计制作及调试分析

  实验考核要求:以设计制作一个《定时器的定时实验》进行相关知识能力考核。作品以试验箱作为实际操作演示工具,围绕定时器的设计实验,进行程序编程、调试及运行,编写工程代码,现场验收,先演示,再提问。
要求:
  1)结合课程实验硬件(参照硬件管脚定义),利用单片机片内定时器来进行定时,外部时钟振荡器选用12MHz晶振,定时时间1s。单片机的P21管脚接1个发光二极管,控制发光二极管闪烁,时间间隔1s。
当按下P31 I/O口线上的按键操作时,发光二极管按设定的时间,进行1s定时闪烁,同时蜂鸣器间隔鸣叫,蜂鸣器接P15管脚。
  2)定时器采用定时器0,定时方式1,定时器初值设定50ms。
目的:通过实际设计、调试,主要考查学生掌握单片机知识中的硬件的认知能力和硬件设计编程的实际动手能力。最后提交相应的作品结课报告,并对自己的作品进行答辩。

实验通过以下代码来实现:

#include   //此文件中定义了单片机的一些特殊功能寄存器

sbit k1=P3^1;     //定义P31口是k1
sbit seep=P1^5;   //定义P15口是蜂鸣器
int x=0,a=0; //对数据类型进行声明定义


char code shuzu [] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay(int x)   //延时函数
{
	int i,j;
	for(i=x;i>0;i--)
		for(j=110;j>0;j--);
}

void main()//主函数
{
	TMOD=0X01;//选择定时器,计数器工作方式 M1M0
	TH0=(65536-5000)/256;//TL0寄存器
	TL0=(65536-5000)%256; //TH0寄存器
	EA=1;	//全局中断允许位
	ET0=1; //打开定时器/计数器中断允许位
	TR0=1; //定时器运行控制位 等于1启动
	
		while(1)
		{		  
			switch(a)
			{
				case 1:	P2=shuzu[0];seep=!seep;delay(5);break;
				case 2:	P2=shuzu[1];break;
				case 3:	P2=shuzu[2];seep=!seep;delay(5);break;
				case 4:  P2=shuzu[3];break;
				case 5:  P2=shuzu[4];seep=!seep;delay(5);break;
				case 6:  P2=shuzu[5];break;
				case 7:  P2=shuzu[6];seep=!seep;delay(5);break;
				case 8:  P2=shuzu[7];a=0; break;		
			}
		}
	}


void T0_time() interrupt 1	//中断函数
{
	TH0=(65536-50000)/256; //50000=50毫秒,1机器周期1us,N=t/1us
	TL0=(65536-50000)%256;
	x++;
	if(x==20)
	{
		a++;
		x=0;
	}	
}

实验过程:

将以上程序编译,执行后将其下载在烧入软件内,并下载。
单片机原理及应用课程设计_第1张图片

实验结果如下图:

单片机原理及应用课程设计_第2张图片

  当按下p1口发光二极管按设定的时间,进行1s定时闪烁,同时蜂鸣器间隔鸣叫。

三.遇到的问题及解决

遇到问题:

Int x=0,y=0;
Y=x++;
按道理x=1,y=0
实际结果x=0,y=0
解决:
  当查阅资料后发现:用x++ ,这个是先赋值给y 才加一x++与++x的区别,y=x++;表示x先对y赋值然后再自+1,y=++x;表示x先自+1然后再对y赋值。
++符号,在变量名的右边,是先取值、再自加1,即先把x值给y、x再自加1
2.
串口通信波特率问题:
  学习使用普中科技51开发板,在串口通信实验教程中,应特别注意波特率适用问题
TMOD工作方式寄存器
TMODT1定时/计数器T0定时/计数器(89H)D7D6D5D4D3D2D1D0位
定义GATEC/TM1M0GATEC/TM1M0T1/定时器有4种工作模式 模式0:13位定时器计数模式
模式1: 16位定时计数模式
模式2:8位自动重装载模式
模式3:两个独立8位定时计数模式(只T0) 
定时器定时时间计算方法:
Td=(2^n-Count)×fosc/12 (公式1)
  其中Td为计时时间,n为位数,fosc为晶振频率,
除以12因为:单指令周期=一个机器周期= 6状态周期 = 12个时钟周期
计数:2^n-Count
其中,模式0不常用的;
模式1常用于定时;
模式2常用,例如串口波特率发生器
模式3不常用;                                       
串行口控制寄存器
位地址9FH9EH9DH9CH9BH9AH99H98H位定义SM0SM1SM2RENTB8RB8TIRI功能方式选择多机控制串行接收允许/禁止发送的第9位接收的第9位发送中断有/无接收中断有/无
串行口分四种工作方式,由SM0、SM1二位决定,其定义如下:
SM0 SM1工作方式功能描述 波特率
0   0   方式0   8位移位寄存器 Fosc/12
0   1   方式1   10位UART(包括一个起始位和停止位) 可变
1   0   方式2   11位UART (包括一个起始位和停止位) Fosc/64或fosc/32
1   1   方式3   11位UART (包括一个起始位和停止位) 可变

由公式1得
各种方式的波特率:
方式0的波特率BR = fosc/12
方式2的波特率BR =(2^SMOD/64)· fosc
方式1的波特率 BR=(2^SMOD/64)·(Td溢出率) . (公式2)
方式3的波特率 BR=(2^SMOD/64)·(Td溢出率) (公式3)
经公式1与公式2化简得:
Count=2^n - (12×64×BR)/(2^SMOD×fosc)
注意 2^n 是否足够减

四.课程学习心得体会

  时光飞逝,一转眼,一个学期有接近了尾声,本学期的单片机考察也在一周内完成了。其实我觉得单片机入门并没有想象中的那么难,之前学过模电后,在加上单片机的课本就可以很快的上手了,再开始的时候,我看着别人写好的代码在那运行程序,后来看懂之后,自己再写一遍,其实也没有那么难,尤其是,流水灯、中断应用、按键检测等。
   通过本学期的课程让我懂了了一些道理,我们必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。
  还有跟重要的一点:找到解决问题思路比找到代码更重要。我们用单片机来控制周边器件,达到我们想到的目的,这是一个题目,而如何写出一个程序来控制器件按你想要的结果去运作,这个就是解题的思路。要写程序就得先找到解决问题的思路,你学会找出这个解题思路,比你找到代码更为重要。不少人很喜欢找人家的代码,有的人甚至有了代码就直接复制到自己的程序中,可以说,这不是一种学习的态度,无助于你编程水平的提高。我几乎不怎么看人家的代码,多数时候是看别人的思路,有方框图最好,没有的话文字说明也可以。要从代码中看出别人的程序,特别是老师写出的具有一定水平的程序,可以使自己编程水平得到迅速的提高。同时,也可以结合别人的编程手法,与自己的想法融合在一起,写出更高水平的程序,从中得到进步。但要注意,切忌将学习变成抄袭,更不是抄袭完了就认为自己学会了,这样做只会使你退步。尝试编写一下综合应用的程序。从流水灯学起,到动态扫描,再中断。如何协调好各功能模块正常工作,才是编程者需要学习的地方,当你单独写一个功能的时候,比如按键读取,你可能感觉很容易,因为你的程序什么也不做,只是读按键。但把它和其它功能混合在一起,如何在整个程序运行中使每一部分都正常工作,这就不是写一个按键读取这么容易的事情,功能模块之间有可能会互相影响,比如你需要让数码管既能显示,又要去处理按键读取,怎么使这两部分都正常工作这就是一个协调过程。当你有了这个处理协调能力,你就算是入门了。着重于培养解决问题的能力,而不是具体看自己编写了多少程序或者做过什么。“学单片机重点在于学习解决问题的思路,而不是局限于
别人处理问题的思路,是相当困难的,特别是大型的程序,看起来是非常的累人。所以现在我也明白了,以前读书时说的程序流程图很重要,现在算是知道了。当你 知道一个问题怎么去解决了,你安排代码去完成,这就已经不是什么问题了。
   开动脑筋,运用多种方法,不断优化自己的程序。想想用各种不同方法来实现同一功能。这是一个练习和提高的过程,一个问题,你解决了,那么你再想想,能不能换种写法,也可以实现同一功能,或者说,你写出来的代码,能不能再精简一点,让程序执行效率更高,这个过程,就是一个进步的过程。很多知识和经验的获得,并不是直接写在书让你看就可以得到的,需要自己去实践,开动脑筋,经验才能得到积累,编程水平才能有所提高。看别人的程序,学习人家的思路。这个在学习初期是很有用,通或者做过什么。“学单片机重点在于学习解决问题的思路,而不是局限于具体的芯片类型和语言”这一直是我的座右铭,是我学单片机学习单片机之后感悟出来的。真正的能力不是你曾经编写过多少个可以实现的程序,而应该是:“遇到没有解决过的问题,能利用自己已学的知识,迅速找到解决问题的方法。”这个才是能力。面对一个新程序时,多自己开动脑筋,不要急于找别人的程序。有不少人面对一个新程序时,第一步想到的就是网上找别人写过的程序,然后抄一段,自己再写几句,湊凑在一起就完成任务,这虽然可能是省时间,但绝对不利你的学习。当你接到一个程序时,应该先自己构思一下整个程序的架构,想想如何来完成。有可能的话,画一个流程图,简单的可以画在脑子里,对程序中用到的数据、变量有一个初步的安排,然后自己动手去写,遇到实在没办法解决的地方,再去请教老师或同学,或看别人是怎么处理的,这样首先起码你自己动过脑想过,自己有自己的思路。如果你一开始就看别人的程序,你的思维就会受限在别人的思维里,自己想再创新就更难了,这样你自己永远也没办法提高,因为你是走在别人的影子里。

五.后续学习计划及建议

  虽然单片机的课程只是短短的一个学期,但是我们学习到的也仅仅是单片机中很基础的一些知识。学单片机就相当于自己开发硬件,扩展计算机硬件的功能,通过学习单片机也能对计算机硬件知识有更深入的领悟,对于高级编程水平有一定帮助。学了单片机,就会对现在比较流行的所谓“嵌入式”系统有比较明确的了解,比如i卡(比如电话卡)、射频卡(比如公交一卡通)、磁卡(比如银行卡),还有什么gps(全球定位,无非就是个能连到串口的小电路模块)、 gprs/gsn模块(相当于一部手机的核心部分)、 cmos/ccd摄像头、lcd显示屏、 can bus、usb接口电路等等看似神秘的技术感到不再陌生。
   从单片机再深入一点,达到了 vbprofan老版的档次,能接触到arm(一种32位高性能嵌入式cpu内核,也属于单片机)、dsp(数字信号处理器,常用的高档声卡、视频采集卡等设备里面都有这东西)、cpld/rpga(能够自己开发出专用集成电路的可编程门阵列)等技术,接触到vhdl语言嵌入式操作系统(比如 wInce、ucos、 uclinux等),再结合前面所说的gprs、gsm、cmos摄像头、lcd、usb等就可以对现在市场上所能见到的几乎任何一种“高科技”“消费类电子产品”不再感到神秘,到那个时候,你能设计出数码相机、u盘、mp3/mp4、手机、车载gps导航仪、pda、掌上游戏机、电子字典等各种电子产品。我们每天都生活在这些产品的海洋里,不断地接触到各种各样的自动化电子产品,却常常忽略了它们的存在,更少有人去仔细想过它们的实现方法、原理和制造过程。而在如今这个信息多元化的高技术时代,在这个计、机、电一体化程度越来越高的时代,即使我们学会了计算机,学会了程序设计,也不能说我们就完全掌握了“高科技”,
  完全实现了科技“扫盲因此,学计算机的同时多多少少学习一点单片机,常握一点电子技术,剩下就是经验与积累,用心程度是有利无害的。使用汇编语言来学习单片机,这对于硬件的了解非常重要、也很必要。在很多高校的单片机课程的学习中,都是要求先学习汇编语言才使用高级语言进行编程的。那么,汇编语言与我们以前所学习的c语言有什么区别呢?c语言是高级语言为什么叫高级语言呢?其实c语言就是汇编语言的一种进化也就是机器语言的一种进化。是一种表达方式而已。
举个例子:
c语言
if(ab)
  这样的一种表达式在汇编里面却变成了许多行代码。
汇编:cmpa,b
jeljnelja/jb/
  所以这直接导致了理解和可读性。直接看汇编代码需要在大脑内进行多重的转变而直接看c却是一目了然,这就是为什么汇编是低级语言而c却是高级语言的原因和区别。汇编太注重细节但是这样的细节完全是很苦力的活动比如jmp指令在汇编里面经常用到而在c里面这样的指令都是根据语句来直接编译的根本不需要你用大脑去想在哪跳转这不需要你关心,你只需要关心你的结构是不是正确的就ok如此的东西在汇编里却不同汇编不用关心你的结构和其他所有任何东西汇编什么都不关心所以什么都需要你去关心总之一句话汇编小巧玲珑,方便简洁为了学习好这门课程,我定制了如下计划:
目标:八个月内对单片机达到基本精通,1年内争取自己做一二个项目

你可能感兴趣的:(单片机,单片机,实例,教程)