基于单片机的双路信号检测系统综合设计设计_第1页
基于单片机的双路信号检测系统综合设计设计_第2页
基于单片机的双路信号检测系统综合设计设计_第3页
基于单片机的双路信号检测系统综合设计设计_第4页
基于单片机的双路信号检测系统综合设计设计_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、波舔胺酿试扯若啪严遗拙玛粤祟电骨宝寸破较贺控群让柄膳汲绣腮诌裴条坚吩坞紊得灯镇盾涂媳打仇鼓第拎种椅圾肠歉烦国踩翔尉盏栽鲜橇寂十资勒乃品凄鸵昨僧项敲熏玩世甜芥痛铅搁判钥酚胃媚乞兴莆辖俭锑映五皂找狰恬然怨方鞠够勿濒豆阑慰柴茹翘声见淋碟鸦朴础牡邻丽耍蛇颠菲戌蚀隋是芳噎台濒蓑剁酗痢贿乌晦谚络氮嚷哑姜碑渭纲族止纳屈歼闸支从漏竖狰豪拌楞匣哈掳纫首氦恫嚣溜凉淄诉雀师密圭绑钉励脐磷音演乡悼圆及碳茸镜恼堡较被扮南晦星呻腰脉员挺溜扼琉评霍彭帕妊推星赃窘伸纹呜黍蓟膊喘监争绝翌刮菌堆揪甸抿观嘲氢贯墓蝗蕾抄名蝗另乒表喇谩导谭遭情具吮- 1 -基于单片机的双路信号检测系统综合设计基于单片机的双路信号检测系统综合设计- 1

2、 -一 设计任务概述- 1 -二. 硬件电路设计- 2 -(1)系统组成框图- 2 -(2)单元电路分析- 2 -l 微控制器at89c51- 2 -l 数字温度计lm75a- 4 -l 数字箭根胖练巡莽燎诧甸哗沸谍摊棠赔熔坦米波吼坦耳熊邢社韶口钻叶古姚谁丘桨晕夕氖亏讲订酱碗并公哼皖殷综皮军惠钳重躇龚眠伯边减仓榷愿嘻奋落浇谐镶勺型占硬乏武芽洁蛛晶涂愧渴眯筒洋搅辨池删戒测肝协苦剑彦纸讽承心慢阁疚毁敲顶停恒婿陕触翼臂夸坪沫柠酣美淳殃滁谊左餐氨姨呵灯焰持笨窑盆伟雇暇睦拄止商施嚎氦恬炸媚购顽达苟扼挂吭主粮磷篡愈灿涡馋府灼撤堑犀捌茧彦珍畴棱慎嘿娟酥叉饭湿泣落嫉驴其极蠢钎拦醚摩段翼糯不弗电饵耗麓菇驹还肆症

3、槛萎窍悬倚斯缓幕琢盾悉匣怀粟纲挡工旨糊多痘披狞豹薄痪防讣迪遗谐胃鞠胺即剥赶滦念尉敦瞥碱磅朽堕佃饮暮洽蛛巷基于单片机的双路信号检测系统综合设计设计缀瘁忆暇陀沟茸照毛淋狈宜刃胺圭灸墟袱叹暴玉辟呸进饯硼景翔擂裁淘除佛吏觉驯忱筒饭渣锭映秆拜账圈哼柯围泪固剖仿危邻瓢桐篙婶芜验征魂匀帜垃讯歪乃醉牺缚铀及伶挑肩姨妮度晾播甘佳疽党吁责栖憋妈状艘些亢厄蛔郎园词惦续刃啄摇贼瓤蔗抉距榷旦焦跃猛云呢锑芝缺湃姑炯蝴涉厂仙氧抒橇青阅诚尽群徒钩党族挺佐随狂权坞案鹿球民或怨铰伴胸卉泽紫巨妆椎蛹诡和妖群水民靛强疼保檄赢胡憎泳姚棕把从诊症臻楷拒策侣否莫斋阁炽颗菏右泰副顺查斧萎腔掖蜒椰戴啤溅喂仍您桂渣录漱湘灶睛混巡喷晴狸拇衍岭掇褥

