单片机模数转换及液晶_第1页
单片机模数转换及液晶_第2页
单片机模数转换及液晶_第3页
单片机模数转换及液晶_第4页
单片机模数转换及液晶_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 单片机课程设计 ADC输入控制 姓 名涂序平 学 号 201220120236专 业 测控技术与仪器班 级 1221202 指导教师周伟 22目 录摘要11.系统设计方案2 1.1. 设计思路2 1.2 方案选择与比较22.系统硬件设计3 2.1 MCS-52单片机硬件结构以及主要引脚3 2.2复位电路3 2.3 晶振电路4 2.4模数转换电路5 2.5 TLC549的管脚功能5 2.6显示电路6 2.7 12864液晶引脚图及各引脚功能6 2.8 主控制器电路73.系统软件设计 3.1 系统整体流程7 3.2 模数转换程序设计8 3.3 12864驱动程序84.系统调试194.1 Prot

2、ues简介194.2 硬件调试194.3 软件调试194.4 调试结果204.5 结果分析20实验结论21实验心得22 摘要单片机是利用半导体集成技术将中央处理单元CPU和一定数量的数据存储器RAM、程序存储器ROM、定时/计数器单元T/C、并行输入输出接口I/O和串行通信接口UART等多个功能部件集成在一块芯片上,是一台具有完整计算功能的大规模集成电路。单片机具有体积小、功能全、价格便宜、功耗低、控制能力强和运算速度快等优点,被广泛应用在国民建设、工业控制、通信技术、农业机械化、国防军事及家用电器中。数字信号相对与模拟信号有诸多的优点,通常所见到的信号均为模拟信号,而计算机所能处理的是数字信

3、号,为了实现用计算机进行工程控制,需要对模拟信号和数字信号进行相互转换。能够将模拟信号转换位数字信号的器件为A/D器件,将数字信号转换为模拟信号的器件为D/A器件。 采集模拟信号转换为数字信号是现在社会仪器方面的趋向,可以说大自然中不存在数字信号,模以信号的输入控制是非常有必要掌握的技能。; 1. 系统设计方案1.1设计思路 为了实现设计任务将总体设计电路分为两个主要的模块:模数转换模块和显示模块。模数转换模块利用ADC进行A到D的转换,其中单片机控制ADC的启动、通道选择和接收数据;显示模块由单片机将转换得到的数字信号转换为液晶显示屏的相应字符,并将转换结果输出到液晶显示屏进行显示。1.2方

4、案选择与比较本次实验ADC可以选择的有ADC0809,ADC0804,TLC549等等。液晶显示屏可以选择的有12864无字库液晶显示屏。 ADC0809,是8位逐次逼近式A/D模数转换器。它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。 ADC0804是一款8位、单通道、低价格A/D转换器,主要特点是:模数转换时间大约100us;方便TTL或CMOS标准接口;可以满足差分电压输入;具有参考电压输入端;内含时钟发生器;单电源工

5、作时(05)V输入电压范围是05V;不需要调零等等。 就本次实验来说ADC方面我想选择的是TLC549,因为其引脚较少,硬件设计比较容易,并且驱动程序容易理解,显示方面我采用的是12864液晶。因为它既可以显示数字电压,又可以显示正弦波形。关于TLC549的介绍后面会涉及到。 2.系统硬件设计2.1 MCS-52单片机硬件结构3.1.1 单片机内部结构8052单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。其功能框图如下:单片机的引脚图 MCS-52单片机主要引脚1. RESET/V

6、pd(9脚)复位信号当8052通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。其复位电路如下所示:2.2复位电路 2.3晶振电路2. (30脚)地址所存信号当访问外部程序存储器时,ALE的输出用于锁存地址的低位字节,而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。 3. (29脚)片外程序存储器读选通当访

7、问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。4. EA/Vpp(31脚)内部和外部程序存储器选择信号程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。 2.4模数转换电路2.5 TLC549 引脚图及各引脚功能TLC549引脚图REF+:正基准电压输入 2.5VREF+Vcc+0.1。REF:负基准电压

8、输入端,-0.1VREF-2.5V。且要求:(REF+)(REF-)1V。VCC:系统电源3VVcc6V。GND:接地端。/CS:芯片选择输入端,要求输入高电平 VIN2V,输入低电平 VIN0.8V。DATA OUT:转换结果数据串行输出端,与 TTL 电平兼容,输出时高位在前,低位在后。ANALOGIN:模拟信号输入端,0ANALOGINVcc,当 ANALOGINREF+电压时,转换结果为全“1”(0FFH),ANALOGINREF-电压时,转换结果为全“0”(00H)。I/O CLOCK:外接输入/输出时钟输入端,同于同步芯片的输入 2.6显示电路2.7 12864液晶引脚图及各引脚功

