单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第9章模数数模转换习题答案_第1页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第9章模数数模转换习题答案_第2页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第9章模数数模转换习题答案_第3页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第9章模数数模转换习题答案_第4页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第9章模数数模转换习题答案_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

习题填空题单总线,只有信号线,既传输又传输数据。答:1根,输入,输出2.一个符合1-Wire协议的芯片都有位ROM,包括位的序列号、位的家族码和位的CRC码。答:64,48,8,83.DS18B20是数字温度传感器。答:单总线4.I2C器件都有的地址。答:唯一5.I2C串行总线有条信号线。答:两6.SPI总线是Motorola公司推出的一种串行通信方式。是一种三线同步总线。答:同步,全双工二.Proteus虚拟仿真设计任务:采用DS18B20测量温度,将采集的温度信息用LCD1602显示,并通过通过串口上传至计算机。计算机端采用串口助手接收。具有越线报警功能。答:1.硬件电路设计2.软件设计main.c/**********************************************************实现功能:数字温度计,要求:用1602液晶显示温度***********************************************************/#include<reg52.h>#include<LCD1602.h>#include<DS18B20.h>#include<stdio.h>#include<uart.h>#defineucharunsignedchar#defineuintunsignedint sbitbuzzer=P1^4;//蜂鸣器 /************************主函数******************************/voidmain(){ uart_init(); EA=1; //开总中断 LCD_init(); delay(1000); while(1) { if(flag==0) //检测到flag=0,说明DS18B20存在 { DS18B20_Temperature();// write_cmd(0x80); write_str("Tem:"); write_data((Temperature/100)%10+48); write_data((Temperature/10)%10+48); write_data('.'); write_data(Temperature%10+48); write_data(0xdf); write_data('C'); if(Temperature/10>=25) { buzzer=0; } else { buzzer=1; } } delay(500); printf("Temperature=%d",Temperature/10);//串口打印结果 printf("C\r\n"); }}uart.c代码#include<uart.h>#include<delay.h>#include<stdio.h>#include<DS18B20.h>voiduart_init(){TH1=0xFD; //晶振11.0592mhz波特率设为9600TL1=0xFD;TMOD|=0x20; //定时器1方式2SCON=0x50; //串口接收使能ES=1; //串口中断使能TR1=1; //定时器1使能TI=1; //发送中断标记位,必须设置}uart.h代码#ifndefUART_H_#defineUART_H_voiduart_init();#endifds18b20.c代码#include<DS18B20.h>bitflag;uintTemperature=0;/************************DS18B20程序*************************/bitinit_DS18B20() //DS18B20初始化{ ucharnum; DQ=1; for(num=0;num<2;num++);//先拉高 DQ=0; for(num=0;num<200;num++);//480-960us powerup DQ=1; for(num=0;num<20;num++); //>60uswait flag=DQ; //响应 for(num=0;num<150;num++); // 60-240usds18b20存在信号 DQ=1; returnflag;}voidDS18B20_WR_CHAR(ucharbyte) //写一个字节(先写低位){ ucharnum; ucharnum1; for(num1=0;num1<8;num1++) { DQ=0; //拉低 _nop_(); //下拉1us _nop_(); DQ=byte&0x01; for(num=0;num<20;num++); //>60uswait byte>>=1; DQ=1; //拉高 _nop_(); _nop_(); } }ucharDS18B20_RD_CHAR() //读一个字节(先读低位){ ucharnum; ucharnum1; ucharbyte=0; for(num1=0;num1<8;num1++) { DQ=0; //拉低 _nop_(); DQ=1; for(num=0;num<1;num++);//<10us byte>>=1; if(DQ==1) byte|=0x80; for(num=0;num<20;num++);//>60us } returnbyte;}voidDS18B20_Temperature() //温度读取及处理函数{ uchartemperaturel=0; uchartemperatureh=0; if(init_DS18B20()==0) { DS18B20_WR_CHAR(0xcc);//跳过ROM DS18B20_WR_CHAR(0x44);//启动温度转换,结果存入内部RAM delay(1000); if(init_DS18B20()==0)//初始化返回值为0,器件存在 { DS18B20_WR_CHAR(0xcc);//跳过ROM DS18B20_WR_CHAR(0xBE);//启动温度转换,结果存入内部RAM _nop_(); temperaturel=DS18B20_RD_CHAR();//读温度低8位 temperatureh=DS18B20_RD_CHAR();//读温度高8位 Temperature=(temperatureh*256+temperaturel)*0.625;//转换为温度,温度比正常大10倍 init_DS18B20(); } }}DS18B20.h代码#ifndefDS18B20_H_#defineDS18B20_H_#include<reg52.h>#include<delay.h>sbitDQ=P1^3;//DS18B20数据端externuintTemperature;externbitflag;bitinit_DS18B20(); //DS18B20初始化voidDS18B20_WR_CHAR(ucharbyte); //写一个字节(先写低位)ucharDS18B20_RD_CHAR(); //读一个字节(先读低位)voidDS18B20_Temperature(); //温度读取及处理函数#endiflcd1602.c代码#include<LCD1602.h>/***********************LCD1602显示****************************/voidLCD_init() //LCD1602初始化{lcdrw=0;//先将RW拉低 lcden=0;//再把EN拉低 write_cmd(0x38);//显示模式设置 write_cmd(0x0c);//显示开关,光标没有闪烁 write_cmd(0x06);//显示光标移动设置 write_cmd(0x01);//清除屏幕 write_cmd(0x80);//把光标移到第一行第一个位置}voidwrite_cmd(charcmd)//写指令函数{ lcdrs=0; OUT=cmd; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_data(uchardat)//写数据函数{ lcdrs=1; OUT=dat; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_str(uchar*str)//写字符串函数{ while(*str!='\0') { write_data(*str++); delay(5); }}LCD1602.h代码#ifndefLCD1602_H_#defineLCD1602_H_#include<reg52.h>#include<delay.h>#defineOUTP2//LCD1602数据端sbitlcdrs=P1^0;//LCD1602命令数据控制端sbitlcdrw=P1^1;//LCD1602读写端sbitlcden=P1^2;//LCD1602使能端voidLCD_init();//LCD1602初始化voidwrite_cmd(ucharcmd);//写指令函数voidwrite_data(uchardat);//写数据函数voidwrite_str(uchar*str);//写字符串函数#endif3.仿真运行2.

