AT89S52综合接口程序设计报告.doc_第1页
AT89S52综合接口程序设计报告.doc_第2页
AT89S52综合接口程序设计报告.doc_第3页
AT89S52综合接口程序设计报告.doc_第4页
AT89S52综合接口程序设计报告.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

重庆理工大学硬件应用系统开发技术综合实验报告题目:AT89S52综合接口程序设计 二级学院 计算机科学与工程 专 业 计算机科学与技术 班 级 学生姓名 学号 教 师 时 间 2014.5.18 成 绩 目 录一、 实验名称AT89S52综合接口程序设计二、 实验目的1、测量PCF8591的AD的IN0电压0.00V到5.00V;2、通过RS232口送PC串口助手显示实测电压,形如“Voltage is: 2.35V”;3、将测量到的电压送PCF8591的DA输出到DL10,以调节LED量度;4、读取24C04中存储的报警调节值W0,当测量电压大于W0时蜂鸣器发出报警;5、通过PC串口助手发送形如“:3.00V”,即修改24C04中存储的报警值W0为3.00V。 其中“”为回车键,其ASCII码为0X0D和0X0A三、 实验设备与环境单片机硕飞开发试验仪;Pc机;Keil开发软件;串口助手软件。4、 实验基本原理AD0809工作原理:IN0-IN7:8条模拟量输入通道,AD0809对输入模拟量要求:子女好单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样电路。地址输入和控制线:1条ALE为地址锁存器允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码将A、B、C三条地址线的地址信号进行锁存,经锁存后被选中的通道的模拟量进转换器进行转换。ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,表明转换结束;否则。表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。24C04的写操作。在主器件发出开始信号以后,主器件再发送四位器件码、3位块地址码以及为逻辑低电平R/W位到总线上。这指示被寻址的从接收器,一个字地址和一个字节的数据将跟在第九个时钟周期期间产生的确认位之后。因此,主器件发送的下一个字节是字地址,并且它将被写入带24LC04B/08B的地址指针。在从24L04B/08B接收带另一个确认信号后,主器件将发送写入带被寻址的存贮器中的数据字节。24LC04B/08B自此发出确认信号,同时主器件产生停止条件。1、AT89S52芯片简介AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。2、PCF8591芯片简介2.1 PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。2.2 引脚信息AIN0AIN3:模拟信号输入端; PCF8591引脚A0A2:引脚地址端;VDD、VSS:电源端(2.56V);SDA、SCL:I2C 总线的数据线、时钟线;OSC:外部时钟输入端,内部时钟输出端;EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地;AGND:模拟信号地;AOUT:D/A 转换输出端;VREF:基准电源端。2.3 I2C接口1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。(3)引脚功能概述:SDA:串行数据/地址。双向传输端,用于传送地址和所有数据的发送或接收。它是一个漏极开路端,因此要求接一个上拉电到Vcc端(典型值为100kHz时为 10K,400kHz时为lK)。对于一般的数据传输,仅在SCL为低期间SDA才允许变化;在SCL为高期间变化,留给指示Start(开始)和Stop(停止)条件。WP:写保护。如果WP管脚连接到Vcc,则所有的内容都被写保护(只能读):当 WP管脚连接到Vss或悬空时,则允许器件进行正常的读/写操作。6、起始停止SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件;SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。 起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态起始和停止条件,在停止条件的某段时间后总线被认为再次处于空闲状态。如果产生重复起始条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始条件(Sr) 在功能上是一样的。2.4 AD、DA应用 PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。PCF8591片内有控制寄存器,单片机通过向该寄存器写入控制字来控制A/D和D/A转换,为此在转换之前要进行写控制字传送。其A/D转换部分读数据的操作为:寻址后要首先写控制字,以进行模拟通道选择、通道增量位和模拟信号输入形式(单端输入和差分输入)等设置。操作过程中,在PCF8591接收到的每个应答信号的后沿触发A/D转换,随后就是读出转换结果,但读出的是前一次的转换结果。所以“读数据0”是一次无效的操作。 A/D和D/A:控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3 自动增益选择(有效位为1)D5、D4模拟量输入选择:00为四路单输入、01为三路差分输入、10为单端和差分配合输入、11为模拟输出有效。当系统为A/D转换时,模拟输出容许为0.模拟量输入选择位取值由输入方式决定,四路单输入时取00,三路差分输入时取01,单端与差分输入时取10,二路差分输入时取11.最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。3、RS232接口3.1 简介RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:(1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-5 -15V;逻辑“0”:+5 +15V ,噪声容限为2V。即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负 。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。(2)传输速率较低,在异步传输时,波特率为20Kbps;因此在“南方的老树51CPLD开发板”中,综合程序波特率只能采用19200,也是这个原因。3.2 通讯方式:RS-232采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地,如从DTE设备发出的数据在使用DB25连接器时是2脚相对7脚(信号地)的电平,DB25各引脚定义参见图1。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5+15V,负电平在-5-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3+12V与-3-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为37k。所以RS-232适合本地设备之间的通信。4、24C04:4.1工作原理AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在AT89C51试验开发板上它们都接地,第8脚和第4脚分别为正、负电源。第7脚需要接地。第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在AT89C51试验开发板上和单片机的P3.5连接。第6脚SCL为串行时钟输入线,在AT89C51试验开发板上和单片机的P3.6连接。SDA和SCL都需要和正电源间各接一个5.1K的电阻上拉。 24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。5、蜂鸣器报警:由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,很简单,这里就不对自激蜂鸣器进行说明了。这里只对必须用1/2duty 的方波信号进行驱动的他激蜂鸣器进行说明。单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。本程序通过在输出一个音频范围的方波,驱动实验板上的蜂鸣器发出蜂鸣声,其中DELAY延时子程序的作用是使输出的方波频率在人耳朵听觉能力之内的20KHZ以下,如果没有这个延时程序的话,输出的频率将大大超出人耳朵的听觉能力,我们将不能听到声音。更改延时常数,可以改变输出频率,也就可以调整蜂鸣器的音调。5、 实验内容(包括主要算法分析与流程图)I2C相关流程图:6、 实验源程序及分析#include #include #define PCF8591_WRITE0x90#define PCF8591_READ 0x91#define OP_WRITE 0xa0 / 器件地址以及写入操作 /24c04#define OP_READ 0xa1 / 器件地址以及读取操作#define disdata P0 /显示数据码输出口sbit SDA_M= P1 1; / P1.1口模拟数据口sbit SCL_M= P1 0; / P1.0口模拟时钟口sbit SDA_c = P3 5;sbit SCL_c = P3 4; /24c04sbit BEEP = P37 ; /蜂鸣器驱动口typedef unsigned char uchar; typedef unsigned int uint;uchar Count;sbit LCD_RS = P2 0;sbit LCD_RW = P2 1;sbit LCD_EN = P2 2;unsigned char dis1 = Voltage is: . V ;unsigned int data dis4;unsigned char data dis_v3;unsigned char data receivebuf; /数据接收缓冲区unsigned char data_24c3; /保存从2430中读出来的数据unsigned char sendbuf3= 4,5,0;/24c04中报警值 350mAchar code reserve3_at_ 0x3b; /保留0x3b开始的3个字节/=/us延时函数 (4.34us/=void delayNOP()_nop_();_nop_();_nop_();_nop_();/=/ms延时/=void delayms(unsigned int ms)unsigned char i;while (ms-)for (i = 0; i 114; i+);/=/检查LCD忙状态/lcd_busy为1时,忙,等待。/lcd-busy为0时, 闲,可写指令与数据。/=bit lcd_busy()bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0 &0x80);LCD_EN = 0;return (result);/=/写指令数据到LCD/=void lcd_wcmd(unsigned char cmd)while (lcd_busy();LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;P0 = cmd;delayNOP();LCD_EN = 0;/=/RS=H,RW=L,E=高脉冲,D0-D7=数据。/=void lcd_wdat(unsigned char dat)while (lcd_busy();LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;P0 = dat;delayNOP();LCD_EN = 0;/=/LCD初始化设定/=void lcd_init()delayms(15);lcd_wcmd(0x38); /16*2显示,5*7点阵,8位数据delayms(5);lcd_wcmd(0x38);delayms(5);lcd_wcmd(0x38);delayms(5);lcd_wcmd(0x0c); /显示开,关光标delayms(5);lcd_wcmd(0x06); /移动光标delayms(5);lcd_wcmd(0x01); /清除LCD的显示内容delayms(5);/=/设定显示位置/=void lcd_pos(unsigned char pos)lcd_wcmd(pos | 0x80); /数据指针=80+地址变量/=/数据处理与显示/将采集到的数据进行16进制转换为ASCII码。/=void show_value(unsigned char ad_data)dis2 = ad_data / 51; /AD值转换为3位BCD码,最大为5.00V。dis2 = dis2 + 0x30; /转换为ACSII码dis3 = ad_data % 51; /余数暂存dis3 = dis3 *10; /计算小数第一位dis1 = dis3 / 51;dis1 = dis1 + 0x30; /转换为ACSII码dis3 = dis3 % 51;dis3 = dis3 *10; /计算小数第二位dis0 = dis3 / 51;dis0 = dis0 + 0x30; /转换为ACSII码/=/函数名称: iic_start()/函数功能: 启动I2C总线子程序/时钟保持高,数据线从高到低一次跳变,I2C通信开始/=void iic_start_m(void)SDA_M = 1;SCL_M = 1;delayNOP(); / 延时5usSDA_M = 0;delayNOP();SCL_M = 0;/=/函数名称: iic_stop()/函数功能: 停止I2C总线数据传送子程序/=void iic_stop(void)SDA_M = 0;SCL_M = 1;delayNOP();SDA_M = 1;delayNOP();SCL_M = 0;/=/函数名称: iicInit_()/函数功能: 初始化I2C总线子程序/=void iic_init(void)SCL_M = 0;iic_stop();/=/函数名称: slave_ACK/函数功能: 从机发送应答位子程序/=void slave_ACK(void)SDA_M = 0;SCL_M = 1;delayNOP();SCL_M = 0;SDA_M = 1;/=/函数名称: slave_NOACK/函数功能: 从机发送非应答位子程序,迫使数据传输过程结束/=void slave_NOACK(void)SDA_M = 1;SCL_M = 1;delayNOP();SDA_M = 0;SCL_M = 0;SDA_M = 0;/=/函数名称: check_ACK/函数功能: 主机应答位检查子程序,迫使数据传输过程结束/=void check_ACK(void)SDA_M = 1; /置成输入SCL_M = 1;F0 = 0;delayNOP();if (SDA_M = 1)/若SDA_M=1表明非应答F0 = 1;/置位非应答标志F0SCL_M = 0;/=/入口参数: indata/函数功能: 发送一个字节/=void IICSendByte(unsigned char indata)unsigned char n = 8; /发送一字节数据,共八bitwhile (n-)SDA_M = (bit)(indata &0x80);SCL_M = 1;delayNOP();SCL_M = 0;indata = indata 1; /数据左移一位/=/函数名称: IICreceiveByte/返回接收的数据 tdata/函数功能: 接收一字节子程序/=unsigned char IICreceiveByte_m(void)unsigned char n = 8; /读取一字节数据,共八bitunsigned char tdata = 0;while (n-)SDA_M = 1;SCL_M = 1;tdata = tdata 1; /左移一位if (SDA_M = 1)tdata = tdata | 0x01;/若接收到的位为1,则数据的最后一位置1elsetdata = tdata &0xfe;/否则数据的最后一位置0SCL_M = 0;return (tdata);/=/函数名称: DAC_PCF8591/入口参数: slave_add从机地址/函数功能: 发送数据子程序/=void DAC_PCF8591(unsigned char controlbyte, unsigned char w_data)iic_start_m(); / 启动I2CdelayNOP();IICSendByte(PCF8591_WRITE); /发送地址位check_ACK(); /检查应答位IICSendByte(controlbyte &0x77); /Control bytecheck_ACK(); /检查应答位IICSendByte(w_data); /data bytecheck_ACK(); /检查应答位iic_stop(); /全部发完则停止delayNOP();delayNOP();/=/函数名称: ADC_PCF8591/函数功能: A/D转换,结果存入receivebuf/=void ADC_PCF8591(unsigned char controlbyte)unsigned char i = 0;iic_start_m();IICSendByte(PCF8591_WRITE); /控制字0x90check_ACK();IICSendByte(controlbyte); /通道控制字check_ACK();iic_start_m(); /重新发送开始命令IICSendByte(PCF8591_READ); /控制字0x91check_ACK();IICreceiveByte_m(); /空读一次slave_ACK(); /收到一个字节后发送一个应答位/采集0通道receivebuf = IICreceiveByte_m();slave_ACK();slave_NOACK(); /收到后发送一个非应答位iic_stop();/=/接收数据子函数/=unsigned char rxdata()unsigned char dat;while (!RI);/等待数据接收完dat = SBUF; /接收数据RI = 0; /清中断标志return (dat);unsigned char buff5 ;/存放接收到的字符串unsigned char i = 0;void receive_byte() do buffi=rxdata(); i+; while(i4) ; if(i = 5) /循环接收 i = 0; void flush_sendsbuff()sendbuf0=buff0;sendbuf1=buff2;sendbuf2=buff3;/=/传送字符串函数/=void send_str(unsigned char str)unsigned char i = 0;while (stri != 0)SBUF = stri+;/等待数据传送完毕TI = 0; /清中断标志void vaue_to_dis()dis111=dis2;dis112=.;dis113=dis1;dis114=dis0;dis115=V;dis_v0= dis2;dis_v1= dis1;dis_v2= dis0;void iic_start_c()SDA_c = 1;SCL_c = 1;delayNOP();SDA_c = 0;delayNOP();SCL_c = 0;/=/停止子函数/在 SCL 高电平期间 SDA 发生正跳变/=void iic_stop_c()SDA_c = 0;SCL_c = 1;delayNOP();SDA_c = 1;delayNOP();SCL_c = 0;/=/IIC初始化子程序/=void iic_init_c()SCL_c = 0;iic_stop_c();/=/发送应答位子函数/在 SDA 低电平期间 SCL 发生一个正脉冲/=void iic_ack_c()SDA_c = 0;SCL_c = 1;delayNOP();SCL_c = 0;SDA_c = 1;/=/发送非应答位子函数/在 SDA 高电平期间 SCL 发生一个正脉冲/=void iic_noack_c()SDA_c = 1;SCL_c = 1;delayNOP();SCL_c = 0;SDA_c = 0;/=/从AT24C04读数据到MCU/=unsigned char readbyte()unsigned char i, read_data;SDA_c = 1; /置SDA为输入方式for (i = 0; i 8; i+)SCL_c = 1; /使SDA数据有效read_data = 1; /调整接收位if (SDA_c)/读SDAread_data+;SCL_c = 0; /继续接收数据return (read_data);/=/发送一个字节子程序/从MCU移出数据到AT24C04/=void writebyte(unsigned char write_data)unsigned char i;for (i = 0; i 8; i+)/ 循环移入8个位SDA_c = (bit)(write_data &0x80); /将发送位送入SDA数据线SCL_c = 1;delayNOP();SCL_c = 0; /SDA数据线上数据变化write_data = 1; /调整发送位/=/在指定地址addr处写入N个数/=void write_nbyte(unsigned char addr, unsigned char n)unsigned char x;iic_start_c();writebyte(OP_WRITE); /写0xa0iic_ack_c();writebyte(addr); /写存储地址iic_ack_c();while (n-)writebyte(sendbufx+); /写数据iic_ack_c();delayms(1);iic_stop_c(); /发送结束/=/在指定地址addr处读出N个数据/=void read_nbyte(unsigned char addr, unsigned char n)unsigned char x = 0;iic_start_c();writebyte(OP_WRITE); /写0xa0iic_ack_c();writebyte(addr); /写读取地址iic_ack_c();iic_start_c();writebyte(OP_READ); /写0xa1iic_ack_c();while (n-)data_24cx+ = readbyte(); /读出数据写入相应显存单元iic_ack_c(); /发送应答位delayms(1);iic_noack_c(); /发送非应答位iic_stop_c(); /发送结束int comper(unsigned char data_)unsigned char t;returnt= 100*(data_0+48)+10*(data_1+48)+data_2+48;/=/主函数/=void main(void) uint n, m;unsigned char i,j=0;unsigned char buff=0; P0 = 0xff;P1 = 0xff;P2 = 0xff;BEEP = 1;Count = 0x00; /计数单元清零SCON = 0x50; /设定串口工作方式1,接收使能PCO

温馨提示

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

评论

0/150

提交评论