基于PIC16F73的下位机串口通讯设计备忘
时间:09-13
来源:互联网
点击:
基本功能要求:
接收上位机所给的设定命令,并根据命令进行相应的操作,同时下位机将采集到的信息上传给上位机处理显示等。
具体细节设计:
由于本设计主要针对本公司的高压电源的,关于采集到的输出高压反馈值的模拟量可以利用单片机内部集成的8位AD转换模块,
而电源的设定电压采用单片机内部的PWM模块来实现8位的DA转换,
具体程序如下:(初稿)
//***********************************************************
//-------------- 源文件名为:RS232.c-----
//监控高压源71520的工作,开启高压,上位机可以设定高压值
//同时可以监控反馈高压值,采用最简通讯模式
//
//******************************************
#include
#include
__CONFIG(XT & WDTDIS& PWRTDIS & BORDIS & PROTECT );//配置字
void DELAY(int time);
void initPORTB();
void initPORTA();
void initPORTC();
void inittmr2();
void initCCP1();
//变量定义
unsigned char recdata,RX[8],i,j,k,AD_result; //0-255
unsigned char TX[8]={0x42,0x72,0x55,0x32,0x35,0x35,0x46,0x50};//BrU255FP
//int AD_result;
//------------------初始化 PORTB--------
void initPORTB()
{ TRISB=0xe0; //设置portb口高3位为输入,低5位为输出
RBIE=1; //关闭B口的中断
PORTB=0x00; //RB口先送高电平清除干扰
}
//-----------------初始化 PORTA----------
void initPORTA() //包含AD转换初始化
{ TRISA=0x3f; //设置portA口 输入
ADCON1=0x00; //A口全为AD口,RA0,1,2,3,5为模拟口,考电压VDD
ADCON0=0x85; //fosc/32,通道0-85,8D-chanl1,开启转换
ADIE=1; //允许中断
}
//------------------初始化 PORTC--------
void initPORTC() //包含波特率设置
{ TRISC=0xC0; //设置portC口状态,RC7/RX为输入
TXSTA=0XA6;
RCSTA=0XB0; //使能串口,8位连续接收,B0连续接受
PIR1=0X00; //清标志位
RCIE=1; //接受中断
TXIE=1; //发送中断
PORTC=0x00; //RC口赋初值
SPBRG=25; //9600-25(10进制)
}
//---------------初始化 tmr2------------------
void inittmr2()
{ TMR2 =0; //赋初值,
T2CON=0x72; //0x72后分频为1:8,预分频为1:16,先关闭.,31-4后分频,4预分频
// TMR2IE=1; //开/关定时器2中断,清标志位
TMR2IF=0;
TMR2ON=1; //启动定时器2
}
//---------------初始化 CCP1 ------------------
void initCCP1()
{
CCP1IF=0; //清标志位
CCP1CON=0X0c; //设置工作模式
//Pwm模式
CCP1IE=1; //关闭中断
PR2=0XFF; //定时器2的最大周期 245hZ
CCPR1L=0X0f; //预制一个数
CCPR1H=0; //,通过改变CCPR1L的值即可实现占空比的改变
}
void interrupt all_int()
{
//首先判断中断的类型,执行不同的中断子程序
//中断优先级依次为接收中断、AD转换中断、发送中断
if(RCIF&&RCIE) //判断是否是串口接收中断
{
// RB1=1;
RCIF=0;//清干扰
recdata=RCREG; // 接收数据并存储
RX[i]=recdata;
i=i+1;
}
//------AD转换中断----
if(ADIF&&ADIE)
{
ADIF=0;//清干扰
RB2=1;
k=55;
AD_result=ADRES;
ADCON0=0x85;
;
}
//-------发送中断-----
if(TXIF&&TXIE)
{
RB3=1;
TXIF=0;//清干扰
TXREG=TX[j];
j=j+1;
if(j>=8)
{j=0;}
}
}
//软件延时子程序
void DELAY(int time)
{
int x,y;
for(x=0;x=8)//全部接受完毕
{
RB1=1;
i=0;
if((RX[0]==66)&&(RX[6]==88)) //校验传输字符正确性
{
CCPR1L=(RX[3]-48)*100+(RX[4]-48)*10+(RX[5]-48);
}
ADCON0=0x85;//开启转换
}
ADCON0=0x85;//开启转换
;
;
}
}
终极版本出炉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//***********************************************************
//-------------- 源文件名为:rs232sample1.c-----
//最简单的程序框架
//RB口输出程序执行标签
//将通道0的模拟量对其进行AD转换其值送至串口输出
//将串口上位机设定的值送给PWM输出,
//******************************************
#include
#include
__CONFIG(XT & WDTDIS& PWRTDIS & BORDIS & PROTECT );//配置字
void DELAY(int time);
void initPORTB();
void initPORTA();
void initPORTC();
void inittmr2();
void initCCP1();
//变量定义
unsigned char recdata,RX[8],i,j,k,t; //0-255
unsigned char TX[8]={0x42,0x72,0x55,0x30,0x30,0x30,0x46,0x50};//BrU000FP
int AD_result;
//------------------初始化 PORTB--------
void initPORTB()
{ TRISB=0xe0; //设置portb口高3位为输入,低5位为输出
RBIE=0; //关闭B口的中断
PORTB=0x00; //RB口先送低电平清除干扰
}
//-----------------初始化 PORTA----------
void initPORTA() //包含AD转换初始化
{ TRISA=0x3f; //设置portA口 输入
ADCON1=0x00; //A口全为AD口,RA0,1,2,3,5为模拟口,考电压VDD
ADCON0=0x85; //fosc/32,通道0-85,89-chanl1,开启转换
ADIE=1; //允许中断
}
//------------------初始化 PORTC--------
void initPORTC() //包含波特率设置
{ TRISC=0xC0; //设置portC口状态,RC7/RX为输入
TXSTA=0XA6;
RCSTA=0XB0; //使能串口,8位连续接收,B0连续接受
PIR1=0X00; //
RCIE=1; //接受中断
TXIE=1; //发送中断
PORTC=0x00; //RC口赋初值
SPBRG=25; //9600-25(10进制)
}
//---------------初始化 tmr2------------------
void inittmr2()
{ TMR2 =0; //赋初值,
T2CON=0x72; //0x72后分频为1:8,预分频为1:16,先关闭.,31-4后分频,4预分频
// TMR2IE=1; //开/关定时器2中断,清标志位
TMR2IF=0;
TMR2ON=1; //启动定时器2
}
//---------------初始化 CCP1 ------------------
void initCCP1()
{
CCP1IF=0; //清标志位
CCP1CON=0X0c; //设置工作模式
//Pwm模式
CCP1IE=0; //关闭中断
PR2=0XFF; //定时器2的最大周期 245hZ
CCPR1L=0X0f; //预制一个数
CCPR1H=0; //,通过改变CCPR1L的值即可实现占空比的改变
}
void interrupt all_int()
{
//首先判断中断的类型,执行不同的中断子程序
//中断优先级依次为接收中断、AD转换中断、发送中断
if(RCIF&&RCIE) //判断是否是串口接收中断
{
// RB1=1;
RCIF=0;//清干扰
recdata=RCREG; // 接收数据并存储
RX[i]=recdata;
i=i+1;
if(i>=8)//全部接受完毕
{
RB4=1;
i=0;
if((RX[0]==66)&&(RX[6]==88)) //校验传输字符正确性
{
CCPR1L=(RX[3]-48)*100+(RX[4]-48)*10+(RX[5]-48);
if(CCPR1L==0)
{
RB4=0;
}
}
}
}
//------AD转换中断----
if(ADIF&&ADIE)
{
ADIF=0;//清干扰
RB2=1;
t=t+1;
AD_result=AD_result+ADRES;
if (t==16)
{
t=0;
AD_result=AD_result>>4;
TX[3]=(AD_result/100)+48;
TX[4]=((AD_result%100-AD_result%10)/10)+48;
TX[5]=(AD_result%10)+48;
AD_result=0;
}
ADCON0=0x85;
}
//-------发送中断-----
if(TXIF&&TXIE)
{
TXREG=TX[j];
RB3=1;
j=j+1;
if(j>=8)
{j=0;}
}
}
//软件延时子程序
void DELAY(int time)
{
int x,y;
for(x=0;x<50;x++)
{
for(y=0;y }
}
//--------------------主程序------------------------
main()
{
initPORTB(); //PORTB初始化
initPORTA(); //PORTA初始化
initPORTC(); //PORTC初始化
inittmr2();
initCCP1();
GIE=1;
PEIE=1;
AD_result=0;
while(1)
{
RB1=1;
DELAY(10);
ADCON0=0x85;
}
}
接收上位机所给的设定命令,并根据命令进行相应的操作,同时下位机将采集到的信息上传给上位机处理显示等。
具体细节设计:
由于本设计主要针对本公司的高压电源的,关于采集到的输出高压反馈值的模拟量可以利用单片机内部集成的8位AD转换模块,
而电源的设定电压采用单片机内部的PWM模块来实现8位的DA转换,
具体程序如下:(初稿)
//***********************************************************
//-------------- 源文件名为:RS232.c-----
//监控高压源71520的工作,开启高压,上位机可以设定高压值
//同时可以监控反馈高压值,采用最简通讯模式
//
//******************************************
#include
#include
__CONFIG(XT & WDTDIS& PWRTDIS & BORDIS & PROTECT );//配置字
void DELAY(int time);
void initPORTB();
void initPORTA();
void initPORTC();
void inittmr2();
void initCCP1();
//变量定义
unsigned char recdata,RX[8],i,j,k,AD_result; //0-255
unsigned char TX[8]={0x42,0x72,0x55,0x32,0x35,0x35,0x46,0x50};//BrU255FP
//int AD_result;
//------------------初始化 PORTB--------
void initPORTB()
{ TRISB=0xe0; //设置portb口高3位为输入,低5位为输出
RBIE=1; //关闭B口的中断
PORTB=0x00; //RB口先送高电平清除干扰
}
//-----------------初始化 PORTA----------
void initPORTA() //包含AD转换初始化
{ TRISA=0x3f; //设置portA口 输入
ADCON1=0x00; //A口全为AD口,RA0,1,2,3,5为模拟口,考电压VDD
ADCON0=0x85; //fosc/32,通道0-85,8D-chanl1,开启转换
ADIE=1; //允许中断
}
//------------------初始化 PORTC--------
void initPORTC() //包含波特率设置
{ TRISC=0xC0; //设置portC口状态,RC7/RX为输入
TXSTA=0XA6;
RCSTA=0XB0; //使能串口,8位连续接收,B0连续接受
PIR1=0X00; //清标志位
RCIE=1; //接受中断
TXIE=1; //发送中断
PORTC=0x00; //RC口赋初值
SPBRG=25; //9600-25(10进制)
}
//---------------初始化 tmr2------------------
void inittmr2()
{ TMR2 =0; //赋初值,
T2CON=0x72; //0x72后分频为1:8,预分频为1:16,先关闭.,31-4后分频,4预分频
// TMR2IE=1; //开/关定时器2中断,清标志位
TMR2IF=0;
TMR2ON=1; //启动定时器2
}
//---------------初始化 CCP1 ------------------
void initCCP1()
{
CCP1IF=0; //清标志位
CCP1CON=0X0c; //设置工作模式
//Pwm模式
CCP1IE=1; //关闭中断
PR2=0XFF; //定时器2的最大周期 245hZ
CCPR1L=0X0f; //预制一个数
CCPR1H=0; //,通过改变CCPR1L的值即可实现占空比的改变
}
void interrupt all_int()
{
//首先判断中断的类型,执行不同的中断子程序
//中断优先级依次为接收中断、AD转换中断、发送中断
if(RCIF&&RCIE) //判断是否是串口接收中断
{
// RB1=1;
RCIF=0;//清干扰
recdata=RCREG; // 接收数据并存储
RX[i]=recdata;
i=i+1;
}
//------AD转换中断----
if(ADIF&&ADIE)
{
ADIF=0;//清干扰
RB2=1;
k=55;
AD_result=ADRES;
ADCON0=0x85;
;
}
//-------发送中断-----
if(TXIF&&TXIE)
{
RB3=1;
TXIF=0;//清干扰
TXREG=TX[j];
j=j+1;
if(j>=8)
{j=0;}
}
}
//软件延时子程序
void DELAY(int time)
{
int x,y;
for(x=0;x=8)//全部接受完毕
{
RB1=1;
i=0;
if((RX[0]==66)&&(RX[6]==88)) //校验传输字符正确性
{
CCPR1L=(RX[3]-48)*100+(RX[4]-48)*10+(RX[5]-48);
}
ADCON0=0x85;//开启转换
}
ADCON0=0x85;//开启转换
;
;
}
}
终极版本出炉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//***********************************************************
//-------------- 源文件名为:rs232sample1.c-----
//最简单的程序框架
//RB口输出程序执行标签
//将通道0的模拟量对其进行AD转换其值送至串口输出
//将串口上位机设定的值送给PWM输出,
//******************************************
#include
#include
__CONFIG(XT & WDTDIS& PWRTDIS & BORDIS & PROTECT );//配置字
void DELAY(int time);
void initPORTB();
void initPORTA();
void initPORTC();
void inittmr2();
void initCCP1();
//变量定义
unsigned char recdata,RX[8],i,j,k,t; //0-255
unsigned char TX[8]={0x42,0x72,0x55,0x30,0x30,0x30,0x46,0x50};//BrU000FP
int AD_result;
//------------------初始化 PORTB--------
void initPORTB()
{ TRISB=0xe0; //设置portb口高3位为输入,低5位为输出
RBIE=0; //关闭B口的中断
PORTB=0x00; //RB口先送低电平清除干扰
}
//-----------------初始化 PORTA----------
void initPORTA() //包含AD转换初始化
{ TRISA=0x3f; //设置portA口 输入
ADCON1=0x00; //A口全为AD口,RA0,1,2,3,5为模拟口,考电压VDD
ADCON0=0x85; //fosc/32,通道0-85,89-chanl1,开启转换
ADIE=1; //允许中断
}
//------------------初始化 PORTC--------
void initPORTC() //包含波特率设置
{ TRISC=0xC0; //设置portC口状态,RC7/RX为输入
TXSTA=0XA6;
RCSTA=0XB0; //使能串口,8位连续接收,B0连续接受
PIR1=0X00; //
RCIE=1; //接受中断
TXIE=1; //发送中断
PORTC=0x00; //RC口赋初值
SPBRG=25; //9600-25(10进制)
}
//---------------初始化 tmr2------------------
void inittmr2()
{ TMR2 =0; //赋初值,
T2CON=0x72; //0x72后分频为1:8,预分频为1:16,先关闭.,31-4后分频,4预分频
// TMR2IE=1; //开/关定时器2中断,清标志位
TMR2IF=0;
TMR2ON=1; //启动定时器2
}
//---------------初始化 CCP1 ------------------
void initCCP1()
{
CCP1IF=0; //清标志位
CCP1CON=0X0c; //设置工作模式
//Pwm模式
CCP1IE=0; //关闭中断
PR2=0XFF; //定时器2的最大周期 245hZ
CCPR1L=0X0f; //预制一个数
CCPR1H=0; //,通过改变CCPR1L的值即可实现占空比的改变
}
void interrupt all_int()
{
//首先判断中断的类型,执行不同的中断子程序
//中断优先级依次为接收中断、AD转换中断、发送中断
if(RCIF&&RCIE) //判断是否是串口接收中断
{
// RB1=1;
RCIF=0;//清干扰
recdata=RCREG; // 接收数据并存储
RX[i]=recdata;
i=i+1;
if(i>=8)//全部接受完毕
{
RB4=1;
i=0;
if((RX[0]==66)&&(RX[6]==88)) //校验传输字符正确性
{
CCPR1L=(RX[3]-48)*100+(RX[4]-48)*10+(RX[5]-48);
if(CCPR1L==0)
{
RB4=0;
}
}
}
}
//------AD转换中断----
if(ADIF&&ADIE)
{
ADIF=0;//清干扰
RB2=1;
t=t+1;
AD_result=AD_result+ADRES;
if (t==16)
{
t=0;
AD_result=AD_result>>4;
TX[3]=(AD_result/100)+48;
TX[4]=((AD_result%100-AD_result%10)/10)+48;
TX[5]=(AD_result%10)+48;
AD_result=0;
}
ADCON0=0x85;
}
//-------发送中断-----
if(TXIF&&TXIE)
{
TXREG=TX[j];
RB3=1;
j=j+1;
if(j>=8)
{j=0;}
}
}
//软件延时子程序
void DELAY(int time)
{
int x,y;
for(x=0;x<50;x++)
{
for(y=0;y }
}
//--------------------主程序------------------------
main()
{
initPORTB(); //PORTB初始化
initPORTA(); //PORTA初始化
initPORTC(); //PORTC初始化
inittmr2();
initCCP1();
GIE=1;
PEIE=1;
AD_result=0;
while(1)
{
RB1=1;
DELAY(10);
ADCON0=0x85;
}
}
- USB接口芯片的原理及应用 (04-15)
- 基于GPRS的远程心电实时监护终端(02-10)
- 基于AVR单片机的嵌入式“瘦服务器”系统设计思想(03-11)
- 利用C8051F020的SPI接口扩展大容量数据存储器(04-10)
- 基于GPRS的油烟远程无线监控系统设计(04-17)
- 基于Microchip单片机的网络收音机方案(04-27)