电子线路设计实验报告 李安琪 自动化11 2110504002_第1页
电子线路设计实验报告 李安琪 自动化11 2110504002_第2页
电子线路设计实验报告 李安琪 自动化11 2110504002_第3页
电子线路设计实验报告 李安琪 自动化11 2110504002_第4页
电子线路设计实验报告 李安琪 自动化11 2110504002_第5页
免费预览已结束,剩余33页可下载查看

下载本文档

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

文档简介

1、XIAN JIAOTONG UNIVERSITY电子线路设计II姓名班级学号日期实验报告李安琪自动化1121105040022014年4月29日电子线路设计 II 实验报告实验内容:1创建一个工程将键盘阵列定义为 0. 1. 2E. F ,编程实现键盘设置当前时间,再调用系统时钟,显示在 LED显示屏上(注意仔细阅读PCF8563资料),键盘设置当前日期显示在 LCD显示屏上。2 .利用D/A转换通道(下行通道)实现锯齿波发生器;输出(15V固定电压转换成(420mA电流。3 利用A/D转换通道(上行通道)实现数据采集,将采集信号显示在LED屏上。程序要求分别具有平均值滤波、中值滤波和滑动滤波

2、功能。实验方法:通过在 Keil uVision2 中进行程序的编写和语法测试, 之后通过电脑 USB 串口将程序下载到实验板上进行实际的程序运行, 通过实际运行结果对程 序进行调整。实验程序:本次实验中, 我将要验收的三个实验结合分别写了三个程序, 我设计了主 界面。除第二个程序考虑到要连续输出波形而选定后无法退回主界面外, 其与两个程序均能通过按键功能退到主界面。以下为我编写的代码。/( 1) 日历时钟/main-#include <SST89x5x4.H> #include <INTRINS.H> #include<LCD.h> #include<

3、;delay.h> #include<keyscan.h> #define uchar unsigned char #define uint unsigned int sbit be=PIW;uchar nian,yue,ri,shi,fen,miao,xingqi,shialarm,fenalarm,flag=1;年月日起始地址依uchar code table1="20 - -" /次为: 02h,05h,08h,0ch时分秒起始地址uchar code table2=" : : A : " / 依次为: 40h,43h,46h,4

4、b,4e unsigned char xdata * ptr;void beep()be=1; delay(100);be=0;delay(100); be=1;delay(100);be=0;void main()uint i=0;uchar key;EA=1;EX1=1;i2c_init();LCD_Init();pcf_init();for(i=0;i<=14;i+)WritD(table1i);LCD_Init2(0);for(i=0;i<=14;i+)WritD(table2i);writepcf_series(0x14,0x04,0x08,0x02,0x15,0x05,

5、0x00) ; readpcf_series();xianshi();while(1)key=keycan(&flag);xianshi1();if(flag=1)readpcf_series1(); xianshi();void alarm() interrupt 2writepcf(0x01,0x00);beep();/BCD#include <SST89x5x4.H> #define uchar unsigned char #define uint unsigned int #include <INTRINS.H> uchar BCD1(uchar q)

6、uchar bcd1=0; bcd1=q>>4; bcd1=10*bcd1+(q&0x0f) ;return bcd1;uchar BCD2(uchar q1) uchar bcd2=0; bcd2=q1/10; bcd2<<=4; q1=q1%10; bcd2=bcd2|q1;return bcd2;/change#include <SST89x5x4.H> #define uchar unsigned char #define uint unsigned int #include <INTRINS.H> #include <BC

7、D.h> #include<pcfi2c2.h> #include <xianshi.h> uchar num1=0,flag1;void change(uchar c,uchar *k) uchar dat; if(c=0x0C)/*k=0;num1+;switch(num1)case 1 :writepcf(0x00,0x20);LCD_Init2(6);CheckBF();WriteW(0x0f);break;case 2 :LCD_Init2(3);CheckBF();WriteW(0x0f);break;case 3 :LCD_Init2(0);Chec

8、kBF();WriteW(0x0f);break;case 4 :LCD_Init1(0x0c);CheckBF();WriteW(0x0f);break;case 5 :LCD_Init1(0x08);CheckBF();WriteW(0x0f);break;case 6 :LCD_Init1(0x05);CheckBF();WriteW(0x0f);break;case 7 :LCD_Init1(0x02);CheckBF();WriteW(0x0f);break;case 8 :LCD_Init2(0x0b);CheckBF();WriteW(0x0f);break;case 9 :LC

9、D_Init2(0x0e);CheckBF();WriteW(0x0f);break;case 0x0a :num1=0;*k=1;WriteW(0x0c);/ 光标不闪 readpcf_series();xianshi(); writepcf(0x00,0x00); break;if(num1!=0)if(c=0X0D) / 加一调整if(num1=1) LCD_Init2(6);CheckBF();WriteW(0x0f); miao=BCD1(miao); miao+; if(miao>=60) miao=0;miao=BCD2(miao); writepcf(0x02,miao)

10、; dat=miao>>4 ; WritD(table0dat); dat=miao&0x0f; WritD(table0dat);if(num1=2) LCD_Init2(3); CheckBF();WriteW(0x0f); fen=BCD1(fen); fen+; if(fen>=60) fen=0;fen=BCD2(fen); writepcf(0x03,fen); dat=fen>>4 ;WritD(table0dat); dat=fen&0x0f;WritD(table0dat);if(num1=3) LCD_Init2(0);Chec

11、kBF();WriteW(0x0f);shi=BCD1(shi); shi+; if(shi>=24) shi=0;shi=BCD2(shi); writepcf(0x04,shi); dat=shi>>4 ;WritD(table0dat); dat=shi&0x0f;WritD(table0dat);if(num1=4) LCD_Init1(0x0c);CheckBF();WriteW(0x0f);xingqi+; if(xingqi>=7) xingqi=0;writepcf(0x06,xingqi);WritD(table0xingqi);if(num1

12、=5) LCD_Init1(0x08); CheckBF();WriteW(0x0f); ri=BCD1(ri); ri+; if(ri>=32) ri=1;ri=BCD2(ri); writepcf(0x05,ri); dat=ri>>4;WritD(table0dat); dat=ri&0x0f;WritD(table0dat);if(num1=6) LCD_Init1(0x05);CheckBF();WriteW(0x0f); yue=BCD1(yue); yue+; if(yue>=13) yue=1;yue=BCD2(yue); writepcf(0x

13、07,yue); dat=yue>>4;WritD(table0dat); dat=yue&0x0f;WritD(table0dat);if(num1=7) LCD_Init1(0x02);CheckBF();WriteW(0x0f); nian=BCD1(nian); nian+; if(nian>=99) nian=0;nian=BCD2(nian); writepcf(0x08,nian); dat=nian>>4 ; WritD(table0dat); dat=nian&0x0f;WritD(table0dat);if(num1=8) LC

14、D_Init2(0x0b);CheckBF();WriteW(0x0f);shialarm=BCD1(shialarm);shialarm+;if(shialarm>=24)shialarm=0;shialarm=BCD2(shialarm); writepcf(0x0a,shialarm); dat=shialarm>>4 ; WritD(table0dat); dat=shialarm&0x0f; WritD(table0dat);if(num1=9) LCD_Init2(0x0e);CheckBF();WriteW(0x0f);fenalarm=BCD1(fen

15、alarm);fenalarm+;if(fenalarm>=60) fenalarm=0;fenalarm=BCD2(fenalarm); writepcf(0x09,fenalarm); dat=fenalarm>>4 ; WritD(table0dat); dat=fenalarm&0x0f;WritD(table0dat);if(c=0X0E)/ 减一调整if(num1=1) LCD_Init2(6);CheckBF();WriteW(0x0f); miao=BCD1(miao); flag1=1;if(miao=0) flag1=0;switch(flag1)

16、case 1: miao-;break;case 0:miao=59;break;default: break; miao=BCD2(miao); writepcf(0x02,miao); dat=miao>>4 ; WritD(table0dat); dat=miao&0x0f; WritD(table0dat);if(num1=2) LCD_Init2(3);CheckBF();WriteW(0x0f); fen=BCD1(fen); flag1=1;if(fen=0)flag1=0;switch(flag1)case 1: fen-; break;case 0:fen

17、=59;break;default: break; fen=BCD2(fen); writepcf(0x03,fen); dat=fen>>4 ;WritD(table0dat); dat=fen&0x0f;WritD(table0dat);if(num1=3) LCD_Init2(0);CheckBF();WriteW(0x0f); shi=BCD1(shi); flag1=1;if(shi=0)flag1=0;switch(flag1)case 1: shi-; break;case 0:shi=23;break;default: break; shi=BCD2(shi

18、); writepcf(0x04,shi); dat=shi>>4 ;WritD(table0dat);dat=shi&0x0f;WritD(table0dat);if(num1=4) LCD_Init1(0x0c);CheckBF();WriteW(0x0f);flag1=1;if(xingqi=1) flag1=0;switch(flag1) case 1: xingqi-;break;case 0:xingqi=6;break;default: break;writepcf(0x06,xingqi);WritD(table0xingqi);if(num1=5) LCD

19、_Init1(0x08); CheckBF();WriteW(0x0f); ri=BCD1(ri); flag1=1; if(ri=1)flag1=0;switch(flag1)case 1: ri-;break;case 0:ri=31;break;default: break;ri=BCD2(ri); writepcf(0x05,ri); dat=ri>>4; WritD(table0dat); dat=ri&0x0f;第 8 页WritD(table0dat);if(num1=6) LCD_Init1(0x05);CheckBF();WriteW(0x0f); yue

20、=BCD1(yue); flag1=1;if(yue=1)flag1=0;switch(flag1)case 1:yue-; break;case 0: yue=12; break;default: break; yue=BCD2(yue); writepcf(0x07,yue); dat=yue>>4; WritD(table0dat); dat=yue&0x0f; WritD(table0dat);if(num1=7) LCD_Init1(0x02);CheckBF();WriteW(0x0f); nian=BCD1(nian); flag1=1; if(nian=0)

21、 flag1=0;switch(flag1)case 1: nian-;break;case 0:nian=99;break;default: break; nian=BCD2(nian);writepcf(0x08,nian); dat=nian>>4 ; WritD(table0dat); dat=nian&0x0f;WritD(table0dat);/delay-#include <SST89x5x4.H> #define uint unsigned int void delay(uint z) /延时函数 ,z 的取值为这个函数的延时 ms数,如 del

22、ay(200); 大约延时 200ms. /delay(500); 大约延时 500ms. uint x,y;for(x=z;x>0;x-) for(y=110;y>0;y-);void delay1(unsigned int times) unsigned int i;for (i=0; i<times; i+);/display#define uchar unsigned char#define uint unsigned int uchar code table= 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0

23、x77,0x7c, 0x39,0x5e,0x79,0x71 ;void display2(uchar dat,uchar wei)uchar xdata * ptn;ptn=0x8fff;* ptn =wei; ptn=0x9fff;* ptn =tabledat;第 24 页delay(5);/keyscan-#define uchar unsigned char #include<change.h>/uchar keycan(uchar *r)uchar i, temp,num;uchar xdata * ptr;i=0x01;ptr=0x9fff; / 消除对显示函数的干扰*

24、ptr=0x00;ptr=0x8fff;* ptr =i;temp = * ptr;temp=temp&0x0f;while(temp!=0x00)temp = * ptr;temp=temp&0x0f; while(temp!=0x00) switch(temp) case 0x01: num=0; break; case 0x02: num=1; break; case 0x04: num=2; break; case 0x08: num=3; break;/ 取键盘 IO 口的值/ 取键盘 IO 口的值while(temp!=0x00) / 松手检测temp = * pt

25、r;/ 取键盘 IO 口的值temp=temp&0x0f;i=0x02;ptr=0x9ffff; / 消除对显示函数的干扰 *ptr=0x00; ptr=0x8fff;/ 取键盘 IO 口的值* ptr =i; temp = * ptr; temp=temp&0x0f; while(temp!=0x00)temp = * ptr;temp=temp&0x0f;while(temp!=0x00)/ 取键盘 IO 口的值switch(temp)case 0x01: num=4; break;case 0x02: num=5; break;case 0x04: num=6;

26、break;case 0x08: num=7; break;while(temp!=0x00) / 松手检测的值temp = * ptr;/ 取键盘 IO 口temp=temp&0x0f; i=0x04; ptr=0x8fff;* ptr =i;/ 取键盘 IO 口的值temp = * ptr; temp=temp&0x0f;while(temp!=0x00)temp = * ptr;temp=temp&0x0f;while(temp!=0x00)/ 取键盘 IO 口的值的值/ 取键盘 IO 口temp=temp&0x0f;i=0x08;ptr=0x8fff;*

27、 ptr =i;temp = * ptr;temp=temp&0x0f;while(temp!=0x00)temp = * ptr;temp=temp&0x0f; while(temp!=0x00) / 取键盘 IO 口的值/ 取键盘 IO 口的值switch(temp)case 0x01: num=12;switch(temp)case 0x01: num=8; break;case 0x02: num=9; break;case 0x04: num=10; break;case 0x08: num=11; break;while(temp!=0x00) / 松手检测temp

28、 = * ptr;的值break; case 0x02: num=13;break; case 0x04: num=14;break;case 0x08: num=15;break;while(temp!=0x00) / 松手检测temp = * ptr;/ 取键盘 IO 口temp=temp&0x0f;change(num,r);return num;/LCD-#include <SST89x5x4.H> #include <INTRINS.H> unsigned char xdata * ptr;void CheckBF(void) unsigned int

29、 i; while(1) ptr=0xAFF1; i=*ptr;i &= 0x80; if(i=0) break;void WriteW(unsigned int a) ptr=0xAFF0;*ptr=a;void WritD(unsigned char key_asc2)CheckBF();ptr=0xAF02;*ptr=key_asc2;void LCD_Init(void)CheckBF();WriteW(0x38);CheckBF();WriteW(0x01);CheckBF();WriteW(0x06);CheckBF();WriteW(0x0c);CheckBF();voi

30、d LCD_Init1(unsigned char b) CheckBF();WriteW(0x0c);CheckBF();WriteW(0x80+b);void LCD_Init2(unsigned char a)CheckBF();WriteW(0x0c);CheckBF();WriteW(0xC0+a);/pcf#include <SST89x5x4.H>#define uchar unsigned char#define uint unsigned intuchar nian,yue,ri,shi,fen,miao,xingqi,shialarm,fenalarm; sbi

31、t sda=P 1八1;sbit scl=PMO;void start(void)sda=1;delay1(6); scl=1;delay1(6); sda=0;delay1(6); scl=0;delay1(6); void i2c_init() scl=1; delay1(6); sda=1;delay1(6);void respons()sda=0; delay1(6); scl=1; delay1(6); scl=0; delay1(6);sda=1; delay1(6);void NoAck(void)sda=1; delay1(6); scl=1; delay1(6);scl=0;

32、 delay1(6);void stop(void)scl=0;delay1(6); sda=0;delay1(6); scl=1;delay1(6);sda=1;delay1(6);uchar read_byte()uchar i,j,k;scl=0;delay1(6);sda=1;delay1(6);for(i=0;i<8;i+)scl=1; delay1(6);j=sda; k=(k<<1)|j;scl=0;delay1(6);return k;bit write_byte (uchar input)uchar temp;for(temp=8;temp!=0;temp-

33、) sda=(bit)(input&0x80);delay1(6);scl=1;delay1(6);scl=0;delay1(6); input=input<<1;return 1;delay1(1);void writepcf (uchar RomAddress,uchar da)start();write_byte (0xA2);respons();write_byte (RomAddress);respons(); write_byte(da); respons(); stop(); delay1(1);void writepcf_series(uchar nian1

34、,uchar yue1,uchar ri1,uchar xingqi1,uchar shi1,uchar fen1,uchar miao1) writepcf(0x08,nian1); writepcf(0x07,yue1); writepcf(0x06,xingqi1); writepcf(0x05,ri1); writepcf(0x04,shi1); writepcf(0x03,fen1); writepcf(0x02,miao1);void readpcf_series ()start();write_byte (0xA2);respons();write_byte (0x02);res

35、pons();start();write_byte (0xA3);respons(); miao=read_byte()&0x7f;respons(); fen=read_byte()&0x7f; respons(); shi=read_byte()&0x3f; respons();ri=read_byte()&0x3f; respons(); xingqi=read_byte()&0x07; respons(); yue=read_byte()&0x1f;respons(); nian=read_byte(); respons(); fenal

36、arm=read_byte()&0x7f; respons(); shialarm=read_byte()&0x3f; NoAck(); stop();delay1(1);void readpcf_series1 ()start();write_byte (0xA2); respons();write_byte (0x02); respons(); start();write_byte (0xA3); respons(); miao=read_byte()&0x7f;respons(); fen=read_byte()&0x7f; respons(); shi=

37、read_byte()&0x7f; NoAck(); stop(); delay1(1);void pcf_init()writepcf(0x00,0x00);writepcf(0x01,0x00);/ 显示#include <SST89x5x4.H> #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int #include<display2.h> uchar code table0=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x

38、37, 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46 ;void xianshi() uchar dat; LCD_Init1(2);/ 年 dat=nian>>4 ;WritD(table0dat); dat=nian&0x0f;WritD(table0dat);LCD_Init1(5);/ 月 dat=yue>>4 ;WritD(table0dat);dat=yue&0x0f;WritD(table0dat);LCD_Init1(8);/ 日 dat=ri>>4 ;WritD(table0dat);dat

39、=ri&0x0f;WritD(table0dat);LCD_Init1(0x0c);/ 星期WritD(table0xingqi);dat=shi>>4 ;display2(dat,0x80);dat=shi&0x0f;display2(dat,0x40);dat=fen>>4 ; display2(dat,0x10); dat=fen&0x0f;display2(dat,0x08);dat=miao>>4 ; display2(dat,0x02); dat=miao&0x0f; display2(dat,0x01);LCD_

40、Init2(0);/ 时 dat=shi>>4 ;WritD(table0dat);dat=shi&0x0f;WritD(table0dat);LCD_Init2(3);/ 分 dat=fen>>4 ;WritD(table0dat);dat=fen&0x0f;WritD(table0dat);LCD_Init2(6);/ 秒 dat=miao>>4 ;WritD(table0dat);dat=miao&0x0f;WritD(table0dat);LCD_Init2(0x0b);/ 时 alarm dat=shialarm>&g

41、t;4 ;WritD(table0dat);dat=shialarm&0x0f;WritD(table0dat);LCD_Init2(0x0e);/ 分 alarm dat=fenalarm>>4 ;WritD(table0dat);dat=fenalarm&0x0f;WritD(table0dat);void xianshi1()uchar dat; dat=shi>>4;display2(dat,0x80);dat=shi&0x0f;display2(dat,0x40);dat=fen>>4 ;display2(dat,0x10)

42、;dat=fen&0x0f;display2(dat,0x08);dat=miao>>4 ; display2(dat,0x02); dat=miao&0x0f; display2(dat,0x01);2) D/A 转换#include "SST89x5x4.H"#include <INTRINS.H>#include "absacc.h"#include "./library/lcd.h"#include "./library/keyscan.h"#include &quo

43、t;./library/led.h"#include <math.h>#define uchar unsigned char #define uint unsigned intsbit SCLK=P1A2;sbit DIO=P 1八3;sbit DACS=P 1八5;void Delay_us(int t) while(t->=0);void Delay_ms1(int t) int j;while(t->=0) for(j=0;j<=1000;j-);/函数功能描述:驱动TLC5615开始DA转换/dat 为被转换的数字量 void tlc5615(u

44、int dat) uchar x;DACS=1;SCLK=0;Delay_us(100);DIO=0;DACS=O;/片选DA芯片dat=dat<<6; /虽然说输入是16位数据,但只有10为有效,DAC 寄存器是 1O 位for(x=0;x<12;x+)/ 串行发送DIO=dat&0x8000;SCLK= 1 ;/模拟时钟信号dat=dat<<1;SCLK=0;DACS=1;/ CS的上升沿和下降沿只有在elk为低的时候才有效/ 产生一个方波波形 void main(void) uint dat=0x0000; float dat1=0;uint fla

