电子线路设计专题实验报告西安交通大学
- 格式:docx
- 大小:2.11 MB
- 文档页数:22
西安交通大学 电子信息与工程学院自动化科学与技术系 电子线路设计专题实验报告
实验名称 : 电子线路设计专题实验 实验者姓名: XX 实验者学号: 21105040XX 所在班级: 自动化1X
报告完成日期: 2014年 5月 11日 一、实验目的; (1)熟悉单片机原理; (2)掌握开发板上常见芯片的功能与用法; (3)掌握单片机的开发软件:KELL (4)应用单片机,做一些简单的小应用(电子时钟等)
二、实验内容: (1)创建一个工程将键盘阵列定义为0. 1. 2------ E. F,编程实现键盘设置当前时间,再调用系统时钟,显示在LED显示屏上(注意仔细阅读PCF8563资料),键盘设置当前日期显示在LCD显示屏上。 (2)利用D/A转换通道(下行通道)实现锯齿波发生器;输出(1~5V)固定电压转换成(4~20mA)电流。 (3)利用A/D转换通道(上行通道)实现数据采集,将采集信号显示在LED屏上。程序要求分别具有平均值滤波、中值滤波和滑动滤波功能。
三、开发板简介:
图1 PH-I型51MCU学习系统实物照片 简介: 四、功能实现与关键代码: (1)电子时钟:在这一部分,有几个很重要的的程序模块:包含1602初始化、写控制字、写字符等几个函数的1602.h;包含根据𝐼2𝐶总线协议编写的字
节及多字节传输和接收函数的viic.h;实现键盘读取操作的key.h;实现不断读取时间芯片的值并显示在1602和led上显示日期时间的read函数等.以下是这几个重要的模块以及主函数程序。
○11602.h(包含1602初始化、写控制字、写字符等函数) //********检测是否忙、写控制字、写数据等********// void WriteW(uint a) { ptr=0xAFF0; *ptr=a; }
void CheckBF(void) {
uint i; while(1) { ptr=0xAFF1; i=*ptr; i &= 0x80; if(i==0) break; } }
void LCD_Init(void) { CheckBF(); WriteW(0x38); CheckBF(); WriteW(0x01); CheckBF(); WriteW(0x06); CheckBF(); WriteW(0x0F); CheckBF(); WriteW(0x80); }
void LCD_Init2(void) { CheckBF(); WriteW(0x0F); CheckBF(); WriteW(0xC0); }
void WritD(unsigned char key_asc2) { CheckBF(); ptr=0xAF02; *ptr=key_asc2; }
○2viic.h(包含根据𝐼2𝐶总线协议编写的字节及多字节传输和接收函数)
/******************************************************************* 字节数据传送函数 函数原型: void SendByte(uchar c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void SendByte(uchar c) { uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); } /******************************************************************* 字节数据传送函数 函数原型: uchar RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 ********************************************************************/ uchar RcvByte() { uchar retc; uchar BitCnt; retc=0; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc); } /******************************************************************** 应答子函数 原型: void Ack_I2c(bit a); 功能:主控器进行应答信号,(可以是应答或非应答信号) ********************************************************************/ void Ack_I2c(bit a) { if(a==0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); } /******************************************************************* 向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。 注意: 使用前必须已结束总线。 ********************************************************************/ //* bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0); SendByte(suba); //发送器件子地址 if(ack==0)return(0); for(i=0;i{ SendByte(*s); //发送数据 if(ack==0)return(0); s++; } Stop_I2c(); //结束总线 return(1); } /******************************************************************* 向有子地址器件读取多字节数据函数 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 如果返回1表示操作成功,否则操作有误。 注意: 使用前必须已结束总线。 ********************************************************************/ bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i;