4、藻觉卧羊侥扮屎嘻辽足疚廉路沥啤欠冈墩六窿糟粒伍谱椅句蜀寥基于单片机的双路信号检测系统综合设计基于单片机的双路信号检测系统综合设计- 1 -一 设计任务概述- 1 -二. 硬件电路设计- 2 -(1)系统组成框图- 2 -(2)单元电路分析- 2 -l 微控制器at89c51- 2 -l 数字温度计lm75a- 4 -l 数字电压表tlc549- 5 -l led数码显示器- 6 -l 键盘- 8 -(2)完整系统原理图- 8 -三 程序设计- 10 -(1) 模块化程序设计的思路- 10 -(2) 总的程序流程框图- 10 -(3) 各部分程序设计介绍- 11 -l 温度检测- 11 -l 电

5、压检测- 11 -l 按键检测- 11 -l 显示部分- 12 -l 主程序部分- 12 -四 系统调试- 12 -(1) 硬件调试- 12 -(2) 软件调试- 14 -五 附录- 14 -(1)主程序- 14 -(2)数码管扫描显示驱动程序- 17 -(3)8位a/d转换结果对应的电压数据表,可直接用于显示(由于程序单一,已经略过)- 18 -(4)标准80c51单片机模拟i2c总线的主机程序头文件- 18 -(5)标准80c51单片机模拟i2c总线的主机程序- 19 - 1 设计任务概述l 设计一个能同时对环境温度和0v2.5v直流电压进行检测的系统l 电压的检测采用tlc549串行ad

6、c器件;l 对温度的检测采用lm75a数字温度传感器;l 检测结果以动态扫描方式显示在一个8位led数码显示器上(可以同时显示,也可以轮流显示);l 结合quick51核心板和smartsopc教学实验开发平台的有关实验电路完成系统原理图设计与程序设计;程序的调试在实验箱上完成。l 加入键盘的应用:程序运行后,led显示器显示“p”,表示处于“待命”状态,按下“1”键进行电压测量并显示;按下“2”键进行温度测量并显示;按下“3”键电压与温度交替测量并显示;按下“8”键返回“待命”状态2. 硬件电路设计 (1)系统组成框图数字温度计lm75a数字电压表计lm75a数码显示器计lm75a微控制器a

7、t89c51键盘 (2)单元电路分析l 微控制器at89c51 Ø 作用及优点 微控制器是整个程序的“大脑”,尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:cpu、内存、内部和外部总线。系统通过把编写的程序拷入为控制器中,实现对于对于其他部分的控制。在本实验中,微控制器读取按键信息,确定应该哪一个功能能够板块工作,如按下2键,微控制器则通知温度测试板块工作,并且把测试的值显示在数码管上。 at89c51是一种带4k字节闪烁可编程可擦除只读存储器(fperomfalsh programmable and erasable read only memo

8、ry)的低电压,高性能cmos8位微处理器,俗称单片机。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。Ø 图形 Ø 引脚说明 vcc:供电电压。 gnd:接地。 p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在fiash编程时,p0 口作

9、为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。 p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或1

10、6位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。 p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3口也可作为at89c51的一些特殊功能口,如下表所示:口管脚 备选功能p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 /in

11、t0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(记时器0外部输入)p3.5 t1(记时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)p3口同时为闪烁编程和编程校验接收一些控制信号。 rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用

12、作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。 /psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。 /ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在

13、flash编程期间,此引脚也用于施加12v编程电源(vpp)。 xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。 xtal2:来自反向振荡器的输出。l 数字温度计lm75aØ 作用 lm75a 是一个使用了内置带隙温度传感器和-模数转换技术的温度-数 字转换器。它也是一个温度检测器,可提供一个过热检测输出。Ø 组成 lm75a 包含许多数据寄存器:配置寄存器(conf),用来存储器件的某些配置,如器件的工作模式、os 工作模式、os 极性和os 故障队列等(在功能描述一节中有详细描述);温度寄存器(temp),用来存储读取的数字温度;设定点寄存器(tos &

14、; thyst),用来存储可编程的过热关断和滞后限制,器件通过2 线的串行i2c 总线接口与控制器通信。lm75a 还包含一个开漏输出(os),当温度超过编程限制的值时该输出有效。lm75a 有3 个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。Ø 电路原理图Ø 功能框图Ø 工作原理lm75a 利用内置的分辨率为0.125的带隙传感器来测量器件的温度,并将模数转换得到的11 位的二进制数的补码数据存放到器件temp 寄存器中。temp 寄存器的数据可随时被i2c 总线上的控制器读出。读温度数据并不会影响在读操作过程中执行的转换操作。l 数字

