《2022年单片机的双路信检测系统综合设计方案.docx》由会员分享,可在线阅读,更多相关《2022年单片机的双路信检测系统综合设计方案.docx(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品学习资源Q1Q8数码管段选端口 COM3数码管位选端口 COM674HC573P1 口P0 口D1D8LM75AAT89C51SDA SCLTLC549P3.4 P3.5 P3.6 P3.7P3.8P2.0 P2.1 P2.2P2.7CLK DATnCSKEY1 KEY2 KEY3 KEY8键盘基于单片机的双路信号检测系统综合设计一设计任务:设计一个能同时对环境温度和0V 2.5V直流电压进行检测的系统,电压的检测采纳TLC549 串行 ADC器件;对温度的检测采纳LM75A数字温度传感器;检测结果以动态扫描方式显示在一个 8 位 LED数码显示器上 微掌握器 AT89C51欢迎下载精品学
2、习资源组成: AT89C51掌握芯片,晶振电路,按键复位电路作用:装载程序,为外界电路供应I/O接口,对外界送来的数据进行处理,供应掌握信号,时钟信号,对电路进行复位等;工作原理: AT89C51 主要由中心处理器 温度测量电路 数字电压表电路 端处于高阻状态,此时 I/O CLOCK不起作用;将 CS置低,内部电路在测得CS 下降沿后,再等待两个内部时钟上升沿和一个下降沿后,确认这一变化,最终自动将前一次转换结果的最高位D7位输出到 DATA OUT 端上,前四个I/OCLOCK周期的下降沿依次移出 D6、D5、D4、D3,采样保持电路在第 4 个 I/O CLOCK下降沿开头采样下一个模拟
3、输入,接下来的 3 个 I/O CLOCK周期的下降沿移出第 D2、 D1、D0,最终,采样保持电路在第 8 个 I/O CLOCK周期的下降沿起作用,保持功能将连续 4 个内部时钟周期,然后开头进行 32 个内部时钟周期的 A/D 转换;第 8 个 I/O CLOCK后, CS必需为欢迎下载精品学习资源高,或 I/OCLOCK保持低电平,这种状态需要维护36 个内部系统时钟周期以等待保持和转换工作的完成;电原理图:见图 3;图 3. 数字电压表电路原理图4 键盘组成:按键 只需 4 个: KEY1,KEY2,KEY3,KEY;8作用:产生显示部分的挑选信号;工作原理:当按键未按下时,按键输出
4、为高电平,当按键按下时,按键输出为低电平;单片机对按键进行扫描,当扫描到某个按键按下 数码管扫描显示电路组成: 8 个七段数码管,锁存器74HC573;欢迎下载精品学习资源作用:将单片机送来的数据通过数码管显示出来,74HC573 用于锁存要显示的数据;工作原理:数码管的连接方式分为共阴极和共阳极数码管;共阳极接法,把数码管的阳极连在一起,使用时公共阳极接+5V,这时阴极接低电平的段数码管就导通点亮,而接高电平的就不点亮;共阴极接法,把数码管的阴极接在一起,使用时公共阴极接地,这时阳极接高电平的段数码管就导通点亮,而接低电平的就不亮;数码管动态显示方式采纳扫描法轮番点亮各个LED 数码管:某时
5、刻段选掌握端口输出一个字符的显示码,同时位选掌握端口选中其中的一个数码管进行显示,这样周而复始,将各显示码依次送到被选中的数码管,当显示频率达到几百赫兹时,由于人眼的视觉暂留原理,就似乎数码管将需要显示的数据“同时”显示了出来;在本试验中,P1 端口用做位选, P0 端口用做段选;电原理图:见图 5;图 5. 数码管扫描电路原理图2系统完整的原理图见图 6;欢迎下载精品学习资源欢迎下载精品学习资源三程序设计1. 模块化程序设计模块化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都掌握在人们简单懂得和处理的范畴;详细说,可实行以下方法来保证得到结构化的程序:自顶
6、向下;逐步细化;模块化设计;结构化编码;利用模块化的设计方法,考虑周全,结构清楚,层次分明,作者简单写,读者简单看;2. 总的程序流程框图开头定义外部变量 k系统初始化显示“ P”KeyScan,得到 k 值否k 变化 .欢迎下载精品学习资源是是读取电压值读取温度值是是k=”8”.否k=” 1.”否待命k=” 2.”否k=” 3”输出欢迎下载精品学习资源欢迎下载精品学习资源输出电压值输出温度值读 取 电 压值和温度值欢迎下载精品学习资源输出电压和温度显示当前输出欢迎下载精品学习资源3. 各部分程序设计, Delay , DispVol, AdcInit;各函数功能如下所示:ReadAdc :读
7、取 A/D 转换结果并返回 8 位 ADC代码; Delay :电压显示部分的延时函数;DispVol:将 ADC值转换成电压值,并显示出来;AdcInit:初始化 ADC接口;2) VolTab.H8 位 A/D 转换结果对应的电压数据表,可直接用于显示;3)温度读取与输出显示部分该模块的主要功能是读取LM75A 温度寄存器中的温度值,并将温度值通过显示程序送到数码管显示出来;主要包含的函数有:LM75A_GetTemp , ByteToStr,DispTemp ;各函数功能如下所示:LM75A_GetTemp) :温度显示部分的延时函数;DispTemp :在数码管上显示出温度值;Byte
8、ToStr:将字节型变量 c 转换为十进制字符串;, DispClear,DispChar , DispStr, DispDotOn , DispInit;各函数功能如下所示:T1INTSVC:定时器 T1 的中断服务函数; DispClear:清除数码管的全部显示; DispChar :在数码管上显示字符; DispStr:在数码管上显示字符串; DispDotOn :显示指定位的小数点; DispInit:数码管扫描显示初始化;, I2C_Init, I2C_Start, I2C_Write, I2C_Read , I2C_GetAck , I2C_PutAck , I2C_Stop ,
9、I2C_Puts , I2C_Put , I2C_Gets , I2C_Get ;各函数功能如下所示:I2C_Delay :延时,模拟 I2C 总线专用;I2C_Init: I2C 总线初始化,使总线处于闲暇状态; I2C_Start:产生 I2C 总线的起始状态; I2C_Write:向 I2C 总线写 1 个字节的数据; I2C_Read :从从机读取1 个字节的数据;I2C_GetAck :读取从机应答位;返回0 从机应答,返回 1 从机非应答;I2C_PutAck :主机产生应答位或非应答位;I2C_Stop :产生 I2C 总线的停止状态;I2C_Puts :主机通过 I2C 总线向
10、从机发送多个字节的数据;I2C_Put :主机通过 I2C 总线向从机发送 1 个字节的数据;欢迎下载精品学习资源I2C_Gets :主机通过 I2C 总线从从机接收多个字节的数据;I2C_Get :主机通过 I2C 总线从从机接收 1 个字节的数据; , SysInit, main ;各函数功能如下所示:KeyScan :键盘扫描函数; SysInit:系统初始化函数; main :调用各模块完成系统功能;四系统调试1. 硬件该系统的调试采纳 SmartSOPC 试验箱和 Quick51 核心板; SmartSOPC教案试验开发平台集众多功能于一体,是 SOPC、DSP、EDA、ARM、AR
11、MSOC 以及 8051 教案试验、科研开发的正确挑选;开发平台采纳“主板 +核心板”的模式,更换不同的核心板即可试验不同平台的功能; Quick51 正是跟 SmartSOPC相配套的 8051 单片机核心板;它是一款自由的、开放系统资源的单片机试验板;单片机芯片采纳 Philip 最新推出的拥有 64KB Flash 的增强型8052 内核单片机 P89LV51RD2工, 作电压3.3V;Quick51 与 SmartSOPC协作,可以做各种单片机教案试验,如LED 点阵扫描显示、键盘检测、动态数码管、液晶屏、电机驱动、I2C总线、红外收发、蜂鸣器、数字温度计、电子钟等等;跳线连接情形如下
12、所示:Quick51 板上跳线 JP1JP7为默认设置, JP1: VCC 与/EA 短接, JP2: /PSEN 与 GND 断开, JP3: RST与 RC短接, JP4JP6: A16 A18 全接 GND, JP7: RXD短接、 TXD短接;Quick51 板 J14 的 PB-LE用杜邦线连接到 J9;SmartSOPC试验箱 JP6的 KEY1、KEY2、KEY3和 KEY8分别用跳线帽短接, JP6 其它跳线全部断开;Quick51 板的 P1 端口用 8 芯排线连接到 SmartSOPC试验箱 B3 区的 COM6;Quick51 板的 J11PB端口 用 8 芯排线连接到
13、SmartSOPC试验箱 B3 区的 COM3;Quick51 板 J5 的 INT1 用杜邦线连接到 SmartSOPC试验箱 C2 区的 SCL;Quick51 板 J5 的 T0 用杜邦线连接到 SmartSOPC试验箱 C2 区的 SDA;Quick51 板 J5 的 T1 用杜邦线连接到 SmartSOPC试验箱 D4 区的 nCS; Quick51 板 J5 的 WR 用杜邦线连接到 SmartSOPC试验箱 D4 区的 DAT; Quick51 板 J5 的 RD 用杜邦线连接到SmartSOPC试验箱 D4 区的 CLK;2. 软件在参考原有程序的基础上,对程序按要求进行修改,
14、并分模块储存,程序修改好后进行调试,调试过程中应先分模块进行调试,第一确保电压能够正常显示,调试好后再将温度模块加入并使得温度可以正常显示,最终再添加交替显示部分,各部分模块都能正常显示 后,再调试使二者能够在适当的时间进行交替,不至于时间过长或过短,这时主要留意程序中延时长度的挑选;同时仍要留意在交替显示时能否进行实时采样,如不能,这时,应使在电压和温度的显示过程中,对电压或温度进行多次采样;五参考文献1 谭浩强著 . C 程序设计 第三版) .北京:清华高校出版社,20052 徐惠民,安德宁,丁玉珍著.单片微型运算机原理、接口及应用 数据手册5 TLC549 数据手册附录 1.电压模块#i
15、nclude #include Disp.h #include VolTab.h/ 定义 TLC549操作接口sbit CS = P35;sbit DAT = P36;sbit CLK = P37;/*函数: ReadAdc功能:读取 A/D 转换结果返回: 8 位 ADC代码*/unsigned char ReadAdcunsigned char d ;unsigned char n ;CS = 0;n = 5;while -n .= 0 ;n = 8;dod d+;CLK = 1;CLK = 0;while -n .= 0 ;CS = 1;return d ;/*函数: Delay功能:延
16、时 t*10ms*/void Delay549unsigned char t欢迎下载精品学习资源doTH0 = 0xDC;TL0 = 0x00;TR0 = 1;while .TF0 ;TR0 = 0;TF0 = 0; while -t .= 0 ;/*函数: DispVol功能:将 ADC值转换成电压值,并显示参数:v:8 位 ADC 结果*/void DispVolunsigned char vDispStr3,VolTabv;DispDotOn3 ;/*函数: AdcInit功能:初始化ADC 接口*/void AdcInitCS = 1;CLK = 0;DAT = 1;ReadAdc;附
17、录 2.温度模块#include #include Disp.h #include I2C.h #include /*欢迎下载精品学习资源函数: Delay功能:延时 1ms 65.536s参数:t0 时,延时 t*0.001s t=0 时,延时 65.536s*/void Delay75unsigned int tdoTH0 = 0xFC; TL0 = 0x66;TR0 = 1;while .TF0 ;TR0 = 0;TF0 = 0; while -t .= 0 ;/*函数: LM75A_GetTemp功能:读出 LM75A 的温度值返回: LM75A 温度寄存器的数值unsigned ch
18、ar buf2 ;int t ;I2C_Gets0x90,0x00,2,buf;t = buf0 ;t = 5;/ 去掉无关位return t ;/*函数: ByteToStr功能:字节型变量c 转换为十进制字符串*/void ByteToStrunsigned char idata *s, unsigned char cunsigned char t; t = c / 10 ;欢迎下载精品学习资源*s+ = 0 + t ;c -= t * 10 ;*s+ = 0 + c;*s = 0 ;/*函数: DispTemp功能:在数码管上显示出温度值参数:t:补码,除以8 以后才是真正温度值*/vo
19、id DispTempint tcode unsigned char Tab104 =0,1,2,3,5,6,7,8,9;unsigned char buf4 ;bit s;/ 符号位unsigned char i;/ 整数部分unsigned char d ;/ 小数部分unsigned char x;/ 暂时变量/ 分别出符号s = 0;if t s = 1; t = -t ;/ 分别出整数和小数部分i = t / 8 ;d = t % 8;/ 整数部分转换成字符串ByteToStrbuf,i;欢迎下载精品学习资源x = 4 - strlenbuf ;/ 清除全部显示DispClear;/
20、 显示符号if s DispCharx,-;x+;/ 显示整数部分DispStrx,buf ;/ 显示小数点DispDotOn4 ;/ 显示小数部分DispStr5,Tabd;附录 3.I2C 模块#include I2C.h/ 定义延时变量,用于宏I2C_Delay unsigned char data I2C_Delay_t;/*宏定义: I2C_Delay功能:延时,模拟I2C 总线专用*/#define I2C_DelayI2C_Delay_t = I2C_DELAY_VALUE; while -I2C_Delay_t .= 0 ;/*函数: I2C_Init功能: I2C总线初始化,
21、使总线处于闲暇状态说明:在 main函数的开头处,通常应当要执行一次本函数*/void I2C_InitI2C_SCL = 1;I2C_Delay;I2C_SDA = 1;I2C_Delay;欢迎下载精品学习资源/*函数: I2C_Start功能:产生 I2C 总线的起始状态说明:SCL处于高电平期间,当SDA显现下降沿时启动I2C 总线不论 SDA和 SCL处于什么电平状态,本函数总能正确产生起始状态本函数也可以用来产生重复起始状态本函数执行后, I2C 总线处于忙状态*/void I2C_StartI2C_SDA = 1;I2C_Delay;I2C_SCL = 1;I2C_Delay;I2
22、C_SDA = 0;I2C_Delay;I2C_SCL = 0;I2C_Delay;/*函数: I2C_Write功能:向 I2C 总线写 1 个字节的数据参数:dat:要写到总线上的数据*/void I2C_Writeunsigned char datunsigned char t = 8 ;doI2C_SDA = bitdat & 0x80;dat ;I2C_SCL = 0;I2C_Delay; while -t .= 0 ;/*函数: I2C_Read欢迎下载精品学习资源功能:从从机读取1 个字节的数据返回:读取的一个字节数据*/unsigned char I2C_Readunsigne
23、d char dat ;unsigned char t = 8 ;I2C_SDA = 1; / 在读取数据之前,要把SDA拉高doI2C_SCL = 1;I2C_Delay;dat dat |= 0x01;I2C_SCL = 0;I2C_Delay; while -t .= 0 ;return dat ;/*函数: I2C_GetAck 功能:读取从机应答位返回:欢迎下载精品学习资源说明:*/0:从机应答1:从机非应答从机在收到每个字节的数据后,要产生应答位从机在收到最终 1 个字节的数据后,一般要产生非应答位欢迎下载精品学习资源bit I2C_GetAckbit ack ;I2C_SDA =
24、 1;I2C_Delay;I2C_SCL = 1;I2C_Delay;ack = I2C_SDA;I2C_SCL = 0;I2C_Delay;return ack ;/*欢迎下载精品学习资源函数: I2C_PutAck功能:主机产生应答位或非应答位参数:欢迎下载精品学习资源说明:*/ack=0:主机产生应答位ack=1:主机产生非应答位主机在接收完每一个字节的数据后,都应当产生应答位 主机在接收完最终一个字节的数据后,应当产生非应答位欢迎下载精品学习资源void I2C_PutAckbit ackI2C_SDA = ack;I2C_Delay;I2C_SCL = 1;I2C_Delay;I2C
25、_SCL = 0;I2C_Delay;/*函数: I2C_Stop功能:产生 I2C 总线的停止状态说明:SCL处于高电平期间,当SDA显现上升沿时停止I2C 总线不论 SDA和 SCL处于什么电平状态,本函数总能正确产生停止状态本函数执行后, I2C 总线处于闲暇状态*/void I2C_Stopunsigned int t = I2C_STOP_WAIT_VALUE; I2C_SDA = 0;I2C_Delay;I2C_SCL = 1;I2C_Delay;I2C_SDA = 1;I2C_Delay;while -t .= 0 ;/ 在下一次产生Start 之前,要加肯定的延时/*函数: I
26、2C_Puts功能:主机通过 I2C总线向从机发送多个字节的数据参数:SlaveAddr:从机地址 / 检查长度if Size = 0 return 0;/ 确保从机地址最低位是0 SlaveAddr &= 0xFE;/ 启动 I2C 总线I2C_Start;/ 发送从机地址I2C_WriteSlaveAddr;if I2C_GetAck 欢迎下载精品学习资源/ 发送子地址I2C_Stop;return 1 ;欢迎下载精品学习资源I2C_WriteSubAddr ;if I2C_GetAck 欢迎下载精品学习资源/ 发送数据doI2C_Stop;return 1 ;I2C_Write*dat+
27、 ;if I2C_GetAck 欢迎下载精品学习资源I2C_Stop;return 1 ; while -Size .= 0 ;/ 发送完毕,停止 I2C总线,并返回结果I2C_Stop;return 0 ;欢迎下载精品学习资源/*函数: I2C_Put功能:主机通过 I2C总线向从机发送 1 个字节的数据参数:欢迎下载精品学习资源返回:*/SlaveAddr:从机地址 return I2C_PutsSlaveAddr,SubAddr,1,&dat;/*函数: I2C_Gets功能:主机通过 I2C总线从从机接收多个字节的数据参数:欢迎下载精品学习资源返回:*/SlaveAddr:从机地址 /
28、 检查长度if Size = 0 return 0;/ 确保从机地址最低位是0SlaveAddr &= 0xFE;/ 确保最低位是0/ 启动 I2C 总线I2C_Start;/ 发送从机地址I2C_WriteSlaveAddr;if I2C_GetAck 欢迎下载精品学习资源/ 发送子地址I2C_Stop;return 1 ;欢迎下载精品学习资源I2C_WriteSubAddr ;if I2C_GetAck I2C_Stop;return 1 ;/ 发送重复起始条件I2C_Start;/ 发送从机地址SlaveAddr |= 0x01 ;I2C_WriteSlaveAddr;if I2C_Ge
29、tAck 欢迎下载精品学习资源/ 接收数据I2C_Stop;return 1 ;欢迎下载精品学习资源for ; *dat+ = I2C_Read;if -Size = 0 I2C_PutAck1;break ;I2C_PutAck0;/ 接收完毕,停止 I2C总线,并返回结果I2C_Stop;return 0 ;/*函数: I2C_Get功能:主机通过 I2C总线从从机接收 1 个字节的数据参数:欢迎下载精品学习资源返回:*/SlaveAddr:从机地址 欢迎下载精品学习资源return I2C_GetsSlaveAddr,SubAddr,1,dat;附录 4.显示模块/*Disp.c数码管扫
30、描显示驱动程序*/#include #include / 定义显示缓冲区 功能:定时器T1 的中断服务函数*/void T1INTSVC interrupt 3code unsigned char com = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 ;static unsigned char n = 0 ;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;P1 = 0xFF;/ 暂停显示欢迎下载精品学习资源XBYTE0xE800 = DispBufn; P1 = comn; / 重新显示n+;n &= 0x07;/ 更新扫描数据欢迎下载精品学习资源/*函数: DispClear功能:清除数码管的全部显示*/void DispClearunsigned char i;欢迎下载精品学习资源for i=0 ; iDispBufi = 0x00 ;/*函数: DispChar功能:在数码管上显示字符参数:x:数码管的坐标位置 0 7) c:要显示的字符 / 0123456789P 的数码管字型数据code unsigned char Tab = 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; x &= 0x07;x = 7 - x;if c = - DispBuf