45、g=0; uchar key; LCD_Init();LCD_setcursol(0,0);选择 1 为方波LCD_puts("1 square"); /LCD_setcursol(0,1);选择 2 为锯齿波LCD_puts("2 sawtooth"); / while(1) key=GetChar(); if(key='1'|key='2'|key='3'|key='4')break;LCD_clear(); while(1) if(key='1')/ 方波LCD_set

46、cursol(0,0);LCD_puts("square"); tlc5615(0);Delay_us(15000); tlc5615(512);Delay_us(15000);if(key='2')/ 锯齿波LCD_setcursol(0,0);LCD_puts("sawtooth"); if(dat<512) dat=dat+10;else dat=0; tlc5615(dat);/Delay_us(5);if(key='3')/ 三角波LCD_setcursol(0,0);LCD_puts("SANJ

47、IAOBO"); if(flag=0) if(dat<512) dat=dat+10; tlc5615(dat); else flag=1; if(flag=1) if(dat>0) dat=dat-10; else flag=0; tlc5615(dat);if(key='4')/ 正弦波LCD_setcursol(0,0); LCD_puts("sin"); if(dat1<2000000) / dat1=dat1+0.1; /先送入低电平 延时一定时间 再送入高电平锯齿波峰值设为 512步进用阶梯状曲线拟合斜线锯齿波峰值设为

48、 512 步进用阶梯状曲线拟合斜线锯齿波峰值设为 512 步进用阶梯状曲线拟合斜线tlc5615(100+100*sin(dat1); Delay_us(5); if(GetKey()!=0xff)break;第 27 页3) A/D 转换uint filter_average(void); uint filter_midia(void);uint filter_slide(uint dat); void get_N_data(); void display(uint dat); void set_filter();void main() uchar i; uint dat; get_N_da

49、ta();Key_Init();while(1)keyValue=GetScanKey(); if(keyValue=0) set_filter();if(mode=1) / 平均值滤波 dat=filter_average(); get_N_data(); *led_wei=0x01; *led_duan=num_table1; Delay_ms(5);中值滤波else if(mode=2) / dat=filter_midia(); get_N_data(); *led_wei=0x01; *led_duan=num_table2; Delay_ms(5);/ 滑动滤波elsedat=fi

50、lter_slide(adc_1549(); *led_wei=0x01; *led_duan=num_table3; Delay_ms(5);for(i=0;i<cycle;i+)display(dat);/ 本函数用于预先采集数据void Before_Once_AD(void)uchar i;ADCLK=0;ADOUT=0;ADCS=O; / 开启控制电路,使能 DATA OU和I/O CLOCKfor(i=1;i<=10;i+)ADCLK=1;_nop_();ADCLK=O;_nop_();ADCS=1;/ 关闭控制电路Delay_us(22);/ 两次转换间隔大于 21us/ 本函数用于采集 adc 数据uint adc_1549(void)uint data_out=O; uchar i;ADCLK=O;ADOUT=O;ADCS = 1;_nop_();ADCS=0; /开启控制电路,使能 DATA OU和I/O CLOCK for(i=1;i<=1O;i+) / 给一个脉冲ADCLK=1;data_out<<=1;if(ADOUT) data_out|=0x01

温馨提示

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

评论

0/150

提交评论