《嵌入式系统与接口技术课程设计ARM7的串口聊天程序设计.doc》由会员分享,可在线阅读,更多相关《嵌入式系统与接口技术课程设计ARM7的串口聊天程序设计.doc(29页珍藏版)》请在三一办公上搜索。
1、嵌入式系统与接口技术 课 程 报 告ARM7的串口聊天程序设计 学号姓名班级电气1081班指导老师目 录摘要IINTRODUCTIONII1 概述11.1 设计任务11.2 设计要求12 系统总方案及硬件设计22.1 系统总方案22.1.1 系统基本功能22.1.2 系统结构原理22.2 硬件各部分设计33 软件设计43.1 软件流程设计43.2 程序模块53.2.1 4X12键盘扫描程序53.2.2 160*128液晶显示驱动:73.2.3 按键功能判断113.2.4 通信功能133.2.5 控制主程序174 PROTEUS仿真214.1 启动状态仿真214.2 输入姓名214.3 输入按键
2、224.4 含有姓名的通信224.5 切换大小写以及组合按键23设计心得24参考文献25摘要嵌入式系统它摒弃了普通计算机复杂的系统结构,把需要用到的设备集成到一块硅片上,能够在成本上得到很好的控制,而在控制效果又能满足实际设计需要的微型计算机。本实验采用基于ARM7架构的LPC2138微处理器,它集成了多个32位定时器、1个或2个10位 多路ADC、10 位DAC、PWM通道和47 个GPIO以及多达9个边沿或电平触发的外部中断使它们特别适用于工业控制和医疗系统。在自动控制系统中,嵌入式芯片起着相当于人的大脑一样的作用。现代控制系统,通过编译出优秀的软件,可以更加接近人的想法来实现控制,他是模
3、糊控制,精确控制,等等控制方法的简单的实现场所。本课程设计通过设计一个具有按键控制、液晶显示功能的通讯聊天工具,核心采用LPC2138,采用4X12扫描按键,显示采用160*128液晶英文显示,通过其中一块芯片上输入的信息,可以传输到另一块芯片上并显示出来。当然,同时也可以输入不同的字模,液晶上也可以显示不同的图案。关键词:LPC2138;IQQ聊天工具;4X12扫描按键;液晶;字模INTRODUCTIONEmbedded microcontroller chip is an upgraded version, it integrates a number of 32-bit timers,
4、one or two 10-bit 8-channel ADC, 10 位 DAC, PWM channels and 47 GPIO and up to nine edge or level triggered External interrupt enable them particularly suitable for industrial control and medical systems. In the automatic control system, embedded chip, like the human brain plays an equivalent role. M
5、odern control system, by compiling the best software, can be more close to peoples ideas to achieve control, he is fuzzy control, precise control, and so simple to achieve control sites. The course design through the design of a key control, LCD display chat tool of communication, the core using LPC
6、2138, using 4X12 scan button, display with 160 * 128 LCD display in English, through which the information entered on a single chip can be transferred to another piece of chip and displayed. Of course, you can also enter a different font, the LCD can also display different patterns.KEYWORDS: LPC2138
7、,IQQ chat; 4X12 scankeybord; LCD; 1 概述1.1 设计任务通过学习ARM嵌入式系统,熟悉使用ARM芯片来设计控制系统。本实验使用LPC2138,4X12键盘扫描,160128液晶显示文字图案,控制UART0通信,实现各种控制功能,以及实现更为友好的人机交换界面。1.2 设计要求键盘上有48个数字按键,两个复合键:Caps_lock和Shift;两个功能按键:Enter和Backspace,分别控制确认输出和删除上一输入,尽最大可能模拟电脑键盘排布。160*128液晶用来显示初始画面及双方通讯内容,包括英文大小写,数字及“*”“(”“)”“!”“%”“¥”“#”
8、等常用符号。2 系统总方案及硬件设计2.1 系统总方案2.1.1 系统基本功能两台用于通信的ARM7系统,分别连接着160*128液晶及4*12键盘。其中一台机子通过按键输入一个字符串,按确认后同时在自己及另一台机子的液晶上显示,输入紧随其后清零。由于最大限度地模拟键盘,所以设置了Cap_lock和Shift按键可以大量简化键盘排布的方案。2.1.2 系统结构原理系统采用LPC2138单片机为核心,采用LG 160*128显示,4X12线反转法键盘,系统结构图如图2.1.2所示。LPC2138160*1284X12键盘串口通信LPC2138160*1284X12键盘图2.1.2 系统结构图2.
9、2 硬件各部分设计由于本实验比较简单,而且没必要花费比较多的钱做实物,所以采用Proteus来仿真,可以更快地达到验证该系统的功能,电路如图2.2.1所示。系统左图系统右图图2.1.2 系统电路图3 软件设计3.1 软件流程设计本设计采用ADS1.2编译软件,用C语言编程,可以很容易的移植前者写的硬件的驱动程序,以节约编程的时间,上层的控制程序可以很容易的用C语言来设计出控制的流程,程序流程图如图3.1.1:系统初始化液晶,串口,键盘键盘按键扫描液晶显示按下按键 按下ENTER? 液晶显示按下字符串 串口发送输入数据 接收标志有效? 图3.1.1 系统程序流程图显示输接收数据3.2 程序模块3
10、.2.1 4X12键盘扫描程序定义列表:/按键码对应键值表*#pragma CONST_SEG DEFAULT const uint16 key_code=0x1001,0x1002,0x1004,0x1008,0x1010,0x1020,0x1040,0x1080,0x1100,0x1200,0x1400,0x1800, 0x2001,0x2002,0x2004,0x2008,0x2010,0x2020,0x2040,0x2080,0x2100,0x2200,0x2400,0x2800, 0x4001,0x4002,0x4004,0x4008,0x4010,0x4020,0x4040,0x4
11、080,0x4100,0x4200,0x4400,0x4800, 0x8001,0x8002,0x8004,0x8008,0x8010,0x8020,0x8040,0x8080,0x8100,0x8200,0x8400,0x8800,;/键值对应ASCII码*#pragma CONST_SEG DEFAULT const uchar key_ascii=!,1,2,3,4,5,6,7,8,9,0,+, Q,W,E,R,T,Y,U,I,O,P, %,A,S,D,F,G,H,J,K,L,;,*, -,Z,X,C,V,B,N,M,.,?, ,;键盘扫描采用线反转法:uint16 Get_Key_AS
12、CII(void) uint16 key_code0; uchar i; uchar k; IO0DIR=Key_Row_Scan; /设置为行为输出列为输入 IO0PIN=IO0DIR&(Key_Pin)|Key_Row_Scan;/设置行为高电平列为低电平 DelayNS(10); /小延时,建立电平 key_code0=(IO0PIN&Key_Line_Scan)10; /取列对应位信息 read 语句 IO0DIR=Key_Line_Scan;/设置为列为输出,行为输入,列扫描 IO0PIN=IO0DIR&(Key_Pin)|Key_Line_Scan;/ read Line Dela
13、yNS(10); /小延时,建立电平 key_code0=key_code0|(IO0PIN&Key_Row_Scan)10); / row+line DelayNS(10); /小延时,建立电平if(key_code0!=0x0000)for (i=0;iKey_Amount;i+)if (key_code0=key_codei) / 得到排列 i return key_asciii; return0xff;/按键无效 3.2.1 键盘扫描图3.2.2 160*128液晶显示驱动:160*128液晶采用横向打点法,因此,对应的字符及图形字模要留意。字符格式为8X8. 定义列表:液晶驱动程序:
14、 #define WR (129) /p1.29 写控制位#define CD (131) /p1.17 数据指令选择控制位#define RD (130) /p0.26读控制位#define CE (128) /p0.27 LCD片选#define DIR (127) /p1.22 74LS245数据传送方向#define LOCK (126)/p0.15 74LS245数据锁存控制位#define DPT (0xff18;IO1CLR = IO1CLR | RD;/读无效return (data) ;/返回值为读取的数据/等待可读写函数void ReadEnable()uchar temp
15、;while(temp=ReadState()&0x03)!=0x03);/*void ControlPinIni()PINSEL0 = 0x00000003;PINSEL1 = 0x00000000;PINSEL2 = 0x00000000;IO1DIR = IO1DIR |WR|RD|CE|LOCK;IO1DIR = IO1DIR |CD|DIR;IO1SET = IO1SET |LOCK;/*/*写命令、写数据命令* 数据1、数据2、命令、参数个数*/void wr_data(char data1,char data2,char cmd,char num)char temp;temp=n
16、um;IO0SET = IO0SET | CE;/使能LCDif(temp=2)ReadEnable();IO1DIR = IO1DIR | DPT;/设置数据为输出IO1SET = IO1SET | CD;/数据属性IO1SET = (IO1SET & (DPT) | (data118) ;IO1CLR = (IO1CLR & (DPT) | (data1) & (0x0ff) 18) ;/ 数据写入口线IO1SET = IO1SET | WR;/写有效IO1CLR = IO1CLR | WR;/写入完毕,写置高 if(temp=2|temp=1) ReadEnable();IO1DIR =
17、 IO1DIR | DPT;/设置数据为输出IO1SET = IO1SET | CD;/数据属性IO1SET = (IO1SET & (DPT) | (data218) ;IO1CLR = (IO1CLR & (DPT) | (data2) & (0x0ff) 18) ;/ 数据写入口线IO1SET = IO1SET | WR;/写有效IO1CLR = IO1CLR | WR;/写入完毕,写置高ReadEnable();IO1DIR = IO1DIR | DPT;/设置数据为输出IO1CLR = IO1CLR | CD;/命令属性IO1SET = (IO1SET & (DPT) | (cmd1
18、8) ;IO1CLR = (IO1CLR & (DPT) | (cmd) & (0x0ff) 8,ADR_POS,0x02);/*void WriteCommand (uchar command)uint32 com=0;/定义临时存储单元com = command;ReadEnable();IO1DIR = IO1DIR | DPT;/设置输出数据IO1CLR = IO1CLR | CD;/命令属性IO1CLR = IO1CLR | WR;IO1CLR = IO1CLR | RD;IO1SET = (IO1SET & (DPT) | (com18) ;/ 数据写入口线IO1CLR = (IO
19、1CLR & (DPT) | (com) &(0x0ff) 18);IO1SET = IO1SET | WR;/写有效IO1CLR = IO1CLR | WR;/写入完毕,写置低void WriteData (uchar data)ReadEnable();IO1DIR = IO1DIR | DPT;/设置输出数据IO1SET = IO1SET | CD;/数据属性/数据传输方向设定IO1SET = (IO1SET & (DPT) | (data18) ;/ 数据写入口线IO1CLR = (IO1CLR & (DPT) | (data) &(0x0ff) 18) ;/IO0SET = IO0S
20、ET | CE;/选中LCDIO1SET = IO1SET | WR;/写有效IO1CLR = IO1CLR | WR;/写入完毕,写置低/*void DisHanZi(uchar x,uchar y,uchar *Hzcode)uchar i;Set_xy(x*16,y*2);for(i = 0;i16;i+)WriteCommand(AUT_WR);WriteData(Hzcode2*i);WriteData(Hzcode2*i+1);WriteCommand(AUT_WO);Set_xy(x*16+i+1,y*2);void LCD_Photo(uchar x,uchar y,uchar
21、 x_long,uchar y_long)uchar i,j;Set_xy(y,x);for (i=0;iy_long;i+)for (j=0;jx_long;j+)WriteCommand(AUT_WR);WriteData(IQQ_LOGOj+i*x_long);WriteCommand(AUT_WO);Set_xy(y+i+1,x);/*/LCD_Write_ABC: 显示8(宽)*16(高)点阵列数字字母符号等半角类/输入参数: x,y:/ ASCII_num:显示的字符的序号/ 可以显示12*5=60个英文字符void LCD_Write_ASCII(uchar x, uchar y
22、,uchar ASCII_num)/x:横 y:竖 ASCII_num:字符的序号 uchar i; Set_xy(x*8,y); for(i=0; i19) /超出一行的显示范围,x+1换行 y=0; x+; 3.2.2 液晶图3.2.3 按键功能判断利用线反转法以及液晶已经把按下的按键显示出来,但对于某些功能键如“ENTER”、“Caps_Lock”等要进行功能判断操作。采用如下程序:/*输入显示及载入数组*uchar Get_Inputs(char *string,uchar *input_line,uchar *input_row,uchar *str_p,uchar *shift,u
23、char *caps_lock) /string a k ichar keynum17;uchar get_ascii;get_ascii=Get_Key_ASCII(); /*if (get_ascii!=*) / CHECK WEATHER INPUT ENTER if (get_ascii!=0xff) if (get_ascii=+) /退格 if(input_row=0) /是否在开头 if (*input_line)!=13) (*str_p)-;*input_row=19;(*input_line)-; else (*input_row)-,(*str_p)-; LCD_Writ
24、e_ASCII(*input_line),*input_row, ); while(get_ascii!=0xff) get_ascii=Get_Key_ASCII();/WAIT UNTIL REMOVE KEY if(get_ascii!=+)&(get_ascii!=0xff)&(get_ascii!=%)&(get_ascii!=-) /非退格。确定。CAP 时执行 if(*input_row=20) *input_row=0;(*input_line)+;/判断输入是否换行 /*键盘切换* if(get_ascii=A&get_ascii=0&get_ascii=9)get_asci
25、i=get_ascii-(*shift)*13; /* LCD_Write_ASCII(*input_line),*input_row,get_ascii); string*str_p=get_ascii; (*str_p)+; /THE OUTPUT STRING*input_row=*input_row+1; /输入光标指向下一位while(get_ascii!=0xff) get_ascii=Get_Key_ASCII(); /WAIT UNTIL REMOVE KEY /*按下 cap lockif(get_ascii!=0xff)&(get_ascii=%) if (*caps_lo
26、ck) *caps_lock=0;else *caps_lock=1; while(get_ascii!=0xff)get_ascii=Get_Key_ASCII();/WAIT UNTIL REMOVE KEY /*if(get_ascii!=0xff)&(get_ascii=-) / shift if (*shift) *shift=0;else *shift=1; while(get_ascii!=0xff) get_ascii=Get_Key_ASCII();/WAIT UNTIL REMOVE KEY if(get_ascii=*) /输入为ENTER string*str_p=0;
27、 /* 结束符while(get_ascii!=0xff) get_ascii=Get_Key_ASCII();/WAIT UNTIL REMOVE KEY/*str_p=0;*input_row=0,(*input_line)=13; /重设 输入行列参数 Clear_LCD_INPUT();return 1; elsereturn 0;3.2.4 通信功能LPC2000系列ARM7微控制器包含2个符合16C550工业标准的异步串行通信口(UART):UART1、UART0。其中,UART0提供TXD0和RXD0信号引脚,UART1提供TXD1和RXD1信号引脚.#include confi
28、g.h#define uchar unsigned char/* 定义串口模式设置数据结构 */typedef struct UartModeuint8 datab;/ 字长度,5/6/7/8可选uint8 stopb;/ 停止位,1/2可选uint8 parity;/ 奇偶校验位,0-无校验,1-奇校验,2-偶校验UARTMODE;/* 函数名称 :IRQ_UART0()* 函数功能 :串口0接收中断服务程序* 入口参数 :无* 出口参数 :无*/void _irq IRQ_UART0 (void);/* 函数名称 :UART0_SendByte()* 函数功能 :向串口0发送1字节数据*
29、入口参数 :dat要发送的数据* 出口参数 :无*/void UART0_SendByte (char dat)U0THR = dat;/ 要发送的数据/* 函数名称 :UART0_SendBuf()* 函数功能 :向串口发送8字节数据* 入口参数 :dat要发送的数据* 出口参数 :无*/void UART0_SendBuf (char *rcv_buf)uint8 stop_flag=0;uint16 i,j=0;while(!stop_flag)for (i=0;i8;i+)if (rcv_bufj*8+i!=0)UART0_SendByte(rcv_bufj*8+i);else/for
30、 (;i8;i+)UART0_SendByte(0);stop_flag=1; j+;while (U0LSR & 0x20) = 0);/等待数据发送完毕DelayNS(100);void UART0_SendBack ()uint8 i;for (i=0; i 115200)return (0);if (set.datab 8)return (0);if (set.stopb = 0) | (set.stopb 2) return (0);if (set.parity 4)return (0);/* 设置串口波特率 */U0LCR = 0x80;/ DLAB = 1bak = (Fpclk 4) / baud;U0DLM = bak 8;U0DLL = bak & 0xFF;/* 设置串口模式 */bak = set.datab - 5;/ 设置字长if (set.stopb = 2)bak |= 0x04;/ 判断是否为2位停止位if (set.parity != 0)