Proteus

虚拟仿真设计任务:采用单片机作为核心元件,循环采集4路电压信号,并在LCD上实时显示采集的4路电压值,通过按键控制开始采集和停止采集。将采集的信号存在AT24C02存储器中。答:1.硬件电路设计2.软件设计main.c#include<reg52.h>#include<EX_interrupt.h>#include<LCD1602.h>#include<I2C.h>#include<PCF8591.h>#include<AT24C02.h>ucharadcval,flag;/************************主函数******************************/voidmain(){ ucharstr[10]; INT_init(); LCD_init(); I2C_init(); while(1) { if(flag==1) { adcval=GetADC_PCF8591(0x00);//启动AIN0通道开始转换 ADCvalToStr(str,adcval); write_add(0x01,adcval);write_cmd(0x80);//把光标移到第一行第一个位置write_str("I0:"); write_cmd(0x83); write_str(str);//显示AIN0通道采集电压 adcval=GetADC_PCF8591(0x01);//启动AIN1通道开始转换 ADCvalToStr(str,adcval); write_add(0x04,adcval);write_cmd(0xC0);//把光标移到第一行第一个位置write_str("I1:"); write_cmd(0xC3); write_str(str);//显示AIN1通道采集电压 adcval=GetADC_PCF8591(0x02);//启动AIN2通道开始转换 ADCvalToStr(str,adcval); write_add(0x07,adcval);write_cmd(0x89);//把光标移到第一行第一个位置write_str("I2:"); write_cmd(0x8c); write_str(str);//显示AIN2通道采集电压 adcval=GetADC_PCF8591(0x03);//启动AIN3通道开始转换 ADCvalToStr(str,adcval); write_add(0x0a,adcval);write_cmd(0xC9);//把光标移到第一行第一个位置write_str("I3:"); write_cmd(0xCc); write_str(str);//显示AIN3通道采集电压 } if(flag==2) { ; } }}PCF8591.c/********读取当前的ADC转换值,chn为ADC的通道号0~3***********/ #include<PCF8591.h> #include<AT24C02.h> ucharGetADC_PCF8591(ucharchn){ ucharadcdate; start();//发送启动信号 write_byte(0x90);//发送寻址写命令1001A2A1A0R/W=10010000 Ack(); //应答信号 write_byte(chn);//写入模数转换通道号 Ack();//应答信号 stop(); //发送停止信号 start();//发送启动信号 write_byte(0x91);//寻址PCF8591,指定后续为读操作 Ack(); //应答信号 read_byte();//先空读一个字节,提供采样转换时间 Ack(); //应答信号 adcdate=read_byte();// NoAck(); stop(); //发送停止信号 returnadcdate;}voidADCvalToStr(uchar*str,ucharval){val=(val*5*10)/256;str[0]=(val/10)+'0';str[1]='.';str[2]=(val%10)+'0';str[3]='V';str[4]='\0';}AT24C02.c#include<AT24C02.h>/**************

温馨提示

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

评论

0/150

提交评论