1、3.1 74LS138资料 3.1.1 74LS138简介 74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式,其工作原理如下:当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B)为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。利用 G1、/(G2A)和/(G2B)可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。若将选通5端中的一个作为数据输入端时,74LS138还可作数据分配器。图3.1.1 为74LS138 的引脚简图。图3.1.1 74LS138 引脚图3.1.2 74LS
2、138功能表74LS138功能表如表3.1.2所示。表3.1.2 74LS138 功能表3.2 TLC2543 AD转换芯片 3.2.1 TLC 2543 简介 TLC2543是TI公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D 转换过程。由于是串行输入结构,能够节省51系列单片机I/O资源;且价格适中,分辨率较高,因此在仪器仪表中有较为广泛的应用。TLC2543的特点:(1)12位分辩率A/D 转换器;(2)在工作温度范围内10s 转换时间;(3)11个模拟输入通道;(4)3路内置自测试方式;(5)采样率为66kbps;(6)线性误差1LSBmax;(7)有转换结束输出EOC
3、;(8)具有单、双极性输出;(9)可编程的MSB或LSB前导。3.2.2 TLC2543引脚功能 TCL2543 引脚功能如表3.2.2 所示。引脚号名称I/O说明19、11、1、2AIN0AIN10I拟量输入端。15CS片选段。CS的下降沿使能DATA IN、DATA OUT和I/O CLOCK。17DATA INPUT串行数据输入端。数据在I/O CLOCK的上升沿串入。前4位数据为模拟电压的通道号或片内自测电压通道号,高位在先。16DATA OUTO串行数据输出端。数据在I/O CLOCK的下降沿写入。在CS无效或进行A/D转换时,该脚保持高阻状态。在数据输出时,由软件编程决定是高位在先
4、还是低位在先。19EOC转换结束标志。在输入串行数据的最后一个时钟周期的下降沿,即开始A/D转换时,EOC脚变低,直到转换结束后变高。此时数据准备完毕,可以输出。10GND地,REF-接该脚。18I/O CLOCKI/O时钟14REF+正参考电压端,一般情况接VCC。13REF-负参考电压端,一般情况接地。20VCC正电源电压输入端。电压为5V0.5V。表3.2.2TLC2543 引脚功能表3.2.3 TLC 时序图 TLC时序图如图3.2.3所示。图3.2.3 用CS进行12个时钟传送的工作时序图(注:在编程时一定要严格遵守时序。) 3.2.4 TLC 指令功能TLC指令功能如图3.2.4所
5、示 图3.2.4 TLC 指令功能(说明:发送指令和接受数据可同时进行也可先发指令再接收数据, 但是接收到的数据是上一次选通的通道转换的数据。3.3 74LS1643.3.1 74LS164简介 8 位串行输入,并出移位寄存器74ls164、74lsT164 是高速硅门COMS器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平
6、,一定不要悬空。时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,非同步地清除寄存器,强制所有的输出为低电平。 74LS164引脚图 74LS164逻辑图3.3.2 74LS164使用时序H = HIGH(高)电平h = 先于低-至-高时钟跃变一个建立时间 (set-up time) 的 HIGH(高)电平L = LOW(低)电平l = 先于低-至-高时钟跃变一个建立时间 (set-up time) 的 LOW(低)电平q =
7、 小写字母代表先于低-至-高时钟跃变一个建立时间的参考输入 (referenced input) 的状态 = 低-至-高时钟跃变4 软件设计4.1 程序流程图 数字电压表的程序流程图如图5.1所示。图5.1 数字直流电压表程序流程图4.2 程序代码#includeintrins.h#define uint unsigned int#define uchar unsigned charsbit doult=P05;sbit AA=P00;sbit BB=P01;sbit CC=P02;sbit SDA = P03;/数据总线sbit SCK = P04;/时钟sbit key0=P10;sbit
8、 key1=P11;sbit key2=P12;sbit key3=P13;sbit LED=P26;uint dis10;uint dis310;uint dis410;uchar yy=2,fz,di,yun,dt,n,shift;uint sum1=0;uchar key=0,flag=0;void K_deal(uchar key);uchar code strint2=当前电压:;uchar code strint4=电压上限:uchar code strint5=电压下限:uchar code strint3=ABCD963E852F7410/*AD转化函数*/uint TLC25
9、43(uchar port) uint ad=0; uchar i; SCK=0; AA=0; BB=0; port=4; for(i=0;i12;i+) if(doult=1) ad|=0x01; SDA=port&0x80 ; SCK=1;_nop_();port=port1;ad=ad return ad;/*延时*/void delayms(uchar x) uchar i,j; for(i=x;i0;i-) for(j=200;jj-);void Send_Byte(uchar dat)8; SDA = dat&0x80; SCK = 1; dat= 1; SCK = 0; /读一个
10、字节 uchar Read_Byte(void) uchar i; uint byte = 0; SCK = 0; for(i=0;16; byte4)|(byte8)&0x00ff; return (uchar)(byte);/读忙标志void Read_Busy(void) uchar temp; / CS = 1; do Send_Byte(0xfc);/ temp = Read_Byte(); while(temp&0x80); / CS = 0;/写字节命令 void Write_Cmd(uchar cmd) uchar temph = 0; uchar templ = 0; / t
11、emph = cmd& 0xf0; templ = (cmd& 0x0f) 4; Read_Busy(); Send_Byte(0XF8); Send_Byte(temph); Send_Byte(templ);/写数据 void Write_Dat(uchar dat) / temph = dat& templ = (dat& Send_Byte(0XFA);void pos(uchar x, uchar y) uchar addr; switch(y) case 0: addr = 0x80 + x;break; case 1: addr = 0x90 + x; case 2: addr
12、= 0x88 + x; case 3: addr = 0x98 + x; default: break; Write_Cmd(addr);/*液晶初始化*/ void LCD_Init(void) AA=1;BB=1;CC=0; Write_Cmd(0X30); Write_Cmd(0X01); Write_Cmd(0X02); Write_Cmd(0X0C);void Lcd_display(uchar key) uchar i; pos(0,0); i=0; while(strint2i!=0) Write_Dat(strint2i); i+; pos(0,1); while(strint
13、4i! Write_Dat(strint4i); pos(0,2); while(strint5i! Write_Dat(strint5i); pos(5,3); Write_Dat(strint3key);void AD_change() uint high1=0,high2=0,high3=0,high4=0; ad=TLC2543(0x01); ad=(float)ad/4096*5000; high1=ad/1000;/ if(high1sum3)/ high2=ad%1000/100; high3=ad%100/10; high4=ad%10; pos(5,0); Write_Dat
14、(high1+0X30); Write_Dat(.); Write_Dat(high2+0X30); Write_Dat(high3+0X30); Write_Dat(high4+0X30); /*矩阵按键*/ void keyscan() if(flag=0) Send_Byte(0x0e); /1111 1110 flag=1; temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(5); switch(temp) case 0x0e: key=0; break; case 0x0d: key=1; case 0x0b: key=2; case 0
15、x07: key=3; while(temp! K_deal(key); if(flag=1) Send_Byte(0x0d); /1111 1101 flag=2; key=4; key=5; key=6; key=7; if(flag=2) Send_Byte(0x0b); /1111 1011 flag=3; key=8; key=9; key=10; key=11; if(flag=3) Send_Byte(0x07); /1111 0111 flag=4; key=12; key=13; key=14; key=15; flag=0; /*按键处理*/ void K_deal(uch
16、ar key) uchar j,p=0,m,x; uint l,i,k; if(key=15) fz+; l=0x30; k=0; disfz=0; if(key=14) fz+; k=1; disfz=1; if(key=13) k=4; disfz=4; if(key=12) k=7; disfz=k; if(key=10) k=2; if(key=9) k=5; if(key=8) k=8; if(key=6) k=3; if(key=5) k=6; if(key=4) k=9; if(key=3) uchar i; di=1; if(di=1) yun=1; m=1; l=1; j=fz; for(;fzfz-) for(i=fz; m=m*10; m=m*disl; l+; sum1=sum1+m; m=1; fz=0; di=9; / i=sum1; if(key=1) pos(7,1); i=sum1; /sum2=sum1; for(x=0;xsum1; sum1=sum1/10; p+; for(j=p;j-) dis3j=i%10; i=i/10; for(j=1;j=p;j+) Write_Dat(0x30+dis3j); if(key=2)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1