下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8位7段码数码管89S51单片机32K静态RAMEEPROM单片机最小系统设计制作训练3.1单片机最小系统设计制作3.1.1单片机最小系统电路板硬件设计单片机的主要功能是负责整个系统的控制,不承担复杂的数据处理任务,因此在设计单片机最小系统时通常选用 AT89C5I、AT89C52、AT89S51、AT89S52( S系列芯片支持ISP功能)等型号的 8位单片 机作为MCU。一个典型的单片机最小系统一般由时钟电路、复位电路、片外RAM、片外ROM、按键、数码管、液晶显示器、外部扩展接口等部分组成,图3.1、图3.2分别给出了单片机最小系统的结构框图、原理图。地址、数抓中断.片选扩展接I 1图3
2、.1单片机最小系统的结构框图I144TLEDtUWV Ms丁*:& 二1 号2<*莒复E自 一soov 1E3MKMV 首on§-ndJaJ. £ UMml 一 J* gd£»ni 事旦 G a图3.2原理图单片机最小系统时钟、复位、译码电路简介单片机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。小系统上设置了一个2行乘8列的阵列式键盘,系统硬件电路如图4所示。电路结构采用总线扩展方式进行设计,同时使用P13和P14进行行选择,按
3、键信号通过一片74LS245挂接到数据总线上,片选信号为KEY_CS, 为其分配的物理地址为OxAlOO。图3.3键盘接口电路由于系统的键盘接口采用的是总线方式,因此读取按键数值变得相当方便,下面是使用C编写的读取键盘程序:#define KEY XBYTE OxAlOO / 键盘地址sbit first_row = P1A4; II 键盘第一行控制sbit sec on d_row = P"3; II 键盘第二行控制uchar M_key ; II键盘数值暂存单元 first_row = 0 ; II读取第一行键盘数值 sec on d_row = 1 ;M_key = KEY;f
4、irst_row = 1 ; II读取第二行键盘数值sec on d_row = 0 ;M_key = KEY;系统采用定时扫描的方式(扫描间隔为 4ms,内部定时器定时中断间隔为2ms,每两次定时中断进行一次键盘扫描)进行键盘识别,设计程序时通常要进行以下四个方面的处理:(1) 每隔4ms读取一次键盘的数值, 判断有无按键按下。 具体方法是令first_row = 0,second_row = 0,M_key = KEY,判断M_key的值是否为OxFF,如果等于OxFF说明没有按键按下,如果不等于 OxFF说 明有按键按下。(2) 去除按键的机械抖动影响。通过设置状态标志位first_ge
5、tkey来判断连续两次扫描键盘是否都 检测到有按键按下。如果没有连续两次都检测到按键按下则按照键抖动处理;否则,认为确实有按键按下。(3) 准确输出按键值key num,并提供获得有效按键标志getkey。(4) 防止按键冲突。在获得有效按键以后设定状态标志位keyon来实现每次只处理一个按键,且 无论一次按键时间有多长,系统仅执行一次按键功能程序。键盘识别程序流程如图3.4所示。程序代码将在介绍完数码管显示器以后统一给出。火云:sw=O. M_KEY; 扫搏二疗出鼻1>&Ml飞7nyK-lmunr*eynmr*K.?1unr L-3231-图3.4键盘识别程序流程本系统共设置了
6、 8个7段码数码管显示器,电路结构如图3.5所示。'一K |r-6 a 0 6 6 o o cL QQlJ_-2KT=:lIKLB3 口 =CT工_1T3 :4t S 1/匚3 d ©倉K<ICi*L1D:ILEiILED50Hii-2AB匚DEF R22ICOTl S3!CDZF9图3.58个7段码数码管显示器电路电路结构同样采用总线扩展方式进行设计,其中使用的数码管为连4位的共阳型数码管。通过芯片U15( 74HC573)锁存,为数码管提供段码数据。通过芯片U14( 74HC573 )、U13( 74HC138 )以及三极管Q1 Q8将低三位地址 A2.0进行硬件译
7、码,为每个数码管提供一个唯一的物理地址,具体地址为OxAOOO 0XA007。此外本电路结构还考虑了不同数码管进行显示切换时的消隐问题,在编写程序时不用通过额外的处理进行消隐。由于为每个数码管都分配了一个固定的物理地址,在编写程序时只要将相应的段码数据写入到对应的地址当中便可以完成显示,例如要在第二个数码管上显示“ 1,使用C语言办成实现如下:#define 7SEG_LED2 XBYTE OxAOOl / 第二个数码管的地址定义 7SEG_LED2 = 0xF9 ;将1”的段码数据 0xF9 ”输出到段码锁存器U15上,同时低三位地址 A2.0 001 ”/经过硬件译码使位码 LED2为高。
8、通过上面一条语句便可以实现在第二个数码管上显示1”的操作。但由于全部数码管的段码线共用,在同一时刻只能点亮一个数码管,所以在实际应用中必须采用动态扫描的方式进行8个数码管的显示。具体实现方法是使用内部定时器每2ms产生一次定时中断,系统在每进入到一次定时中断后更新一次显示内容,对于每个数码管来说其显示的周期为16ms,由于显示频率足够 高人眼感觉不到闪烁的存在。数码管显示程序流程如下:图3.6数码管显示程序流程在编写程序时考虑到单片机的资源利用情况,使用一个定时器为键盘扫描和数码管显示更新提供 定时服务,定时中断函数流程如图3.7所示。定时器定时间隔为2ms,每次进入中断调用一次显示更新函 数
9、,每两次进入中断调用一次扫描键盘函数。图3.8给出了利用以上给出的键盘扫描和数码管显示以及中断函数实现一个最简单系统的主程序流程图。在主程序中通过查询方式判断getkey (获得有效按键标志位,当获得一个有效按键后键盘扫描函数讲其置为1),当获得有效按键后令所有的数码管显示按键的数值。intTO()图3.7定时中断函数流程main图3.8主程序流程图C程序代码如下:#in elude <absacc.h>#in elude <reg51.h>#in clude< intrin s.h>#defi ne uchar un sig ned char/*数码管物理
10、地址*/#defi ne LED1 XBYTE OxAOOO#defi ne LED2 XBYTE 0xA001#defi ne LED3 XBYTE 0xA002#defi ne LED4 XBYTE 0xA003#defi ne LED5 XBYTE 0xA004#defi ne LED6 XBYTE 0xA005#defi ne LED7 XBYTE 0xA006#defi ne LED8 XBYTE 0xA007/*键盘物理地址*/#defi ne KEY XBYTE 0xA100/*扫描键盘使用的变量*/sbit first_row = P1A4; / 键盘第一行控制sbit sec
11、ond_row = PU3; / 键盘第二行控制bit first_getkey = 0,control_readkey = 0; / 读键盘过程中的标志位bit getkey = 0; /获得有效键值标志位,等于1时代表得到一个有效键值bit keyon = 0; /防止按键冲突标志位uchar key num = 0; /获得的有效按键值寄存器/*数码管显示使用的变量和常量*/uchar lednum = 0; / 数码管显示位控制寄存器uchar led8 = 0,0,0,0,0,0,0,0; / 数码管显示内容寄存器uchar code segtab18 = 0xc0,0xf9,0xa
12、4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0x8c,0xff; / 七段码段码表/ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", &
13、quot;E", "F", "P" ,"black"/* 函数声明 */void leddisp(void); / 数码管显示更新函数void readkey(void); / 键盘扫描函数/ *T0 定时中断处理函数 */void intT0() interrupt 1TH0 = -4230/256; / 定时器中断时间间隔 2msTL0 = -4230%256;leddisp(); / 每次定时中断显示更新一次if(control_readkey = 1) / 每两次定时中断扫描一次键盘readkey();control
14、_readkey = !control_readkey;/* 主函数 */void main(void)TMOD = 0x01; /设定定时器TO工作模式为模式1TH0 = -4230/256; /定时器中断时间间隔 2msTL0 = -4230%256;TCON = 0x10;ET0 = 1;EA = 1;while(1) /等待获得有效按键if(getkey = 1) / 判断是否获得有效按键getkey = 0; / 当获得有效按键时,清除标志位。led0 = keynum; / 令全部数码管显示按键值led1 = keynum;led2 = keynum;led3 = keynum;l
15、ed4 = keynum;led5 = keynum;led6=keynum;led7=keynum;/* 键盘扫描函数 原型 : void readkey(void);功能:当获得有效按键时,令getkey=1, key num为按键值*/void readkey(void)uchar M_key = 0; / 键盘数值暂存单元 first_row = 0;second_row = 0;M_key = KEY;if(M_key != 0xff) / 如果有连续两次按键按下,认为有有效按键按下。消除按键抖动 if(first_getkey = 0)first_getkey = 1;else /
16、当有有效按键按下时,进一步识别是哪一个按键if(keyon = 0) / 防止按键冲突,当还有未释放的按键时不对其它按键动作响应first_row = 0; / 扫描第一行按键 second_row = 1;M_key = KEY;if(M_key != 0xff)switch(M_key)case 0xfe:keynum = 0x00;break;case 0xfd:keynum = 0x01;break;case 0xfb:keynum = 0x02;break;case 0xf7:keynum = 0x03;break;case 0xef:keynum = 0x04;break;case
17、 0xdf:keynum = 0x05;break;case 0xbf:keynum = 0x06;break;case 0x7f:keynum = 0x07;break;else second_row = 0; / 扫描第二行按键 first_row = 1;M_key = KEY; switch(M_key) case 0xfe: keynum = 0x08; break; case 0xfd: keynum = 0x09; break; case 0xfb: keynum = 0x0a; break; case 0xf7: keynum = 0x0b; break; case 0xef:
18、 keynum = 0x0c; break; case 0xdf: keynum = 0x0d; break; case 0xbf: keynum = 0x0e; break; case 0x7f: keynum = 0x0f; break;getkey = 1; / 获得有效按键数值keyon = 1; / 防止按键冲突,当获得有效按键时将其置 1 else first_getkey = 0; keyon = 0; / 防止按键冲突,当所有的按键都释放时将其清 0 /* 数码管显示函数 原型 : void leddisp(void);功能 : 每次调用轮流显示一位数码管 */ void le
19、ddisp(void) switch(lednum) / 选择需要显示的数码位case 0:LED1 = segtabled0;break;case 1:LED2 = segtabled1;break;case 2:LED3 = segtabled2; break;case 3:LED4 = segtabled3; break;case 4:LED5 = segtabled4;break;case 5:LED6 = segtabled 5; break;case 6:LED7 = segtabled 6; break;case 7:LED8 = segtabled7; break;if(led
20、num = 0) /更新需要显示的数码管位置 lednum = 7;elselednum = led nu m-1;传统的显示器件数码管已经不能满足显示复杂操作界面的要求。因此最小系统中除了数码管显示器以外,还接入了一个液晶显示模块, 其型号为SGM12864C,可以显示64行128列的点阵数据, 通过编写相应的程序可以显示英文、 汉字或图形,可以实现比较复杂的用户操作界面。 硬件接口电 路如图3.9所示。液晶模块的结构及操作控制请参阅 SMG12864C.PDF 。U1LCDE 6 页T5TDE 101£»ELVO偃ESIcscslwisKDIVSBSRW EDODID2
21、D31R17LOK E9LCD R CS、LCD LCS、LCD_E为液晶模块提供片选及使Ao控制向液晶写入的是命令字还是数据字。此外将液晶的读写控制端图3.9硬件接口电路 在硬件设计中使用译码电路提供的 能信号。使用系统的地址信号接地,禁止从液晶中读数据,在向液晶中写入一个数据或命令后延时一段时间再向其中写入新的数据,避免由于液晶处在忙状态导致写入错误的情况发生。根据地址译码器提供的地址以及信号A0,可以得出向液晶左右两个控制器中写入命令和数据的物理地址,下面给出在C语言中的具体定义:#define LCD_L_DATA XBYTE 0xA201 / 左半边液晶数据地址#define LCD
22、_R_DATA XBYTE 0xA301 /右半边液晶数据地址#define LCD_L_Comma nd XBYTE 0xA200 左半边液晶命令地址#define LCD_R_Comma nd XBYTE 0xA300 / 右半边液晶命令地址为了使液晶能够显示字符、汉字以及图形,需要对其进行正确的设置,具体过程如下:(1)在系统上电后对其进行初始化设置。向左右两部分控制器写入控制字OxCO,设置显示的初始行。向左右两部分控制器写入控制字 0x3F ,将液晶的左右两部分显示开启。 此部分功能由后面给出 程序中的 lcd_initial() 函数完成。(2)在液晶指定位置显示给定的数据。完成液
23、晶的初始化以后,通过写入命令字确定显示的列地 址和页地址,然后写入需要显示的数据。以下给出了在液晶指定位置显示大小为 8*8 字符、 16*16 汉字以及 128*64 图形的 C 语言程序,用 户可以根据需要利用函数 lcd_write_byte() 编写显示任意大小图形和文字的函数。#include <absacc.h>#include <reg51.h>#include<intrins.h>#define uchar unsigned char#define LCD_L_DATA XBYTE 0xA201 / 左半边液晶数据地址#define LCD_
24、R_DATA XBYTE 0xA301 / 右半边液晶数据地址#define LCD_L_Command XBYTE 0xA200/ 左半边液晶命令地址#define LCD_R_Command XBYTE 0xA300/ 右半边液晶命令地址 uchar code G8 = 0x00,0x00,0x3e,0x41,0x49,0x49,0x7a,0x00; /*G*/ uchar code U8 = 0x00,0x00,0x3f,0x40,0x40,0x40,0x3f,0x00; /*U*/ uchar code O8 = 0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0
25、x00; /*O*/*-宋体12;此字体下对应的点阵为:宽x高=16x16 -*/*- 文字 : 国 -*/uchar code guo32 = 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00;/*- 文字 : 防 -*/uchar code fang32 = 0x00,0xFE,0x22,0x5A,0x86,0x02,0x
26、08,0x08,0xF9,0x8E,0x88,0x88,0x88,0x08,0x08,0x00,0x00, 0xFF,0x04,0x08,0x47,0x20,0x18,0x07,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00;/*- 文字 : 科 -*/uchar code ke32 = 0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x04, 0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x0
27、2,0xFF,0x01,0x01,0x00;/*- 文字 : 技 -*/ uchar code ji32 = 0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00,0x01, 0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00;/*- 文字 : 大 -*/uchar code da32 = 0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x
28、20,0x20,0x20,0x20,0x20,0x00,0x00, 0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00;/*- 文字 : 学 -*/ uchar code xue32 = 0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0
29、x00;/*液晶驱动函数声明*/void lcd_initial(void);void lcd_write_byte(uchar xpos,uchar ypos,uchar *byte);void lcd_write_char(uchar char_xpos,uchar char_ypos,uchar *char_source_addr);void lcd_write_hanzi(uchar hanzi_xpos,uchar hanzi_ypos,uchar *hanzi_source_addr);void lcd_clear(void);void lcd_fill(void);void de
30、lay(uchar time_nop);void main(void)lcd_initial();/ 初始化液晶 lcd_clear(); / 液晶清屏 lcd_write_char(0,0,G); / 显示 "A" 不得用于商业用途lcd_write_char(1,0,U); / 显示 "B" lcd_write_char(2,0,O); / 显示 "C" lcd_write_hanzi(2,2,guo); / 显示 "国 " lcd_write_hanzi(4,2,fang); / 显示 "防 &qu
31、ot; lcd_write_hanzi(6,2,ke); / 显示 " 科" lcd_write_hanzi(8,2,ji); / 显示 " 技" lcd_write_hanzi(10,2,da); / 显示 " 大 " lcd_write_hanzi(12,2,xue); / 显示 "学" while(1) /* 延时函数 函数原型 : void delay(uchar time_nop);功能: 延时time_nop个nop */ void delay(uchar time_nop) uchar i;for(i
32、=0;i<time_nop;i+)_nop_(); /* LCD 初始化 原型 : void lcd_initial(void);功能: 将 LCD 进行初始化,设置初始行并开显示 */ void lcd_initial(void) delay(5); LCD_L_Command = 0xC0; / 设置显示初始行 delay(5);LCD_R_Command = 0xC0; delay(5);LCD_L_Command = 0x3F; / 开显示 delay(5);LCD_R_Command = 0x3F; delay(5); /* 向 LCD 中写入一个字节数据函数 原型 : voi
33、d lcd_write_byte(uchar xpos,uchar ypos,uchar byte);功能:将一个字节数据byte写入液晶的(xpos, ypos)的位置处0-127,此处将液晶的显示区按照二维坐标进行定义,xpos为横坐标从左到右顺序为ypos为纵坐标从上到下顺序为0-7。*/ void lcd_write_byte(uchar xpos,uchar ypos,uchar *byte) if(xpos <= 63) / 坐标位置处在液晶的左半部分 delay(5);LCD_L_Command = xpos + 0x40; / 设定写入数据的列地址 delay(5);LC
34、D_L_Command = ypos + 0xB8; / 设定写入数据的行地址 delay(5);LCD_L_DATA = *byte; / 向(xpos, ypos)处写数据delay(5);else /坐标位置处在液晶的右半部分delay(5);LCD_R_Command = (xpos - 64) + 0x40; / 设定写入数据的列地址delay(5);LCD_R_Command = ypos + 0xB8; / 设定写入数据的行地址delay(5);LCD_R_DATA = *byte; / 向(xpos, ypos)处写数据delay(5);/*在 LCD 指定位置显示一个 ASI
35、IC 字符函数 字符大小为 8*8原型 : void lcd_write_char(uchar char_xpos,uchar char_ypos,uchar *char_source_addr);功能:将一个字符数据写入液晶的(char_xpos, char_ypos)的位置处此处将液晶的显示区按照二维坐标进行定义,char_xpos为横坐标从左到右顺序为 0-15, char_ypos为纵坐标从上到下顺序为 0-7。*/void lcd_write_char(uchar char_xpos,uchar char_ypos,uchar *char_source_addr)uchar i =
36、0;for(i=0;i<=7;i+)lcd_write_byte(char_xpos * 8 + i, char_ypos, char_source_addr + i);/*在LCD指定位置显示一个汉字函数字符大小为16*16原型 : void lcd_write_hanzi(uchar hanzi_xpos,uchar hanzi_ypos,uchar *hanzi_source_addr);功能:将一个汉字数据写入液晶的(hanzi_xpos, hanzi_ypos)的位置处,此处将液晶的显示区按照二维坐标进行定义,han zi_xpos为横坐标从左到右顺序为0-14(以半个汉字符为
37、单位),hanzi_ypos为纵坐标从上到下顺序为0-6(以半个汉字符为单位)。*/void lcd_write_hanzi(uchar hanzi_xpos,uchar hanzi_ypos,uchar *hanzi_source_addr)uchar i = 0;for(i=0;i<=15;i+) / 写汉字的上半部分lcd_write_byte(hanzi_xpos * 8 + i, hanzi_ypos, hanzi_source_addr + i);for(i=0;i<=15;i+) / 写汉字的下半部分lcd_write_byte(hanzi_xpos * 8 + i,
38、 hanzi_ypos + 1, hanzi_source_addr + 16 + i);/*LCD 清屏原型 : void lcd_clear(void);功能:将LCD清屏*void lcd_clear(void)uchar i,j;uchar byte1 = 0x00;for(i=0;i<=127;i+) for(j=0;j<=7;j+) lcd_write_byte(i,j,byte);/* LCD 填充原型 : void lcd_fill(void); 功能: 将 LCD 填充为黑色 */ void lcd_fill(void) uchar i,j;uchar byte1
39、 = OxFF;for(i=0;i<=127;i+)for(j=0;j<=7;j+)For pers onal use only in study and research; not for commercial use lcd_write_byte(i,j,byte);3.4单片机与D/A、A/D转换电路制作A/D、D/A转换器是单片机电路经常要用到的器件。在电子设计中,很多时候需要处理模拟量,对模拟量进行控制。 这就要使用到A/D、D/A转换器,将模拟量转换成数字量, 由单片计进行处理, 再将数字量转换为模拟量, 对外围设备进行控制。 由于单片机本身工作 速度慢,不能连接高速
40、A/D、D/A转换器,同时为了节省单片机 10 口资源,本节仅就低速 串行转换器进行介绍。如果需要使用高速A/D、D/A转换器,请使用FPGA对其进行控制。串行输出的A/D芯片由于节省单片机的I/O 口线,越来越多地被采用。如具有SPI三线 接口的 TLC1549、TLC1543、TLC2543、MAX187 等,具有 2 线 IIC 接口的 MAX127、PCF8591 (4路8位A/D,还含1路8位D/A)等。本小节以串行 A/D转换器芯片TLC1549为例简要 介绍串行A/D转换器的接口电路以及驱动程序的设计。1、TLC1549的工作方式及时序TLC1549有6种工作方式,如表2所示。其
41、中方式1和方式3属同一类型,方式2和方式4属同一类型。一般来说,时钟频率高于 280 kHz时,可认为是快速工作方式; 低于280 kHz时,可认为是慢速工作方式。因此,如果不考虑I/O CLOCK周期大小,方式5与方式3相同,方式6与方式4相同。表2 TLC1549的工作方式方CS'I/O时钾十引W fl MHI MSB的时劃快蛙力或方式1鬢第周期之阖擁商电平10|西T*厝方式2电平10方式孑辅换間期之诃为窩电平1115下降厝方式*注聯低赳平14龛£1严內方式5平第1肓牛时钟序降粘工作方式1工作时序图如图3.10所示。图中从C S下跳到DATA输出数据要有1.3卩s的延时;
42、连续进行 A/D转换时,在上次转换结果输出的过程中,同时完成本次转换的采样, 这样大大提高了 A/D转换的速率。如果I/O CLOCK的时钟频率为2.1 MHz,则完成一次A/D转换的时间大约为 26卩s。如果用连续模拟信号进行采样转换,显然其转换速率是很高的。I/O CLOCKCS采样周期转换间隔DATA OUT上次转换的数据图3.10方式1工作时序2、TLC1549与单片机最小系统的接口电路设计使用单片机小系统控制 TLC1549,主要通过扩展接口 J4完成,J4各管脚信号定义请参见图3.2小系统原理图。需要控制的芯片管脚有三个,分别为 C S、I/O CLOCK和DATAOUT,选用J4
43、中的P10、P11和P12(实际是单片机 P1 口中的三个I/O管脚)分别控制TLC1549 三个管脚。使用单片机的I/O模拟图12中的操作时序,完成对TLC1549的控制。接口电路如图3.11所示。在电路中使用 VCC作为A/D的参考电平,由于 VCC的不稳定会降低转换 精度,因此可以选用专用的参考电压芯片,提高转换精度。图3.11接口电路3、A/D转换接口程序设计编写驱动TLC1549的程序,就是通过软件的方法控制P10、P11和P12,产生如图3. 10中的操作时序,完成一次A/D转换。使用C编写的采样函数如下:#in elude <absacc.h>#in elude &l
44、t;reg51.h>#in clude< intrin s.h>#defi ne uchar un sig ned char#defi ne uint un sig ned intsbit AD_CS = P1A0; /TLC1549 片选信号sbit AD_IOCLOCK = P"1; /TLC1549时钟信号sbit AD_DATAOUT = P"2; /TLC1549数据输出信号/*A/D转换函数声明*/uint ad_c on vert(void);void delay(uchar time_nop);void main(void)uint ad_
45、data_10bit; / 低 10位为有效数据AD_CS = 1; / 初始化 TLC1549AD_IOCLOCK = 0;while(1)ad_data_10bit = ad_convert();delay(50); /完成一次采样后要延时 21us,等待下一次采样结果转换完成 /*AD 转换函数函数原型 : uint ad_convert(void);功能:驱动TLC1549完成一次A/D采样返回值为AD转换结果,使用16bit的uint型数据表示 低10位有效.*/uint ad_convert(void)uchar i;uint AD_DATA = 0;AD_CS = 0;for(i
46、=0;i<=9;i+)AD_IOCLOCK = 0;if(AD_DATAOUT = 1)AD_DATA = AD_DATA * 2 + 1;elseAD_DATA = AD_DATA * 2;AD_IOCLOCK = 1;AD_IOCLOCK = 0;AD_CS = 0;return(AD_DATA);/*延时函数函数原型 : void delay(uchar time_nop);功能:延时time_nop个nop*void delay(uchar time_ nop)uchar i;for(i=0;i<time_ nop;i+)_n op_();单片机实现控制是以数字信号或模拟信
47、号的形式通过I/O口送给被控对象的。模拟信号的产生通常需要 D/A转换器的参与。本小节以串行D/A转换芯片TLC5615为例简要介绍 串行D /A转换器的接口电路以及驱动程序的设计。1、芯片性能10位CMOS电压输出;5 V单电源工作; 与微处理器3线串行接口( SPI);最大输出电压是基准电压的 2倍; 输出电压具有和基准电压相同的极性; 建立时间12.5卩s; 内部上电复位;低功耗,最高为1.75 mW ;更具体的性能参数请参阅 TLC5615.PDF2、管脚及其功能TLC5615的引脚排列及功能说明分别见图3.12及表3。封装形式请参阅 TLC5615.PDF 。DIN 81 VDDSC
48、LK 27OUTCS 36RE FINDOUT 45AGND图3.12 TLC5615管脚图表3 TLC5615管脚功能引脚I/O说明名称序号DIN1I串行数据输入SCLK2I串行时钟输入/CS3I芯片选择低有效DOJI40用丁菊花链(daisy chaining)的串行数据输出AGND5模拟地REHN6I基准电圧输入OUT70DAC模拟电压输出VDD8正屯源(4.5-5+5V)3、TLC5615的工作时序TLC5615使用3线串行SPI接口与外界连接,其中DIN、SCLK、CS为输入控制。DOUT 用于多片D/A级联使用(菊花链结构),在仅使用一个芯片时,此脚悬空。(CSHO)/ MCS)WS1)UCH) rw(CL)Z/CSHI)SCLKtDOUT)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年秋季中国石油天然气集团有限公司西部钻探工程有限公司高校毕业生招聘(公共基础知识)综合能力测试题附答案
- 2026北京科技大学教师岗位招聘笔试备考题库及答案解析
- 2026天津中医药大学2026年第二批招聘4人笔试参考题库及答案解析
- 2025广东广州市越秀区林业和园林局招聘辅助人员1人考试参考题库附答案
- 2025年湖南益阳安化县医疗卫生单位备案制护理人员招聘15人(第二批)(公共基础知识)综合能力测试题附答案
- 2025年武汉长江新区公开招聘社区专职工作人员53人(公共基础知识)综合能力测试题附答案
- 2025年河南信息科技学院筹建处公开选调工作人员20名备考题库附答案
- 2026春季云南昭通市绥江县玉泉幼儿园编外临聘教师招聘5人笔试模拟试题及答案解析
- 2026安徽皖信人力资源管理有限公司招聘驾驶员2人笔试备考题库及答案解析
- 2026中国联通博州分公司招聘10人(新疆)笔试模拟试题及答案解析
- 油漆班组安全晨会(班前会)
- 消费类半固态电池项目可行性研究报告
- 沟槽开挖应急预案
- DBJ04∕T 398-2019 电动汽车充电基础设施技术标准
- 山东省济南市2024年1月高二上学期学情期末检测英语试题含解析
- 口腔门诊医疗质控培训
- (正式版)JBT 9229-2024 剪叉式升降工作平台
- HGT4134-2022 工业聚乙二醇PEG
- 小学教职工代表大会提案表
- ESC2023年心脏起搏器和心脏再同步治疗指南解读
- 《泰坦尼克号》拉片分析
评论
0/150
提交评论