单片机实习报告

更新时间:2023-03-08 05:35:23 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实习报告

题目:银行信息显示系统 学院:电气信息工程学院 专业:电子信息科学与技术 班级:13-1 学号:13 姓名:黄洵 指导教师:刘海波

日期:2015年3月7日~3月19日

一、设计总体方案

1.1设计要求

通过单片机控制显示器的显示银行信息,并且滚动显示。

1.2 设计思路

用单片机控制lcd12864液晶显示和银行的各种信息,并用4×4矩阵键盘控制液晶

显示滚动的方向和信息滚动的快慢。

1.3 设计方案

首先将该系统划分成硬件和软件两大模块:将硬件模块划分成单片机系统,显示系统,键盘系统和其他模块四个部分;再将软件模块划分成矩阵键盘和12864显示驱动两个部分。整个系统即有这几个小系统构成。

二、硬件电路设计

2.1 单片机系统

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有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主程序流程图

开始初始化键盘扫描左移右移加速减速lcd显示结束 3.2各部分流程图

矩阵键盘

12864驱动程序

四、实习心得

通过这次实训,使我们能够学以致用,在实践中进一步掌握并巩固我们的单片机理论知识。虽然在实训中遇到了不少难题与困惑,暴露出了不少问题和缺乏实践的弱点,但是在老师与同学们的帮助与指导下,我们最终解决与克服了一个个的困难与困惑,顺利的完成了老师交给的实训任务。

通过几天下来的实训,感觉就是自己的知识实在是太浅了。在课本上学到的知识感觉自己都懂了,但在实际应用中还是无从下手。所以我们不应满足于课本上的知识,只有通过不

断的实践,才能够真正掌握理论知识。虽然只有几天的时光,但还是学了很多的东西,比之于平常的上课更觉得学到更多。所以,这对于我们还是一门很必要的课程。当然,要真正学有所用,我们还要在实践中去不断提高,不断完善。其实刚开始还是不太喜欢实训,也有点害怕的。但过后才觉得只有几天的实训时间还是有点少,毕竟是刚开始对单片机进行实际应用,还是很陌生的。由于时间的仓促,自己的作品也远还没达到完善的地步。

我相信其中的酸甜苦辣最终都会化为甜美的甘泉。想借此机会感谢一直以来给我帮助的所有老师和同学。尤其我的指导老师们,他们一直都以一位长辈的风范来给我不厌其烦的指导。在此,特向他们道声谢谢。

五、参考资料

[1]何立民.单片机应用系统设计.北京:北京航空航天大学出版社,2004. [2] 张洪润等.单片机应用设计200例.北京:北京航空航天大学出版社,2006.

[2]刘德营,张志霞,龚丽农等.单片机原理及接口技术.北京:中国水利水电出版社,2006

[3]陈伟人.单片微型计算机原理及其应用.北京.清华大学出版社,1989 3.何立民.单片机应用系统设计.北京:航空航天大学出版社,1995 4.王建校等.51系列单片机及C51程序设计.北京:科学出版社,2002

[4].余锡存,曹国华.单片机微机原理及接口技术[M].西安:西安电子科技出版社,2000: [5]付家才.单片机控制工程实践技术.北京:化学工业出版社,2001 [6]雷晓平等.单片计算机及其应用.成都:电子科技大学出版社,2005.

六、附录(程序清单)

#include #include

#define uchar unsigned char #define uint unsigned int

/************* 12864LCD引脚定义 *************/ #define LCD_data P0 //数据口

sbit LCD_RS = P3^0; //寄存器选择输入 sbit LCD_RW = P3^2; //液晶读/写控制 sbit LCD_EN = P3^1; //液晶使能控制

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