9、能CS1:选择左边64x46点CS2:选择右边64x46点GND:地 VCC:电源+5v VO:显示驱动电源05vRS:1数据输入,0命令输入R/W:1数据读取,0数据写入 E:使能信号,负跳变有效DB0DB7:数据信号 RST:复位信号 -VOUT:LCD驱动负电源 2.8 主控制器电路总体设计的电路图如下,模数转换模块和显示模块之间通过cpu进行数据转换。模数转换模块作为发送方,显示模块作为接收方。开始3.系统软件设计3.1系统整体流程编译前准备定义 端口设计模数转换 驱动程序12864初始化 程序 编译检测 软件调试 3.2 模数转换程序sbit SCLK=P36;sbit CS=P35

10、;sbit SDO=P34;uchar TLC549()uchar Dat,i;Dat=0;CS=0;for(i=0;i<8;i+)SCLK=1;Dat<<=1;/获得转换数据Delay(20);if(SDO)Dat|=1;SCLK=0; CS=1; dianya =Dat; /转换数据送给DatDelay(10); 3.3 12864驱动程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int #define ulong uns

11、igned long#define PORT P0sbit CS1=P23;sbit CS2=P24;sbit RS=P22;sbit RW=P21;sbit E=P20;sbit RESET=P26;sbit SCLK=P36;sbit CS=P35;sbit SDO=P34; /定义LCM12864的命令字#define LCM12864_DB7_DB0 P0#define LCM12864_DISP_ON 0x3f / 打开LCM12864显示#define LCM12864_DISP_OFF 0x3e / 关闭LCM12864显示#define LCM12864_START_ROW 0

12、xc0 /1100 0000 / 显示起始行0,可以用LCM12864_START_ROW+x设置起始行。(x<64)#define LCM12864_PAGE_START_ADDR 0xb8 /1011 1000 / 页起始地址,可以用LCM12864_PAGE_START_ADDR+x设置当前页。(x<8)#define LCM12864_COL_START_ADDR 0x40 / 列起始地址,可以用LCM12864_COL_START_ADDR+x设置当前列。(x<64)/定义LCM12864的状态屏蔽码/在BUSY和REST状态时,除读状态指令外,其他指令均不对LCM

13、12864产生作用。/在对LCM12864操作之前要查询BUSY状态,以确定是否可以对LCM12864进行操作。#define LCM12864_STATUS_BUSY 0x80 / LCM12864忙状态屏蔽码#define LCM12864_STATUS_DISP_OFF 0x20 / LCM12864显示关闭状态屏蔽码#define LCM12864_STATUS_REST 0x10 / LCM12864复位状态屏蔽码unsigned char code nq = / ASCII 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,0x00, 0

14、x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, / -0- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80;unsigned char code ya =0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0

15、x2E,0x24,0x20,0x20,0x00; unsigned char code dian =0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00;/ ASCII字模的数据表 / 码表从0x200x7e / 字库:Asc8X16E.dat 纵向取模下高位 /unsigned char code nAsciiDot = / AS

16、CII 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, / -0- 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, 0x00, 0x10, 0x18, 0xFC, 0xFC, 0x00, 0x00, 0x00, / -1- 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x08, 0x08, 0x00, 0x08, 0x0C, 0x84, 0xC4, 0x64, 0x3C, 0x18, 0x00, / -2- 0x0E, 0x0F, 0x09, 0x08, 0x08, 0x0C, 0x

17、0C, 0x00, 0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, / -3- 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, 0xC0, 0xE0, 0xB0, 0x98, 0xFC, 0xFC, 0x80, 0x00, / -4- 0x00, 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00, 0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, / -5- 0x00, 0x19, 0x21, 0x20, 0x20, 0x

18、11, 0x0E, 0x00, 0xF0, 0xF8, 0x4C, 0x44, 0x44, 0xC0, 0x80, 0x00, / -6- 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07, 0x00, 0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, / -7- 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, 0x00, / -8- 0x07, 0x0F, 0x08, 0x08, 0x

19、08, 0x0F, 0x07, 0x00, 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, / -9- 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, / -:- 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, / -.- 0x00, 0x30, 0x30, 0x

20、00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, / -V- 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00;void Delay(unsigned int count);void Delay(unsigned int count) unsigned char i; while (-count != 0) for (i = 0; i < 50; i+) ; / "" 表示空语句,CPU空转。 / i 从0加到125,在12