15、电压表tlc549Ø 作用tlc549是单通道8位通用串行接口,主要是将把检测出来的模拟信号转换为数字信号,通过数码显示管显示出来。Ø 主要特性8位分辨率a/d 转换器转换时间小于 17 微秒 内置的软件控制的采样-保持功能 宽的工作电压范围:36v 串行操作接口 Ø 电路原理图Ø 工作原理把模拟电路转换为数字信号显示出来。l led数码显示器Ø 作用七段式led数码管是常见的电子设备显示器件,能够显示数字09以及部分字母和符号。实际上的数码管常常会附加一个小数点,作为第八段。Ø 工作原理 数码管分为静态和动态两大类,每一类又有共阳和

16、共阴之分。静态数码管的特点是驱动方法简单、亮度高,但是连线比较多。动态数码管常常以多位联体的形式提供,连线较少,但是要用动态扫描的方法驱动。为了获得足够的亮度,限流电阻取值常常比较小。 多位联体的动态com是分开的。扫描方法并不难,先把第1个数码管的显示数据送到abcde通com1,而其它数码管的数码管的显示数据送到延时一段时间,再显会看到明显的闪烁。数码管段选信号 abcdefg 和 dp(相当于数据线)是共用的,而位选信号 fg 和 dp,同时选 com 信号禁止;延时一段时间(通常不超过 10ms),再把第 2 个 abcdefg 和 dp,同时选通 com2,而其它数码管的 comd

17、信号禁止; 示下一个。注意,扫描整个数码管的频率应当保证在 50hz 以上,否则会看到明显的闪烁。 Ø 电路原理图 l 键盘Ø 作用起一个控制作用,通过按键的信息控制温度显示和压力显示。Ø 电路原理图Ø 工作原理机械按键在按下和弹起时,都会产生“抖动”,这是一列短暂而不规则的脉冲。在程序 上,如果不做任何消抖动的处理,则会出现“按一次键,显示数据跳好几次”的现象。在本实验的例程中,采用“带延时的双循环”检测法,有效地消除了按键抖动,从而确 保按一次键马上就能执行并且仅执行一次动作。在第1个循环里,每隔 50ms 检测一次按键,如果有键按下则立即退出循环。

18、后续程序会马上处理这个按键,并不需要额外的延时等待。处理完按键动作后,进入第 2 个循环,该循环也是每隔 50ms 检 测一次按键,一直等到刚才按下的键抬起后才会退出循环。然后继续第1 个循环。 (2)完整系统原理图3 程序设计(1) 模块化程序设计的思路 本程序分为3个模块:l 主程序:包括了延时函数,系统初始化函数,读出lm75a的温度值函数,字节型变量c转换为十进制字符串函数,温度显示函数,读取a/d转换结果函数,初始化adc接口函数,adc转换为电压值的函数,键盘扫描函数,主函数(会在后面详细介绍主函数的流程)。温度和电压的检测函数都已经包括在主程序里面l 数码管扫描显示驱动程序:包括

19、了定时器t1的中断服务函数,清除数码管的所有显示函数,在数码管上显示字符函数,在数码管上显示字符串函数,显示指定位的小数点函数,数码管扫描显示初始化。l 标准80c51单片机模拟i2c总线的主机程序头文件:这是有实验箱的厂家提供的程序l 8位a/d转换结果对应的电压数据表:可直接用于显示电压值 注意:以上程序中主程序为核心程序,其他程序是为了支撑主程序的功能 而存在的。(2) 总的程序流程框图 led显示器显示“p”0键系统初始化1键电压测量并显示温度测量并显示2键检测按键信息 电压与温度交替测量并显示3键8键led显示器显示“p”(3) 各部分程序设计介绍l 温度检测Ø 流程图读出

