单片机应用实训报告_单片机应用实习报告
单片机应用实训报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单片机应用实习报告”。
青岛大学软件技术学院
单片机应用实训报告
姓 名 xx 专 业 xxxxxxx 班 级 xxxxxxxxxxxxxxxxxxxx 指导教师 xxxxxxxxxxxxxxx
2014 年 1月16日
目录
1实训目的…………………………………………………………2 2实训地点………………………………………………………………2 3实训时间………………………………………………………………2 4进度安排………………………………………………………………2 5实训内容…………………………………………………………3 6实训过程…………………………………………………………4 6.1按键程序,在单片机开发板上设置K1、K2、K3、K4以及RST键相应功能……………………………………………………………………4 6.2设计数码管电子钟由59分钟计时到00……………………8 6.3 1602液晶显示器的使用……………………………………12 6.4实训问题及解决方法……………………………………………14 7 实训体会…………………………………………………………14
实训内容
本次实训内容包括三部分,全部都是应用单片机来进行实现的,所以我们应该对单片机有所了解。主要是单片机的最小系统的连接和使用,Keil编程软件及STC烧写软件的使用。
其中第一部分是按键显示相应功能部分,注意每一个按键所对应的程序及显示方法; 第二部分是电子钟的设计,要注意其中的程序设计时应该让其能够自动计时,并在满60的时候进位,在计满到59分钟时,可以自动的跳转到00并重新开始计时。
第三部分设计屏幕字滚动效果,要求显示自己设计的文字并显示出来。实训单片机的电路连接图:
sbit P20=P2^0;uchar code DispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管显示0~F void Delay(uint m)//延时函数 { uchar i;for(;m>0;m--){for(i=0;i
main()//主函数 { uchar keyValue;uchar j;P3=0xff;P2=0xf0;P0=0xc0;for(;;){ keyValue=key();switch(keyValue){case 0xfb: { j++;if(j>15)j=0;P0=DispTab[j];break;} case 0xf7:P0=0xa4;break;case 0xef:P0=0xb0;break;case 0xdf:P0=0x99;break;} } } 6.1.2编译程序,生成文件并且烧写程序进入单片机,过程如下:将单片机按照下图链接:
:
6.2设计数码管电子钟由59分钟计时到00 6.2.1打开软件,建立工程项目,新建文件,写入代码并保存。图像同上
程序编程如下:
#include #include unsigned char data dis_digit;unsigned char key_s, key_v;unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off unsigned char data dis_buf[8];unsigned char data dis_index;unsigned char hour,min,sec;unsigned char sec100;unsigned char x;sbit K1 = P3^2;sbit K2 = P3^3;bit scan_key();void proc_key();void inc_sec();
key_s
void proc_key(){ EA = 0;if((key_v & 0x01)== 0)// K1 { inc_min2();// JJ=1;} else if((key_v & 0x02)== 0)// K2 { min++;// JJ=0;if(min > 59){ min = 0;} dis_buf[3] = dis_code[min / 10];// 分十位 *****3 dis_buf[2] = dis_code[min % 10]&0x7f;// 分个位 *****4 }
EA = 1;} void timer0()interrupt 1 // 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index---显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit---位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, // 选通P2.0口数码管
// dis_buf---显于缓冲区基地址 { TH0 = 0xFC;TL0 = 0x17;P2 = 0xff;// 先关闭所有数码管
P0 = dis_buf[dis_index];// 显示代码传送到P0口 P2 = dis_digit;// P2 = P2|0x80;dis_digit = _crol_(dis_digit,1);// 位选通值左移, 下次中断时选通下一位数码管
dis_index++;// dis_index &= 0x07;// 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
{ hour++;P1=x;x=x*2;if(hour > 23){ hour = 0;} void delayms(unsigned char ms)// 延时子程序 { unsigned char i;while(ms--){ for(i = 0;i
在数码管上显示时钟(分钟.秒)。
设置K1、K2按键,分别设置分钟增加和减少。显示如图所示:
en=0;} void lcd_init()//1602初始化函数 { lcd_wcom(0x38);//8位数据,双列,5*7字形 lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位 lcd_wcom(0x01);//清屏 } void main()//主函数 { uchar n,m=0;lcd_init();//液晶初始化
lcd_wcom(0x80);//显示地址设为80H(即00H,)上排第一位 for(m=0;m
6.3.2编译程序,生成文件并且烧写程序进入单片机,图像过程同上
6.3.3程序烧写完毕后运行单片机
实验现象:在液晶显示器上显示字符
如下图:
常的生活息息相关。了解了一些简单程序的录入,LED显示器、键盘、和显示器的应用和原理
经过短短一个星期的单片机应用实训,我深深体会到单片机的神奇和奥妙,也意识到自己在单片机编程上还有许多不足,这就需要我们去继续努力。
我在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用,实训锻炼了自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅,同时也暴露出一些平时学习上的问题,让我深刻反思。这些问题的发现将为我以后的学习和工作找明道路,查漏补缺为进一步学习作好准备。通过实训,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,并且可以在今后的日常生活中灵活运用。
最后,在老师精心的指导下我们都已基本完成实训要求。通过这次实训,我们揭开了单片机神秘的面纱,离我们不再遥远!对于我们所学的编程知识渗透较少,之前都是老师操作为主。此次实训就不同了,我们自己动手,收获甚大!
我在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用,实训锻炼了自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅,同时也暴露出一些平时学习上的问题,让我深刻反思。这些问题的发现将为我以后的学习和工作找明道路,查漏补缺为进一步学习作好准备。通过实训,让我懂得了如何编写一些简单的程序,学会了如何制作单片机应用程序,并且可以在今后的日常生活中灵活运用。
我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。但是从中学到的知识会让我受益终身。