21、M晶体下CPU大概耗时1毫秒/LCM12864测忙函数 LCM12864_TestBusy()void LCM12864_TestBusy(void) unsigned char STATE; RW = 1; /读数据RS = 0; /指令 do LCM12864_DB7_DB0 = 0XFF; /p0置1 E = 1;/读DDRAM数据 STATE = LCM12864_DB7_DB0 &LCM12864_STATUS_BUSY;/读取数据总线状态,判断忙否? E = 0; /写入数据或指令 while (STATE = 0X00); /STATE为0,即不忙,写入 /写指令到LCM

22、12864 LCM12864_WriteCMD() void LCM12864_WriteCMD(unsigned char LCM12864_command) /LCM12864_command 欲写入指令 LCM12864_TestBusy();RW = 0;/数据被写到IR或DR中RS = 0; /BD0DB7为指令 LCM12864_DB7_DB0 = LCM12864_command;/将要写入的数据送到数据线E = 1; /可读E = 0; /写入 LCM12864_TestBusy();/写数据到LCM12864 LCM12864_WriteData()void LCM12864

23、_WriteData(unsigned char LCM12864_data) /LCM12864_command 欲写入数据 RW = 0; RS = 1; LCM12864_DB7_DB0 = LCM12864_data; /将要写入的指令送到数据线 E = 1; E = 0; LCM12864_TestBusy(); /读LCM忙/从LCM12864读数据 LCM12864_ReadData() unsigned char LCM12864_ReadData(void) unsigned char LCM12864_data; E = 0; RW = 1; RS = 1; E = 1;

24、LCM12864_data = LCM12864_DB7_DB0; /送入8位数据 LCM12864_TestBusy(); /读LCM忙 return LCM12864_data;/向LCM12864指定点写一字节数据 LCM12864_Write1Byte_X_Y()/void LCM12864_Write1Byte_X_Y(unsigned char x, /x坐标值(0-127)unsigned char y, /y坐标值(0-63)unsigned char LCM12864_data) /LCM12864_data 所要写的数据 x = x &0x7f; y = y &am

25、p;0x3f; /参数过滤 CS1 = 1; CS2 = 1; /不选中左半屏及右半屏 if (x < 64) / 判断选择左、右半屏 CS1 = 1; / 选中左半屏 else CS2 = 0; / 选中右半屏 x = x - 64; LCM12864_WriteCMD(LCM12864_COL_START_ADDR + x); / 设置当前列地址,即x坐标 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR + y); / 设置当前页地址,即y坐标 LCM12864_WriteData(LCM12864_data); / 向LCM12864写数据/从

26、LCM12864指定点读取一字数据 LCM12864_Read1Byte_X_Y()unsigned char LCM12864_Read1Byte_X_Y(unsigned char x, /x坐标值(0-127)unsigned char y) /y坐标值(0-63) unsigned char LCM12864_data; x = x &0x7f; y = y &0x3f; /参数过滤 CS1 = 1; CS2 = 1; /不选中左半屏及右半屏 if (x < 64) / 判断选择左、右半屏 CS1 = 0; / 选中左半屏 else CS2 = 0; / 选中右半

27、屏 x = x - 64; LCM12864_WriteCMD(LCM12864_COL_START_ADDR + x); / 设置当前列地址,即x坐标 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR + y); / 设置当前页地址,即y坐标 LCM12864_data = LCM12864_ReadData(); / 向LCM12864写数据 return LCM12864_data;/向LCM12864填充数据 LCM12864_Fill_Screen()void LCM12864_Fill_Screen(unsigned char t, /设置涮屏速

28、度(为1不涮屏,默认为60)unsigned char LCM12864_FillData) /欲写入的数据 unsigned char x, y; CS1 = 0; CS2 = 0; / 选中左半屏及右半屏 LCM12864_WriteCMD(LCM12864_START_ROW + 0); / 设置显示起始行为0 for (x = 0; x < 8; x+) Delay(t); / 涮屏速度延时 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR + x); / 设置页地址 LCM12864_WriteCMD(LCM12864_COL_START_A

29、DDR); / / 设置列地址 for (y = 0; y < 64; y+) LCM12864_WriteData(LCM12864_FillData); CS1 = 1; / 不选中右半屏 CS2 = 1; / 不选中右半屏/LCM12864清屏 LCM12864_Clear_Screen()/ void LCM12864_Clear_Screen(void) LCM12864_Fill_Screen(60, 0x00); /写入0到每个显示区 /*/LCM12864黑屏 LCM12864_Clear_black()/ */void LCM12864_Clear_black(void

30、) LCM12864_Fill_Screen(60, 0xff); /可写入其它数值以填满LCD屏/在LCM12864的指定点显示16*16点阵汉字 LCM12864_Disp_Chinese_16_16()/ LCM12864_Disp_Char_x_16(8, 8, 1, lx + 8 * i, nAsciiDot + 16 * i);lcd12864void LCM12864_Disp_Char1_x_16(unsigned char t, /设置书写速度(为1直接显示,默认为12)unsigned char b, /输入8:8*16字符,16:16*16字符unsigned char

31、LCM12864_page, /LCM12864的页地址(07)unsigned char LCM12864_col, /LCM12864的列地址(0128)注意:右半屏起始是64unsigned char code *Char_x_16,unsigned char i ) /16*16点阵汉字字模(纵向取模,字节倒序) unsigned char j = 0; if (LCM12864_col < 64) CS1 = 0; CS2 = 1; /判断屏幕使能 ,左屏幕 else CS1 = 1; CS2 = 0; LCM12864_col = LCM12864_col - 64; for