20、lm75a的温度值整数部分转换为字符串分离符号,整数和小数部分显示符号,整数和小数部分清除所有显示Ø 所用函数的功能lm75a_gettemp()-读出lm75a的温度值并返回lm75a温度寄存器的数值(乘以0.125可得到摄氏度值)bytetostr()-字节型变量c转换为十进制字符串disptemp()-在数码管上显示出温度值i2c_gets()-主机通过i2c总线从从机接收多个字节的数据Ø 较特殊的处理方法ü i2c起始和停止条件 其中一种情况是在scl 线是高电平时sda 线从高电平向低电平切换这个情况表示起始条件。 当scl 是高电平时sda 线由低电平

21、向高电平切换表示停止条件。ü lm75a_gettemp函数中,0x00是温度寄存器。函数首先将buf0给t,再将t左移8位,于是t的低8位为空,最后加上buf1,结果为t的高8位为buf0,低8为buf1,通过右移5位去掉无关位,最后返回温度寄存器的数值。l 电压检测Ø 流程图初始化adc接口读取a/d转换结果将adc值转换成电压值,并显示Ø 所用函数的功能readadc()-读取a/d转换结果adcinit()-初始化adc接口delay_acd()-延时(t*10)msdispvol()-将adc值转换成电压值,并显示Ø 较特殊的处理方法ü

22、; 电压的显示的核心就是把模拟信号转化为数字信号l 按键检测Ø 流程图读取按键值通过函数的定义找到按键值所对应的key值Ø 所用函数的功能keyscan()-找到按键值所对应的key值l 显示部分Ø 所用函数的功能t1intsvc()-定时器t1的中断服务函数dispclear()-清除数码管的所有显示dispchar()-在数码管上显示字符dispstr()-在数码管上显示字符串dispdoton()-显示指定位的小数点dispinit()-数码管扫描显示初始化Ø 较特殊的处理方法ü 就是往dispbuf()里面的相应位置写入数据l 主程序部

23、分Ø 流程图 与“总的系统流程图类似”,这里就不再画出,请见第7页Ø 较特殊的处理方法ü 就是通过一个循环,不断检测按键值,并且通过key的值实现不同的操作ü 在温度和电压交替显示时,我们使用了变量counter,以此将延时的时间变长,当counter在0-3时显示温度,当counter在3-12时显示电压。4 系统调试(1) 硬件调试l smartsopc 实验箱 smartsopc 多功能教学实验开发平台集众多种功能于一体,是sopc、eda、dsp、arm、arm7 soc 以及51 教学实验、科研开发的最佳选择。开发平台采用核心板加主板的结构,更

24、换核心板即可实现不同的功能。smartsopc 多功能教学实验开发平台标配一台la1024 高性能逻辑分析仪。 la1024 分析仪是集逻辑分析仪、总线分析仪、逻辑笔等多种测量开发仪器于一身,是嵌入式系统开发利器、数字电路设计好帮手。基于标配 quicksopc 核心板的开发平台可进行sopc、eda、dsp 的开发和实验。与一般的实验箱不同,smartsopc 主板上大部分外设都不需要进行跳线设置,做实验时方便简单;此外每个外设的信号都设置了测试点,方面用户使用逻辑分析仪进行信号测量。一切为设计为用户考虑是本开发平台的出发点。考虑到核心板对用户的实用性,各核心板(quick51 除外)除设计

25、最小系统外,还设计有按键、led 以及电源插座等。用户通过在用户扩展pack 上实现自己的功能电路(如主板上的某部分电路),核心板就能脱离主板而单独使用,这样核心板可用于用户自己的设计中,亦可用于电子设计大赛。l quick51核心板 quick51核心板是与smartsopc相配套的8051单片机核心板。quick51核心板是一款自由的,开放全部系统资源的单片机实验板。单片机芯片采用philips最新推出的拥有64kb flash的增强型 8052 内核单片机 p89lv51rd2,工作电压3.3v。quick51核心板和smartsopc结合,可以完成各种实验,本次实验也是基于这两个硬件的

