PIC16F1824代码.doc_第1页
PIC16F1824代码.doc_第2页
PIC16F1824代码.doc_第3页
PIC16F1824代码.doc_第4页
PIC16F1824代码.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

数据标定下位机系统软件 V1.0main.c#include _CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);/ int DATA1002=0;/用于存储采集过来的结果long long int xishu116=0,0,0,0;/用于存储上位机发来的16个系数bit FLAG_receivefactor=0;/接收标志位,如果为一表示本次中断需要接收系数int Factor_number=-1;/系数编号,表示本次中断接收的是第几个编号的系数long long int real=0;/*串口初始化函数*/void USTRA_init()BRG16=0;/使用8位波特率发生器SPBRGL=12; /设置波特率发生寄存器的值4800SPBRGH=0;ANSA1=0;/A1引脚被配置为端口或数字特殊功能ANSA0=0;/A0引脚被配置为端口或数字特殊功能 RXDTSEL=1;/备用引脚控制寄存器0的bit7 即RA1上具有RX/DT功能TXCKSEL=1;/备用引脚控制寄存器0的bit2 即RA0上具有TX/CK功能TRISA0=0;/配置AO端口为输出TRISA1=1;/配置A1端口为输入SYNC=0;/EUSART选择异步模式工作BRGH=0;/选择低频传送TX9=0;/不发送第9位数据RX9=0;/不接收第9位数据TXEN=1;/串口发送功能打开CREN=1;/串口接收功能打开SPEN=1;/串口功能打开TXIE=0;/关闭发送中断RCIE=1;/打开接收中断/*AD转换初始化函数功能:将AD模块初始化,本函数并未将AD模块初始化为测量压力还是温度模式,选择模式在ADModel_shift()函数中完成*/void AD_init()TRISC2=1;/配置RC2为输出模式ANSC2=1;/配置RC2为模拟量模式INLVLC2=0;/配置RC2为TTL输入方式RC2=0;/配置RC2端口引脚电平小于VILADCON1=0b10010000;/选择AD转换数据输出格式为右对齐,使用FOCS/8时钟作为AD转换时钟,选择负向参考电压为VSS,正向参考电压为VDDADIF=0;/清零AD转换中断ADIE=0;/关闭AD转换中断/*函数名称:ADModel_shift(int flag)参数:标志量 int flag 0表示要将AD模块转换为测量压力模式,1表示转换为测量温度模式功能:将AD模块在测量温度和压力之间进行切换*/void ADModel_shift(int flag)if(flag=0)ADCON0=0b00011001;/打开通道6,并启用AD模块(本开发板用的是8号管脚,对应AD转换通道六)elseADCON0=0b01110101;/测温度并且使能AD模块TSEN =1;/打开温度传感器功能TSRNG=1;/温度传感器选择高电压模式FVREN=1;/启用参考电压模块/delay(1000);/模式转换完成后进行必要的延时等待,这样测量的结果才精准/*DA初始化*/void DA_init()DACCON0=0b11100000;/打开DA模块,将DA转换的结果从DACOUT管脚输出,选择VDD提供正向参考电压,选择VSS提供负向参考电压RA0=0;/配置A0端口引脚电平小于VIL/TRISA0=0;/在串口配置中本管脚已经配置为输出模式,这里可以省略/*简单的延时函数参数:int time*/void delay(int time)while(time-);/*程序总初始化函数函数名:INIT()返回值:无功能:本函数实现对程序的总初始化,包括时钟的初始化,端口的设置,串口的初始化,A/D模块的初始化*/void INIT()/*时钟初始化*/OSCCON=0b01101010;/初始化振荡器控制寄存器,选择主频4MHZ内部时钟/*串口的初始化*/USTRA_init();/执行串口初始化函数/*AD模块的初始化*/AD_init();/*DA模块的初始化*/DA_init();/不能再串口使用时使用DA,因为2者公用同一个端口/*中断的初始化*/PEIE=1;/开启外设中断GIE=1;/开启全局中断/*数据采集函数函数名:Get_data()返回值:无功能:本函数实现一次性采集100组数据,将其存储在数组DATA1002中,每组数据包含两个量:当前压力的数字量和当前温度的数字量*/void Get_data()int i=0;ADModel_shift(0);/将AD模块调整为测量压力模式delay(1000);for(i=0;i=9;i+)ADGO=1;/开始AD转换while(ADGO=1);/等待结果转换完成DATAi0=ADRESH;/将高8为结果存储在压力数据量低八位位置delay(1000);/延时等待DATAi0=DATAi08;/将压力数据量的高八位左移8位DATAi0=ADRESL;/将低8位结果存储在压力数据量低八位位置delay(1000);ADIF=0;/AD转换完成中断标志软件清零ADModel_shift(1);/将AD模块调整为测量温度模式delay(1000);for(i=0;i=9;i+)ADGO=1;/开始AD转换while(ADGO=1);/等待结果转换完成DATAi1=ADRESH;/将高8为结果存储在压力数据量低八位位置delay(1000);/延时等待DATAi1=DATAi08;/将压力数据量的高八位左移8位DATAi1=ADRESL;/将低8位结果存储在压力数据量低八位位置delay(1000);ADIF=0;/AD转换完成中断标志软件清零/*串口发送函数函数名:USTRA_Send()参数:无功能:本函数实现将AD转换完成的数据通过串口发送出去,函数执行一次,连发五个压力数据量再发五个温度数据量,开始发送时都发送一个0A01*/void USTRA_Send()int i =0;TXREG=A;/开始发送时先发送一个0A01while(TRMT=0);TXREG=1;while(TRMT=0);ADModel_shift(0);/将AD模块调整为测量压力模式delay(1000);for(i=0;i=4;i+)/连发五个压力数据量ADGO=1;/开始AD转换while(ADGO=1);/等待结果转换完成TXREG=ADRESH;while(TRMT=0);TXREG=ADRESL;while(TRMT=0);ADIF=0;/AD转换完成中断标志软件清零ADModel_shift(1);/将AD模块调整为测量温度模式delay(1000);for(i=0;i=0&j(8*i);/将新的系数重新保存在EEPROM中,大端存储TXREG=EEPROM_Read(Factor_number-1)*8+j);while(TRMT=0);real=0;/real清零flag=0;/flag清零if(Factor_number=16)/如果最后一个系数接收完毕,则将FLAG_receivefactor标志量清零FLAG_receivefactor=0;GIE=1;/打开总中断main()int i=0,j=0;long long int xishu24=0;long long long int result=0;long long int temp=0;INIT();for(i=0;i=15;i+)for(j=1;j=8;j+)xishu1i=EEPROM_Read(i*8)+j);/将系数从EEPROM中取出TXREG=xishu1i;delay(1000);if(j!=8)xishu1i=xishu1i8;TXREG=a;while(1)int TEM=0,PRESS=0;ADModel_shift(0);/将AD模块调整为测量压力模式delay(1000);ADGO=1;/开始AD转换while(ADGO=1);/等待结果转换完成PRESS=ADRESH;PRESS=TEM8;/while(TRMT=0);PRESS=PRESS+ADRESL;/while(TRMT=0);ADIF=0;/AD转换完成中断标志软件清零ADModel_shift(1);/将AD模块调整为测

温馨提示

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

评论

0/150

提交评论