32、 (j = 0; j < 2; j+) LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR + LCM12864_page );/b8+1+j 第一页 13 LCM12864_WriteCMD(LCM12864_COL_START_ADDR + LCM12864_col);/40+32丛2列开始 LCM12864_WriteData(Char_x_16b *j + i); Delay(t); void LCM12864_Disp_Char_x_16(unsigned char t, /设置书写速度(为1直接显示,默认为12)unsigned char b

33、, /输入8:8*16字符,16:16*16字符unsigned char LCM12864_page, /LCM12864的页地址(07)unsigned char LCM12864_col, /LCM12864的列地址(0128)注意:右半屏起始是64unsigned char code *Char_x_16) /16*16点阵汉字字模(纵向取模,字节倒序) unsigned char j = 0, i = 0; if (LCM12864_col < 64) CS1 = 0; CS2 = 1; /判断屏幕使能 ,左屏幕 else CS1 = 1; CS2 = 0; LCM12864_

34、col = LCM12864_col - 64; for (j = 0; j < 2; j+) LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR + LCM12864_page + j);/b8+1+j 第一页 LCM12864_WriteCMD(LCM12864_COL_START_ADDR + LCM12864_col);/40+32丛2列开始 for (i = 0; i < b; i+)/每8个一组 LCM12864_WriteData(Char_x_16b *j + i); Delay(t); /LCM12864初始化 LCM12864_

35、Init()void LCM12864_Init(void)RESET = 0; /复位 Delay(500);RESET = 1; Delay(300); LCM12864_Clear_Screen(); /清除屏幕 CS1 = 0; CS2 = 0; /选中双屏 LCM12864_WriteCMD(LCM12864_DISP_OFF); /关显示 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR + 0); /第0页位置 LCM12864_WriteCMD(LCM12864_START_ROW + 0); /第0行 LCM12864_WriteCMD(L

36、CM12864_COL_START_ADDR + 0); /第0列 LCM12864_WriteCMD(LCM12864_DISP_ON); /开显示/ 以上是 LCM12864液晶模块驱动程序int duan, wei, ge,shi,bai; int Dat, dianya, dy,jieya;/获取到的数字量 void jiema() long int jieya;jieya = TLC549(); bai=(dianya/51)%10;/计算并得到最高位shi=(dianya%51)*10 / 51;/计算并得到中间位 ge=dianya%51*10%51*10/51; /计算并得到最

37、低位/LCM12864液晶模块驱动演示 main() void main(void) unsigned char lx = 32; unsigned char ww = 32; LCM12864_Init(); / LCM12864初始化 LCM12864_WriteCMD(0x36); while (1) jiema(); LCM12864_Disp_Char_x_16(12, 16, 5, 32, dian); LCM12864_Disp_Char_x_16(12, 16, 5, 32+16, ya); LCM12864_Disp_Char_x_16(8, 8, 5, lx+32, nAsciiDot + 16 * bai);LCM12864_Disp_Char_x_16(8, 8, 5, lx+32+8, nAsciiDot + 16 * 11);/.LCM12864_Disp_Char_x_16(8, 8, 5, lx+32+8+8, nAsciiDot + 16 * shi);LCM12864_Disp_Char_x_16(8, 8, 5, lx+32+8+8+8, nAsciiDot + 16 * ge);LCM12864_Disp_Char_x_16(8, 8, 5, lx+32+8+8+8+8,nAsciiDot +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论