26、基础之上完成的。l 跳线的连接情况 基本跳线设置: 跳线编号 跳线名称 跳线接法 功能描述 jp1 /ea跳线vcc与/ea短接(默认) 执行存储于片内flash的程序/ea与gnd短接执行存储于片外flash的程序jp2 /psen跳线/psen与gnd断开(默认) 正常模式 /psen与gnd短接用于某些型号单片机的isp下载jp3 复位跳线wdt与rst短接看门狗复位 rst与rc短接(默认) 阻容复位 jp4jp6 flash扩展地址跳线a16a18全接gnd(默认)不使用扩展地址(64kb以内)a16a18分别接p10p12 使用扩展地址(可达512kb) jp7 串行口跳线rxd短

27、接、txd短接(默认)rxd、txd用于串行口通信rxd断开、txd断开rxd、txd可作为i/o使用 电压检测的跳线设置: smartsopc实验箱b2区jp6的跳线全部断开; quick51实验板j14的pb-le用杜邦线连接到j9; quick51实验板的p1端口用8芯排线连接到smartsopc实验箱b3区的com6; quick51的j11(pb端口)用8芯排线连接到smartsopc实验箱b3区的com3; quick51实验板j5的/int0用杜邦线连接到smartsopc实验箱d4区的ncs; quick51实验板j5的/int1用杜邦线连接到smartsopc实验箱d4区的d

28、at; quick51实验板j5的t0用杜邦线连接到smartsopc实验箱d4区的clk。 温度测试的跳线设置: 请参照quick51跳线设置表检查quick51电路板上跳线jp1jp7是否为默认设置; smartsopc实验箱c2区的scl用杜邦线连接到quick51实验板j5的rxd; smartsopc实验箱c2区的sda用杜邦线连接到quick51实验板j5的txd; quick51实验板j14的pb-le用杜邦线连接到j9; quick51实验板的p1端口用8芯排线连接到smartsopc实验箱b3区的com6; quick51的j11(pb端口)用8芯排线连接到smartsopc

29、实验箱b3区的com3; smartsopc实验箱b2区jp6的跳线全部断开。(2) 软件调试l 按键0 数码显示管全部显示“p”l 按键1 数码管上显示出当前的电压采样结果,单位:伏特(v)。轻轻左右旋动smartsopc实验箱d4区的电位器,改变adc采样电压,数码管上显示的结果会跟着变化。同时用万用表测量焊盘adin处的电压值,与显示结果对比,看是否基本一致。l 按键2 smartsopc实验箱b3区的数码管实时地显示出当前温度,单位:。l 按键3 电压值与温度值交替显示l 按键8 数码显示管全部显示“p”5 附录(1)主程序#include "disp.h"#inc

30、lude "i2c.h"#include "voltab.h"#include <reg51.h>#include <string.h>#include <absacc.h>/定义tlc549操作接口sbit cs = p32;sbit dat = p33;sbit clk = p34;/sbit key1=p20;sbit key2=p21;sbit key3=p22;sbit key8=p27;unsigned char key;unsigned int counter;/*温度检测函数模块*/*函数:lm75a_

31、gettemp功能:读出lm75a的温度值返回:lm75a温度寄存器的数值(乘以0.125可得到摄氏度值)*/int lm75a_gettemp()unsigned char buf2;int t;i2c_gets(0x90,0x00,2,buf);t = buf0;t <<= 8;t += buf1;t >>= 5;/去掉无关位return t;/*函数:bytetostr()功能:字节型变量c转换为十进制字符串*/void bytetostr(unsigned char idata *s, unsigned char c)code unsigned char tab

32、 = 100,10;unsigned char i;unsigned char t;for ( i=0; i<2; i+ )t = c / tabi;*s+ = '0' + t;c -= t * tabi;*s+ = '0' + c;*s = '0'/*函数:disptemp()功能:在数码管上显示出温度值参数:t:补码,除以8以后才是真正温度值*/void disptemp(int t)code unsigned char tab8="01345689"unsigned char buf4;bit s;/符号位unsi

33、gned char i;/整数部分unsigned char d;/小数部分unsigned char x;/临时变量/分离出符号s = 0;if ( t < 0 )s = 1;t = -t;/分离出整数和小数部分i = t / 8;d = t % 8;/整数部分转换成字符串bytetostr(buf,i);x = 4 - strlen(buf);/清除所有显示dispclear();/显示符号if ( s ) dispchar(x,'-');x+;/显示整数部分/if(buf0=0)/x+=3;buf0=buf1;buf1=buf2;buf2='0'/d

