您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 通信系统工程实践报告
1通信系统工程实践报告姓名:学号:学院:信息学院专业:通信工程指导老师:时间:2015年12月22日2一、创建一个新的工程1.Project→ProjectWizard…→点击下一步→选择芯片→选择Toolsuite并确保没有打叉,设置储存位置→点击下一步→创建新的工程文件,选择一个文件夹,确定后即可在这个文件家里找到自己创建的工程→添加文件或稍后创建文件后添加→完成。2.File→New(或点击快捷栏NewFile图标)→无论是.h还是.c文件,编辑完成后保存,保存时即可选择保存为.h还是.c→往文件夹中添加刚刚保存的.h、.c文件即可二、串口通信实验:1)步骤1、将IDE3、Explorer16主板、音频子板、音频线、扩音器、电脑连接好,打开主板电源;2、打开MPLAB,点击File→OpenWorkspace→DTMF_710A_ASM_REV-OK→dtmf_gen.mcw3、此时,界面将出现层层叠叠的许多窗口,现在,点击Window→TileHorizontally使各窗口水平排列或点击Window→TileVertically使各窗口垂直排列;4、点击Programmer→SelectProgrammer→MPLABICD3;5、点击Project→BuildAll或点击快捷菜单栏中的BuildAll按钮,如果出现语言工具选择对话框,则一律选择上方的Usethis;6、点击Programmer→Program,开始烧录程序;7、打开串口调试助手,选择电脑此时的串口(打开设备管理器即可看到是哪一个COM口;波特率选择19200;38、在输入框中输入#*012~9字符,点击手动发送,则看到界面显示了输入的内容,主板上的显示频同样显示了输入的内容,同时听到拨号音。9、将自动发送打钩,串口调试助手将自动循环发送输入的内容。减小自动发送周期,原本清晰连续的拨号音将变快,继续减小周期,将变成不断地噪音;2)问题发现1.BuilAll失败。2.通过实验发现,每次只能返回输入内容的前8位。3.在在自己的电脑上安装MPLAB后打不开工作区。3)问题解决1.对于BuildAll失败:点击Project→SelectLanguageToolLocation→MicrochipC30Toolsuite。2.对于只返回前8位:将串口调试助手的数据位由8位改至10位依然只返回前8位而不是前10位。再改为6位时,只返回前6位。由此可知,仅返回8位不仅和串口调试助手这款软件有关,还与实验程序有关,由于能力有限,我没有找到具体原因。3.对于打不开工作区文件,检查是否安装mplabc30-v3_31-windows-installer.exe,检查安装路径是否正确,检查工作区文件路径是否含有中文等或违规字符,经检查,问题出在我将工作区文件放在了一个中文名文件夹下,导致软件不能识别,修改后顺利打开。三、MPLAB使用心得1.程序#Include中modems.h在file窗口中未找到,这时可以在文件夹中搜索2.修改字体、字形、大小:Eidt→Properties...→Text→SelectFont→在这个窗口中,即可修改字体等参数,选择合适的字大小能方便阅读程序。其实Eidt→Properties...有更多功能,现例举如下:3、在CFileTypes选项卡中,选中Linenumber,可以显示代码行序号,方便查看;4、在CFileTypes选项卡中,取消Doubleclicktogglesbreakpoint选项,可以取消双击鼠标设置断点,代替为双击选中选取单词,再次双击选取整行;5、在CFileTypes选项卡中,选中EnableCodeFloding选项,可以实现代码折叠功能;6、在Toolstips选项卡中,选中AutoComplete下面的几个选项,可以在输入源代码的时候自动提示函数集结构体。7、选中usetabeddwindow,实现可使打开地多个源文件,显示在一个标签栏上,方便源文件切换。8、Window中TileHorizontally/Vertically可以使窗口水平/垂直排列,方便浏览。效果如下:4四、dsPIC33FDemoforExplorer16Board程序理解总体理解:程序始终在执行hours、minutes、seconds的加法工作,由hexdec.c程序提取出时分秒的十位数和个位数,再由一些汇编语言结合LATD、TRISA等寄存器使LCD显示数字。本程序选择了带PLL的在XT晶振模式下的主振荡器,即使用了内置8MHz的FRC震荡器,分频后产生的FOSC为32.4MHz。由此获得了200us、1ms、2ms、5ms、15ms以及1s的延时。通过延时使得时分秒间隔各自所需延时加一,提取了十位数和个位数后再显示到了LCD屏上。于是实现了实时时钟功能。以下为详细程序理解(粗体为源程序,其余为我的理解):_FOSCSEL(FNOSC_PRIPLL);_FOSC(FCKSM_CSDCMD&OSCIOFNC_OFF&POSCMD_XT);_FWDT(FWDTEN_OFF);在p33FJ256GP710A.h中可查到如下定义:#defineFNOSC_PRIPLL0xFFFB转化为2进制:1111111111111011,查手册知选用带PLL的主(XT、HS或EC)振荡器所以FNOSC_PRIPLL为带PLL的主(XT、HS或EC)振荡器#defineFCKSM_CSDCMD0xFFBF转化为二进制:111111111011111,查手册知:FCKSM_CSDCMD为禁止时钟切换,禁止故障保护时钟监视器#defineOSCIOFNC_OFF0xFFFF转化为二进制:1111111111111111查手册知OSCIOFNC_OFF表示SC2为时钟输出#definePOSCMD_XT0xFFFD转化为二进制:1111111111111101查手册知POSCMD_XT为XT晶振模式#defineFWDTEN_OFF0xFF7F转化为二进制:1111111101111111查手册知FWDTEN_OFF即为通过用户软件使能/禁止看门狗定时器(可通过清零RCON寄存器中的SWDTEN位来禁止LPRC)于是这三条语句实现的功能是:选用带PLL的主(XT、HS或EC)振荡器,禁止时钟切换,禁止故障保护时钟监视器,SC2为时钟输出,XT晶振模式,通过用户软件使能/禁止看门狗定时器(可通过清零RCON寄存器中的SWDTEN位来禁止LPRC)PLLFBD=0x00A0;//给PLL寄存器写入10100000CLKDIV=0x0048;//给ClDDIV寄存器写入1001000查手册中PLLFBD寄存器表以及CLKDIV表可知:PLLFBD(PLL反馈分频比寄存器)=0x00A0;//10100000162bit15-9未实现:读为0bit8-0PLLDIV8:0:PLL反馈分频比位(也表示为“M”,PLL倍频比)010100000=162;CLKDIV(时钟分频比寄存器)=0x0048;//1001000bit15ROI:中断恢复位0=中断对DOZEN位没有影响bit14-12DOZE2:0:处理器时钟分频比选择位000=FCY/1bit11DOZEN:打盹模式使能位0=处理器时钟/外设时钟频率比强制为1:1bit10-8FRCDIV2:0:内部快速RC振荡器后分频比位5000=FRC被1分频(默认)bit7-6PLLPOST1:0:PLLVCO输出分频比选择位(也表示为“N2”,PLL后分频比)01=输出/4(默认)bit5未实现:读为0bit4-0PLLPRE4:0:PLL相位检测器输入分频比位(也表示为“N1”,PLL预分频比)1000=输入/10由公式可知FOSC=8*(162/(10*4))=32.4MHz由此可知FCY=FOSC/2=16.2MIPSLATA=0xFF00;将发光二极管(d3-d10/ra0-ra7)低驱动状态TRISA=0xFF00;集LED引脚(d3-d10/ra0-ra7)输出home_clr();调用函数lcd_cmd(0x01)TRISD&=0xFF00;确保RD0-RD7输出DATA&=0xFF00;准备RD0-RD7DATA|=cmd;lcd的命令字符为0x01RW=0;确保RW是0RS=0;E=1;切换线路EDelay(Delay_5mS_Cnt);延时5毫秒puts_lcd((char*)&mytext[0],sizeof(mytext)-1);LCD第一行显示xxxIC33FDemo;line_2();puts_lcd((char*)&mytext1[0],sizeof(mytext1)-1);LCD第二行显示PressS3tocont;当然如果想要显示其他的信息,只要将之前定义的数组constcharmytext[]=xxxIC33FDemo;constcharmytext1[]=PressS3tocont;中的内容更改为想要的的即可。如将”xxxIC33F”改为“HelloWorld”,则将显示“HelloWorld”。注意不能改为中文,否则出现乱码,因为ASCII表中没有中文。while(PORTDbits.RD6)当PORTDbits.RD6=1即当s3未按下的时候,程序在这里死循环,显示屏上只显示”presss3tostart”的欢迎语句。当s3按下,PORTDbits.RD6=0,跳出循环,执行下面的语句。Init_Timer1();在init_timer11中可找到函数定义:voidInit_Timer1(void){intcurrent_cpu_ipl;声明临时变量存储CPUIPLT1CON=0;确保定时器1处于复位状态IFS0bits.T1IF=0;重置定时器1中断标志6IPC0bits.T1IP=4;设置定时器1中断优先级为4IEC0bits.T1IE=1;启用定时器1中断PR1=0x8000;设置定时器1周期寄存器T1CONbits.TCS=1;选择外部定时器时钟chara,b,c,*p;a=2;b=0x46;c=0x57;p=(char*)&OSCCON;以下程序使用32KHz振荡器,低字节解锁顺序并使用LP振荡器asmvolatile(mov.b%1,[%0]\nmov.b%2,[%0]\nmov.b%3,[%0]\n:/*nooutputs*/:r(p),r(b),r(c),r(a));以下程序执行解锁顺序后重新存储CPUIPL值T1CONbits.TON=1;启用定时器1和开始计数#ifSLEEP==1while(TMR12);#endif如果主循环将进入休眠模式,则在这里等待振荡器开始,定时器开始计数以上执行后禁用中断解锁序列home_clr();再次调用函数lcd_cmd(0x01);voidlcd_cmd(charcmd){TRISD&=0xFF00;确保RD0-RD7输出DATA&=0xFF00;准备RD0-RD7DATA|=cmd;lcd的命令字符为0x01RW=0;确保RW是0RS=0;E=1;切换线路EDelay(Delay_5mS_Cnt);延时5毫秒}puts_lcd((char*)&time_msg[0],sizeof(time_msg)-1);LCD第一行显示Time00:00:00;line_2();puts_lcd((char*)&adc_msg1[0],sizeof(adc_msg1)-1);LCD第二行显示RP5=0.00VdcInit_ADC();初始化ADC程序接下来进入无限循环while(1){7if(rtc_lcd_update){hexdec(hours);Update_LCD();rtc_lcd_update=0;}我认为程序的核心函数是以下函数voidUpdate_LCD(void){hoursLCD行与列的光标位置设置如下home_it();cursor_right();cursor_rig
本文标题:通信系统工程实践报告
链接地址:https://www.777doc.com/doc-2006843 .html