单片机实习报告优选材料Word下载.docx
《单片机实习报告优选材料Word下载.docx》由会员分享,可在线阅读,更多相关《单片机实习报告优选材料Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
2.2其他器件介绍
该电路设计思路为先通过变压器来将220V电压将为22V低压,然后再通过桥式整流电路将交流整流为直流,最后通过LM317变压输出所需的5V电压。
2.3显示系统设计
12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×
64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×
4个(16×
16点阵)汉字或者显示16×
4个(8×
16点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
2.4键盘系统介绍
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×
4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
图1为矩阵键盘电路图,行线接P3.4-P3.7,列线接P3.0-P3.3。
三、程序设计
3.1主程序流程图
3.2各部分流程图
矩阵键盘
12864驱动程序
四、实习心得
通过这次实训,使我们能够学以致用,在实践中进一步掌握并巩固我们的单片机理论知识。
虽然在实训中遇到了不少难题与困惑,暴露出了不少问题和缺乏实践的弱点,但是在老师与同学们的帮助与指导下,我们最终解决与克服了一个个的困难与困惑,顺利的完成了老师交给的实训任务。
通过几天下来的实训,感觉就是自己的知识实在是太浅了。
在课本上学到的知识感觉自己都懂了,但在实际应用中还是无从下手。
所以我们不应满足于课本上的知识,只有通过不断的实践,才能够真正掌握理论知识。
虽然只有几天的时光,但还是学了很多的东西,比之于平常的上课更觉得学到更多。
所以,这对于我们还是一门很必要的课程。
当然,要真正学有所用,我们还要在实践中去不断提高,不断完善。
其实刚开始还是不太喜欢实训,也有点害怕的。
但过后才觉得只有几天的实训时间还是有点少,毕竟是刚开始对单片机进行实际应用,还是很陌生的。
由于时间的仓促,自己的作品也远还没达到完善的地步。
我相信其中的酸甜苦辣最终都会化为甜美的甘泉。
想借此机会感谢一直以来给我帮助的所有老师和同学。
尤其我的指导老师们,他们一直都以一位长辈的风范来给我不厌其烦的指导。
在此,特向他们道声谢谢。
五、参考资料
[1]何立民.单片机应用系统设计.北京:
北京航空航天大学出版社,2004.[2]张洪润等.单片机应用设计200例.北京:
北京航空航天大学出版社,2006.
[2]刘德营,张志霞,龚丽农等.单片机原理及接口技术.北京:
中国水利水电出版社,2006
[3]陈伟人.单片微型计算机原理及其应用.北京.清华大学出版社,19893.何立民.单片机应用系统设计.北京:
航空航天大学出版社,19954.王建校等.51系列单片机及C51程序设计.北京:
科学出版社,2002
[4].余锡存,曹国华.单片机微机原理及接口技术[M].西安:
西安电子科技出版社,2000:
[5]付家才.单片机控制工程实践技术.北京:
化学工业出版社,2001
[6]雷晓平等.单片计算机及其应用.成都:
电子科技大学出版社,2005.
六、附录(程序清单)
#include<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
/*************12864LCD引脚定义*************/
#defineLCD_dataP0//数据口
sbitLCD_RS=P3^0;
//寄存器选择输入
sbitLCD_RW=P3^2;
//液晶读/写控制
sbitLCD_EN=P3^1;
//液晶使能控制
#definedelayNOP();
{_nop_();
_nop_();
};
/*********************************************************/
ucharcodeDIS1[]={"
存款利率"
ucharcodeDIS2[]={"
一年:
2.79%"
ucharcodeDIS3[]={"
二年:
3.37%"
ucharcodeDIS4[]={"
五年:
5.56%"
ucharcodeDIS5[]={"
请一号到窗台"
ucharcodeDIS6[]={"
办理业务"
ucharcodeDIS7[]={"
请二号到窗台"
ucharcodeDIS8[]={"
请四号到窗台"
ucharcodeDIS10[]={"
"
ucharcodeDIS9[]={"
欢迎光临"
ucharindex=0;
ucharkey,s=0;
uintv;
voidmatrixkeyscan();
//矩阵
voiddelay(intms)
{
while(ms--)
{
uchari;
for(i=0;
i<
150;
i++)
_nop_();
_nop_();
}
}
voidmatrixkeyscan()
uchartemp;
P2=0xfe;
temp=P2;
temp=temp&
0xf0;
if(temp!
=0xf0)
delay(10);
temp=P2;
temp=temp&
if(temp!
{
switch(temp)
case0xee:
key=1,index=0;
break;
case0xde:
key=2,index=0;
case0xbe:
key=3,index=0;
case0x7e:
key=4,index=0;
while(temp!
{
temp=P2;
temp=temp&
}
P2=0xfd;
temp=P2;
temp=temp&
if(temp!
{
delay(10);
temp=P2;
switch(temp)
{
case0xed:
key=5,index=0;
break;
case0xdd:
key=2,
index=0,
s++;
case0xbd:
key=7;
index=0;
case0x7d:
key=8;
while(temp!
}
}
}
voiddelay1(intms)
while(ms--)
uchary;
for(y=0;
y<
100;
y++);
}
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&
0x80);
LCD_EN=0;
return(result);
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RW=0;
P0=cmd;
voidlcd_wdat(uchardat)
LCD_RS=1;
P0=dat;
voidlcd_init()
lcd_wcmd(0x34);
//扩充指令操作
delay(5);
lcd_wcmd(0x30);
//基本指令操作
lcd_wcmd(0x0C);
//显示开,关光标
lcd_wcmd(0x01);
//清除LCD的显示内容
voidlcd_pos(ucharX,ucharY)
ucharpos;
if(X==1)
{X=0x80;
elseif(X==2)
{X=0x90;
elseif(X==3)
{X=0x88;
elseif(X==4)
{X=0x98;
pos=X+Y;
lcd_wcmd(pos);
//显示地址
voidphotodisplay(uchar*bmp)
uchari,j;
//写数据时,关闭图形显示
32;
i++)
lcd_wcmd(0x80+i);
//先写入水平坐标值
lcd_wcmd(0x80);
//写入垂直坐标值
for(j=0;
j<
16;
j++)//再写入两个8位元的数据
lcd_wdat(*bmp++);
delay1
(1);
lcd_wcmd(0x88);
j++)
lcd_wcmd(0x36);
//写完数据,开图形显示
voidclr_screen()
//清屏
voidbytecode()
uchars;
clr_screen();
//设置显示位置为第一行
for(s=0;
s<
s++)
lcd_wdat(0x30+s);
lcd_wcmd(0x90);
//设置显示位置为第二行
lcd_wdat(0x40+s);
//设置显示位置为第三行
lcd_wdat(0x50+s);
lcd_wcmd(0x98);
//设置显示位置为第四行
lcd_wdat(0x60+s);
voidmain()
uchari,key1;
index=40;
v=1000;
s=0;
delay(10);
//上电,等待稳定
lcd_init();
//初始化LCD
while
(1)
matrixkeyscan();
if(s>
=2)
if(key==1)
lcd_pos(1,0);
//设置显示位置为第一行
lcd_wdat(DIS1[i]);
lcd_pos(2,0);
//设置显示位置为第二行
lcd_wdat(DIS2[i]);
lcd_pos(3,0);
//设置显示位置为第三行
lcd_wdat(DIS3[i]);
lcd_pos(4,0);
//设置显示位置为第四行
lcd_wdat(DIS4[i]);
lcdflag();
elseif(key==4)
v-=220;
if(v<
100)
v=220;
key=key1;
elseif(key==5)
v+=220;
elseif(key==2){
key1=key;
lcd_pos(1,0);
lcd_wdat(DIS10[index+i]);
if(s==0)
for(i=16;
i>
0;
i--)
lcd_wdat(DIS5[44-index-i]);
lcd_wdat(DIS6[44-index-i]);
else
lcd_wdat(DIS5[index+i]);
lcd_wdat(DIS6[index+i]);
index+=2;
if(index>
=28)
index=0;
delay(v);
elseif(key==3){
lcd_wdat(DIS7[index+i]);
delay(500);
else{
lcd_wdat(DIS10[index+i]);
lcd_wdat(DIS9[index+i]);