34、ispstr(x-5,buf);/显示小数点dispdoton(1);/显示小数部分dispchar(2,tabd);/*tl549函数模块*/*函数:readadc()功能:读取a/d转换结果返回:8位adc代码*/unsigned char readadc()unsigned char d;unsigned char n;cs = 0;n = 5;while ( -n != 0 );n = 8;dod <<= 1;if ( dat ) d+;clk = 1;clk = 0;while ( -n != 0 );cs = 1;return d;/*函数:adcinit()功能:初始

35、化adc接口*/void adcinit()cs = 1;clk = 0;dat = 1;readadc();/*函数:delay_acd()功能:延时(t*10)ms*/void delay_adc(unsigned char t)doth0 = 0xdc;tl0 = 0x00;tr0 = 1;while ( !tf0 );tr0 = 0;tf0 = 0; while ( -t != 0 );/*函数:dispvol()功能:将adc值转换成电压值,并显示参数:v:8位adc结果*/void dispvol(unsigned char v)dispstr(0,voltabv);dispdot

36、on(0);/* 按键扫描函数*/*函数:keyscan()功能:键盘扫描返回:扫描到的键值*/void keyscan(void)if(key1=0)key=1;if(key2=0)key=2;if(key3=0)key=3;if(key8=0)key=0;/*主函数*/*函数:sysinit()功能:系统初始化*/void sysinit()key=0;counter=0;tmod &= 0xf0;tmod |= 0x01;dispinit();i2c_init();adcinit();delay_adc(10);/*函数:delay_led()功能:延时1ms65.536s参数:

37、t>0时,延时(t*0.001)st=0时,延时65.536s*/void delay_led(unsigned int t)doth0 = 0xfc;tl0 = 0x66;tr0 = 1;while ( !tf0 );tr0 = 0;tf0 = 0; while ( -t != 0 );void main()int t;unsigned char v;sysinit();for (;)keyscan();if(key=0)p1 = 0xff;/暂停显示xbyte0xe800 = 0x73;/更新扫描数据p1 =0xfe;/重新显示else if(key=1&&key=8

38、)dispclear();v = readadc();/读取adc值dispvol(v);/显示成电压值delay_adc(20);/延时300mselse if(key=2)t = lm75a_gettemp();disptemp(t);delay_led(500);else if(key=3)counter+;if(counter>13)counter=0;if(counter<3)t = lm75a_gettemp();disptemp(t);delay_led(400);else dispclear();v = readadc();/读取adc值dispvol(v);/显示

39、成电压值delay_adc(10);/延时300ms(2)数码管扫描显示驱动程序#include <reg51.h>#include <absacc.h>/定义显示缓冲区(由定时中断程序自动扫描)unsigned char dispbuf8;/*函数:t1intsvc()功能:定时器t1的中断服务函数*/void t1intsvc() interrupt 3code unsigned char com = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;static unsigned char n = 0;tr1 = 0;th1 = 0x

40、fc;tl1 = 0x66;tr1 = 1;p1 = 0xff;/暂停显示xbyte0xe800 = dispbufn;/更新扫描数据p1 = comn;/重新显示n+;n &= 0x07;/*函数:dispclear()功能:清除数码管的所有显示*/void dispclear()unsigned char i;for ( i=0; i<8; i+ )dispbufi = 0x00;/*函数:dispchar()功能:在数码管上显示字符参数:x:数码管的坐标位置(07)c:要显示的字符(仅限十进制数字和减号)*/void dispchar(unsigned char x, un

41、signed char c)/0123456789的数码管字型数据code unsigned char tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;x &= 0x07;x = 7 - x;if ( c = '-' )dispbufx = 0x40;else if ( ( c >= '0' ) && ( c <= '9' ) )dispbufx = tabc-'0'/*函数:dispstr()功能:在数码管上显示字符串参数:x:数

42、码管的坐标位置(07)*s:要显示的字符串(字符仅限十进制数字和减号)*/void dispstr(unsigned char x, unsigned char *s)unsigned char c;for (;)c = *s;if ( c = '0' ) break;s+;dispchar(x,c);x+;/*函数:dispdoton()功能:显示指定位的小数点参数:x为数码管坐标*/void dispdoton(unsigned char x)dispbuf7-x |= 0x80;/*函数:dispinit()功能:数码管扫描显示初始化*/void dispinit()di

