完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
基本功能要求:
接收上位机所给的设定命令,并根据命令进行相应的操作,同时下位机将采集到的信息上传给上位机处理显示等。 具体细节设计: 由于本设计主要针对本公司的高压电源的,关于采集到的输出高压反馈值的模拟量可以利用单片机内部集成的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=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=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; } } [/td] |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2557 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2344 浏览 5 评论
3176 浏览 3 评论
2819 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2774 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
632浏览 1评论
878浏览 0评论
993浏览 0评论
643浏览 0评论
470浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 00:02 , Processed in 1.181544 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号