1、电子线路设计专题实验报告西安交通大学XX交通大学电子信息与工程学院自动化科学与技术系电子线路设计专题实验报告实验名称:电子线路设计专题实验实验者XX:XX实验者学号: 21105040XX所在班级:自动化1X报告完成日期:2021年 5月 11日一、实验目的;熟悉单片机原理;掌握开发板上常见芯片的功能与用法;掌握单片机的开发软件:应用单片机,做一些简单的小应用电子时钟等二、实验内容:创立一个工程将键盘阵列定义为0. 1. 2- E. F,编程实现键盘设置当前时间,再调用系统时钟,显示在LED显示屏上注意仔细阅读PCF8563资料,键盘设置当前日期显示在LCD显示屏上。利用D/A转换通道下行通道
2、实现锯齿波发生器;输出15V固定电压转换成420mA电流。利用A/D转换通道上行通道实现数据采集,将采集信号显示在LED屏上。程序要求分别具有平均值滤波、中值滤波和滑动滤波功能。三、开发板简介:图PH-I型51MCU学习系统实物照片简介:四、功能实现与关键代码:电子时钟:在这一局部,有几个很重要的的程序模块:包含1602初始化、写控制字、写字符等几个函数的1602.h;包含根据总线协议编写的字节及多字节传输和接收函数的viic.h;实现键盘读取操作的key.h;实现不断读取时间芯片的值并显示在1602和led上显示日期时间的read函数等.以下是这几个重要的模块以及主函数程序。1602.h包含
3、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
4、);void LCD_Init2(void) CheckBF(); WriteW(0x0F); CheckBF(); WriteW(0xC0);void WritD(unsigned char key_asc2) CheckBF(); ptr=0xAF02; *ptr=key_asc2;viic.h包含根据总线协议编写的字节及多字节传输和接收函数/* 字节数据传送函数函数原型: void SendByte(uchar c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进展操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示
5、被控器无应答或损坏。*/ void SendByte(uchar c) uchar Bitt; for(Bitt=0;Bitt8;Bitt+) /*要传送的数据长度为8位*/ if(cBitt)&0x80)SDA=1; /*判断发送位*/ else SDA=0; _Nop(); SCL=1; /*置时钟线为高,通知被控器开场接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); S
6、CL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); /* 字节数据传送函数函数原型: uchar RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。*/ uchar RcvByte() uchar retc; uchar Bitt; retc=0; SDA=1; /*置数据线为输入方式*/ for(Bitt=0;Bitt8;Bitt+) _Nop(); SCL=0; /*置时钟线为低,准备接收数据
7、位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7s*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc1; 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) i
8、f(a=0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*时钟低电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); /* 向有子地址器件发送多字节数据函数函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址,数据,完毕总线的全过程,从器件地址sla,子地址su
9、ba,发送内容是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;ino;i+) SendByte(*s); /发送数据 if(ack=0)return(0); s+; Stop_I2c
10、(); /完毕总线 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; Start_I2c(); /*启动总线*/ SendByte(
11、sla); /*发送器件地址*/ if(ack=0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack=0)return(0); Start_I2c(); SendByte(sla+1); if(ack=0)return(0); for(i=0;ino-1;i+) *s=RcvByte(); /*发送数据*/ Ack_I2c(0); /*发送就答位*/ s+; *s=RcvByte(); Ack_I2c(1); /*发送非应位*/ Stop_I2c(); /*完毕总线*/ return(1); key.h实现键盘读取操作的/*有关键盘的函数*/unsig
12、ned char code Key_Value_Table16= /有关行列值 0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff, 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff ;bit bKeyUp_Flag;void Key_Init(void) bKeyUp_Flag=1;/标志位置1unsigned char GetScanKey(void) unsigned char key, i, temp; unsigned char xdata * ptr; key=0xff; for (i=1; i0x10; i=1) /i的低
13、4位为行数位,行依次检测循环4次 ptr=0x8fff; * ptr =i; temp = * ptr; /取键盘IO口的值 temp &= 0x0f; /屏蔽高四位 if (temp!=0x00) /是否有有效键值 key = i4; /*行值有效位(键盘的4个行SEL返回的值含有的有效位1)有且只有一位键值才有效否那么返回无效键值*/ if (temp=0xff) key=0xff; return key; temp=Key_Value_Tablekey&0x0f; /*列值有效位(键盘的4个列RL返回的值含有的有效位1)有且只有一位键值才有效否那么返回无效键值*/ if (temp=0x
14、ff) key=0xff; return key; key=Key_Value_Tablekey4*4+Key_Value_Tablekey&0x0f; /*行列组合后的值大于15无效*/ if (key15) key=0xff; return key; bKeyUp_Flag=0; return key; 实现不断读取时间芯片的值并显示在1602和led上显示日期时间的read函数void read() unsigned char rd7;/作为读8563数据的缓存区 unsigned char i; while(1) IRcvStr(0xA2,0x02,rd,0x7); rd0=rd0&0
15、x7f;/秒 rd1=rd1&0x7f;/分 rd2=rd2&0x3f;/时 rd3=rd3&0x3f;/日 rd4=rd4; / rd5=rd5&0x1f;/月 rd6=rd6; /年 td_table2=rd6/16; /数据分解 td_table3=rd6%16; td_table4=rd5/16; td_table5=rd5%16; td_table6=rd3/16; td_table7=rd3%16; td_table8=rd2/16; td_table9=rd2%16; td_table10=rd1/16; td_table11=rd1%16; td_table12=rd0/16;
16、 td_table13=rd0%16;/LED上显示 ptr=0x9fff; /先清零 * ptr =0x00; ptr=0x8fff; *ptr=0xff; /依次显示秒、分、时 ptr=0x9fff; * ptr =qiduan_tabletd_table13; ptr=0x8fff; *ptr=0x01; Delay_ms(1); ptr=0x9fff; * ptr =qiduan_tabletd_table12; ptr=0x8fff; *ptr=0x02; Delay_ms(1); ptr=0x9fff; * ptr =qiduan_tabletd_table11; ptr=0x8f
17、ff; *ptr=0x08; Delay_ms(1); ptr=0x9fff; * ptr =qiduan_tabletd_table10; ptr=0x8fff; *ptr=0x10; Delay_ms(1); Delay_ms(1); ptr=0x9fff; * ptr =qiduan_tabletd_table9; ptr=0x8fff; *ptr=0x40; Delay_ms(1); ptr=0x9fff; * ptr =qiduan_tabletd_table8; ptr=0x8fff; *ptr=0x80; Delay_ms(1); ptr=0x9fff; /先清零 * ptr =
18、0x00; ptr=0x8fff; *ptr=0xff; /LCD上显示日期 LCD_Init(); LCD_Init2(); WritD(ASC2_Value_Tabletd_table0); WritD(ASC2_Value_Tabletd_table1); WritD(td_table2+29); WritD(ASC2_Value_Tabletd_table3); WritD(0x20); WritD(0x20); WritD(0x20); WritD(ASC2_Value_Tabletd_table5); WritD(0x20); WritD(0x20); WritD(0x20); W
19、ritD(ASC2_Value_Tabletd_table6); WritD(ASC2_Value_Tabletd_table7); main函数void main() unsigned int i; Key_Init(); ptr=0x9fff; /先清零 * ptr =0x00; ptr=0x8fff; *ptr=0xff; LCD_Init(); for(i=0;i13;i+) WritD(tishi_table1i); Delay_ms(200); LCD_Init2(); for(i=13;i23;i+) WritD(tishi_table1i); Delay_ms(200); De
20、lay_s(4); if(Test_key() Input_data(); inition(); read(); 2利用D/A转换通道下行通道实现锯齿波发生器这一局部重要的代码片段是对tlc5615的操作以及在main函数中实现正弦等波形,下面是实现正弦波void tlc5615()(实现DA转换)void tlc5615(unsigned int dat) unsigned char x; CS=1; SCLK=0; Delay_us(500); DIO=0; CS=0; dat=dat6; for(x=0;x12;x+) DIO=dat&0x8000; SCLK=1; dat=dat1;S
21、CLK=0; CS=1; main函数unsigned char key=0x0ff;unsigned char xdata *ptr;unsigned float vol = 0;float add = 0.000383;float temp = 0;int main() LCD_Init(); Key_Init(); ptr = 0x8FF; *ptr = 0x00;/屏幕全部归位 Delay_s(4);Check_Busy(); write_(0x01); /显示屏清 Check_Busy(); while (1) for(i=0;i6280;i+) vol=500*(sin(i*0.0
22、1)+1)/ tlc5615(vol); 利用A/D转换通道上行通道实现数据采集,将采集信号显示在LED屏上。这一局部重要的代码片段有:对1549芯片的操作,将电压显示在led上三位小数的display函数。以下粘贴局部代码段:adc_1549不断采集端口数据,并送至int tlc1549() int data_out=0; unsigned char i; DIO = 0; SCLK=0; CS=1; _nop_(); CS = 0; /start for(i=1;i=10;i+) SCLK=1; data_out=0x5) disp2=0x5; disp1=0x0; disp0=0x0; ptr=0x8fff; *ptr=0x01; ptr=0x9fff; *ptr=map*(disp); Delay_us(50); *ptr=0x00; ptr=0x8fff; *ptr=0x02; ptr=0x9fff; *ptr=map*(disp+1); Delay_us(50); *ptr=0x00; ptr=0x8fff; *ptr=0x04; ptr=0x9fff; *ptr=(map*(disp+2)|0x80; Delay_us(50
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1