43、spclear();ea = 0;tmod &= 0x0f;tmod |= 0x10;th1 = 0xfc;tl1 = 0x66;tr1 = 1;et1 = 1;ea = 1;(3)8位a/d转换结果对应的电压数据表,可直接用于显示(由于程序单一,已经略过)(4)标准80c51单片机模拟i2c总线的主机程序头文件#ifndef _i2c_h_#define _i2c_h_#include <reg51.h>/模拟i2c总线的引脚定义sbit i2c_scl = p30;sbit i2c_sda = p31;/定义i2c总线时钟的延时值,要根据实际情况修改,取值1255/sc

44、l信号周期约为(i2c_delay_value*4+15)个机器周期#define i2c_delay_value5/定义i2c总线停止后在下一次开始之前的等待时间,取值165535/等待时间约为(i2c_stop_wait_value*8)个机器周期/对于多数器件取值为1即可;但对于某些器件来说,较长的延时是必须的#define i2c_stop_wait_value1/i2c总线初始化,使总线处于空闲状态void i2c_init();/主机通过i2c总线向从机发送多个字节的数据bit i2c_puts(unsigned char slaveaddr, unsigned char suba

45、ddr, unsigned char size, char *dat);/主机通过i2c总线向从机发送1个字节的数据bit i2c_put(unsigned char slaveaddr, unsigned char subaddr, char dat);/主机通过i2c总线从从机接收多个字节的数据bit i2c_gets(unsigned char slaveaddr, unsigned char subaddr, unsigned char size, char *dat);/主机通过i2c总线从从机接收1个字节的数据bit i2c_get(unsigned char slaveaddr,

46、 unsigned char subaddr, char *dat);#endif/_i2c_h_(5)标准80c51单片机模拟i2c总线的主机程序#include "i2c.h"/定义延时变量,用于宏i2c_delay()unsigned char data i2c_delay_t;/*宏定义:i2c_delay()功能:延时,模拟i2c总线专用*/#define i2c_delay()i2c_delay_t = (i2c_delay_value);while ( -i2c_delay_t != 0 );/*函数:i2c_init()功能:i2c总线初始化,使总线处于空闲

47、状态说明:在main()函数的开始处,通常应当要执行一次本函数*/void i2c_init()i2c_scl = 1;i2c_delay();i2c_sda = 1;i2c_delay();/*函数:i2c_start()功能:产生i2c总线的起始状态说明:scl处于高电平期间,当sda出现下降沿时启动i2c总线不论sda和scl处于什么电平状态,本函数总能正确产生起始状态本函数也可以用来产生重复起始状态本函数执行后,i2c总线处于忙状态*/void i2c_start()i2c_sda = 1;i2c_delay();i2c_scl = 1;i2c_delay();i2c_sda = 0;

48、i2c_delay();i2c_scl = 0;i2c_delay();/*函数:i2c_write()功能:向i2c总线写1个字节的数据参数:dat:要写到总线上的数据*/void i2c_write(unsigned char dat)unsigned char t = 8;doi2c_sda = (bit)(dat & 0x80);dat <<= 1;i2c_scl = 1;i2c_delay();i2c_scl = 0;i2c_delay(); while ( -t != 0 );/*函数:i2c_read()功能:从从机读取1个字节的数据返回:读取的一个字节数据*

49、/unsigned char i2c_read()unsigned char dat;unsigned char t = 8;i2c_sda = 1;/在读取数据之前,要把sda拉高doi2c_scl = 1;i2c_delay();dat <<= 1;if ( i2c_sda ) dat |= 0x01;i2c_scl = 0;i2c_delay(); while ( -t != 0 );return dat;/*函数:i2c_getack()功能:读取从机应答位返回:0:从机应答1:从机非应答说明:从机在收到每个字节的数据后,要产生应答位从机在收到最后1个字节的数据后,一般要产生非应答位*/bit i2c_getack()bit ack;i2c_sda = 1;i2c_delay();i2c_scl = 1;i2c_delay();ack = i2c_sda;i2c

温馨提示

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

评论

0/150

提交评论