/*********************************************************/ uchar code DIS1[] = {\ 存款利率 %uchar code DIS2[] = {\ 一年:2.79% %uchar code DIS3[] = {\ 二年:3.37% %uchar code DIS4[] = {\ 五年:5.56% \

uchar code DIS5[] = {\ 请一号到窗台 %uchar code DIS6[] = {\ 办理业务 %uchar code DIS7[] = {\ 请二号到窗台 %uchar code DIS8[] = {\ 请四号到窗台 %uchar code DIS10[] = {\ \

uchar code DIS9[] = {\ 欢迎光临 %uchar index = 0; uchar key,s=0;

uint v;

void matrixkeyscan() ; //矩阵 void delay(int ms) {

while(ms--) {

uchar i; for(i=0;i<150;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }

void matrixkeyscan() {

uchar temp; P2=0xfe; temp=P2;

temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P2; temp=temp&0xf0; if(temp!=0xf0) { temp=P2; switch(temp) {

case 0xee:key=1,index = 0;break; case 0xde:key=2,index = 0;break; case 0xbe:key=3,index = 0;break; case 0x7e:key=4,index = 0;break; }

while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } } }

P2=0xfd; temp=P2; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P2; temp=temp&0xf0; if(temp!=0xf0) { temp=P2; switch(temp) { case 0xed:key=5,index = 0; break; case 0xdd:key=2, index = 0, s++; break; case 0xbd:key=7;index = 0; break; case 0x7d:key=8;index = 0; break; } while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } } } } }

void delay1(int ms) {

while(ms--) {

uchar y; for(y=0;y<100;y++) ; } } bit lcd_busy()

{ bit result;

LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();

result = (bit)(P0&0x80); LCD_EN = 0; return(result); }

void lcd_wcmd(uchar cmd)

{ while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }

void lcd_wdat(uchar dat)

{ while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }

void lcd_init() {

lcd_wcmd(0x34); delay(5);

lcd_wcmd(0x30); delay(5);

lcd_wcmd(0x0C); //扩充指令操作 //基本指令操作 //显示开,关光标

delay(5);

lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); }

void lcd_pos(uchar X,uchar Y) { uchar pos; if (X==1) {X=0x80;} else if (X==2) {X=0x90;} else if (X==3) {X=0x88;} else if (X==4) {X=0x98;} pos = X+Y ;

lcd_wcmd(pos); //显示地址 }

void photodisplay(uchar *bmp) {

uchar i,j;

lcd_wcmd(0x34); //写数据时,关闭图形显示

for(i=0;i<32;i++) {

lcd_wcmd(0x80+i); //先写入水平坐标值 lcd_wcmd(0x80); //写入垂直坐标值

for(j=0;j<16;j++) //再写入两个8位元的数据 lcd_wdat(*bmp++); delay1(1); }

for(i=0;i<32;i++) {

lcd_wcmd(0x80+i); lcd_wcmd(0x88);

for(j=0;j<16;j++) lcd_wdat(*bmp++); delay1(1); }

lcd_wcmd(0x36); //写完数据,开图形显示 }

void clr_screen() {

lcd_wcmd(0x34); //扩充指令操作 delay(5);

lcd_wcmd(0x30); //基本指令操作 delay(5);

lcd_wcmd(0x01); //清屏 delay(5); }

void bytecode() {

uchar s;

clr_screen(); lcd_wcmd(0x80); for(s=0;s<16;s++) {

lcd_wdat(0x30+s); }

lcd_wcmd(0x90); for(s=0;s<16;s++) {

lcd_wdat(0x40+s); }

lcd_wcmd(0x88); for(s=0;s<16;s++) {

lcd_wdat(0x50+s); }

lcd_wcmd(0x98); for(s=0;s<16;s++) {

lcd_wdat(0x60+s); } }

void main() {

uchar i,key1; index=40; v=1000; s=0;

//清屏

//设置显示位置为第一行 //设置显示位置为第二行 //设置显示位置为第三行 //设置显示位置为第四行

delay(10); //上电,等待稳定 lcd_init(); //初始化LCD while(1) {

matrixkeyscan() ;

if(s>=2) s=0;

if(key==1) {

lcd_pos(1,0); for(i=0;i<16;i++) {

lcd_wdat(DIS1[i]);

}

lcd_pos(2,0); for(i=0;i<16;i++) {

lcd_wdat(DIS2[i]);

}

lcd_pos(3,0); for(i=0;i<16;i++) {

lcd_wdat(DIS3[i]);

}

lcd_pos(4,0); for(i=0;i<16;i++) {

lcd_wdat(DIS4[i]);

}

delay(10); lcdflag();

clr_screen(); }

else if(key==4) {

v-=220;

//设置显示位置为第一行//设置显示位置为第二行//设置显示位置为第三行//设置显示位置为第四行//清屏 if(v<100) v=220; key=key1; }

else if(key==5) {

v+=220; key=key1; }

else if(key==2){ key1=key;

lcd_pos(1,0); //设置显示位置为第一行

for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]);

}

if(s==0) {

lcd_pos(2,0); //设置显示位置为第二行 for(i=16;i>0;i--) {

lcd_wdat(DIS5[44-index-i]);

}

lcd_pos(3,0); //设置显示位置为第三行 for(i=16;i>0;i--) {

lcd_wdat(DIS6[44-index-i]);

} } else {

lcd_pos(2,0); //设置显示位置为第二行

for(i=0;i<16;i++) {

lcd_wdat(DIS5[index+i]);

}

lcd_pos(3,0); //设置显示位置为第三行 for(i=0;i<16;i++) {

lcd_wdat(DIS6[index+i]);

} }

lcd_pos(4,0); //设置显示位置为第四行 for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]);

} index+=2; if(index>=28) { index = 0; }

delay(v);

lcdflag();

clr_screen(); //清屏 }

else if(key==3){

lcd_pos(1,0); //设置显示位置为第一行 for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]);

}

lcd_pos(2,0); //设置显示位置为第二行 for(i=0;i<16;i++) {

lcd_wdat(DIS7[index+i]);

}

lcd_pos(3,0); //设置显示位置为第三行 for(i=0;i<16;i++) {

lcd_wdat(DIS6[index+i]);

}

lcd_pos(4,0); //设置显示位置为第四行 for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]);

} index+=2; if(index>=28) { index = 0; }

delay(500); lcdflag();

clr_screen(); //清屏 }

else {

lcd_pos(1,0); //设置显示位置为第一行 for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]); }

lcd_pos(2,0); //设置显示位置为第二行 for(i=0;i<16;i++) {

lcd_wdat(DIS9[index+i]);

}

lcd_pos(3,0); //设置显示位置为第三行 for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]);

}

lcd_pos(4,0); //设置显示位置为第四行

for(i=0;i<16;i++) {

lcd_wdat(DIS10[index+i]);

} index+=2; if(index>=28) { index = 0; }

delay(500); lcdflag();

clr_screen(); } } }

//清屏

本文来源:https://www.bwwdw.com/article/al5.html

Top