完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
大家好,我想通过上位机控制PORTC端口,我发送0x00-0x0F之间的字符可以控制,但发送如0x10-0x1F之间单片机不相符,这是为什么请大家详解下。
我就是想通过接收字符串第一个字节做判断。 if(RCIE && RCIF) { RCIE=0; if(j<2){ R[j++]=RCREG; } if(R[0]==0x10) //if(R[0]==0x00) { flag=1; } |
|
相关推荐
8个回答
|
|
|
|
|
|
是不是格式哪里问题
|
|
|
|
附上详细代码,帮忙看下,谢谢!!
#include #include __CONFIG(0xf73a); #define INT8U unsigned char #define INT16U unsigned int #define _XTRL_FREQ 1000000UL const INT8U SEG_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; volatile INT8U Display_Buffer[]={0,0,0,10,0,0,0,10}; INT8U R[5]; unsigned char disp_buff[20]; bit flag; //----------------------------------------------------------------- // 延时us //----------------------------------------------------------------- void delay(void) { INT8U k; for(k=10;k<100;k++); } //----------------------------------------------------------------- //延时ms //----------------------------------------------------------------- void delay_ms(INT16U setval) { INT16U a,b; for(a=0;a } //----------------------------------------------------------------- // 串口初始化 //----------------------------------------------------------------- void Serial_port_init() { SYNC=0; //选择异步通信模式 BRGH=1; //选择高速波特率发生模式 TXEN=1; //允许发送数据 SPBRG=_XTRL_FREQ/16/9600-1; //设置波特率为9600 SPEN=1; //串行通信端口打开 CREN=1; //使能连续接收串口数据 /* SPBRG=0X19; // 设置波特率为9600BPS TXSTA=0X24; // 使能串口发送,选择高速波特率 RCSTA=0X90; // 使能串口工作,连续接收 RCIE=0X1; // 使能接收中断 */ } void SendOneByte(INT8U c) { TXREG = c; while (TRMT==0); //判断是否TSR发送完毕,未完等待。 } //----------------------------------------------------------------- // A/D转换 //----------------------------------------------------------------- void ADC_Converter(INT8U Channel) { CHS2=Channel>>2; CHS1=Channel>>1; CHS0=Channel; ADGO=0x01; //开始AD转换 while(ADGO); //是否转换完毕,GO=0转换完毕 int result=(int)((ADRESL+(ADRESH<<8))*500.0/1023.0); if(2==Channel) { Display_Buffer[0]=result/100; Display_Buffer[1]=result/10%10; Display_Buffer[2]=result%10; } else if(3==Channel) { Display_Buffer[4]=result/100; Display_Buffer[5]=result/10%10; Display_Buffer[6]=result%10; } } void main() { TRISB=TRISD=0x00; PORTB=PORTD=0x00; TRISC=0xC0; PORTC=0xFF; Serial_port_init(); PCFG3=0;PCFG2=0;PCFG1=1;PCFG0=0; ADCS1=0;ADCS0=1; ADFM=1; ADON=1; delay(); PSA=0; PS2=0;PS1=PS0=1; TMR0=(INT8U)(256-_XTRL_FREQ/4/16*0.004); T0IF=0; T0CS=0; T0IE=1; GIE=1; PEIE=0X1; // 使能外部中断 while(1) { if(flag) { flag=0; SendOneByte('c'); } } } void interrupt TMR0_ISR() { static INT8U i=0; INT16U j = 0; if(T0IF) { PORTD=0x00; PORTB=SEG_CODE[Display_Buffer[i]]; PORTD=1< if(0==i ||4==i)RB7=0; i=(i+1)&0x07; TMR0=(INT8U)(256-_XTRL_FREQ/4/16*0.004); T0IF=0; } if(RCIE && RCIF) { RCIE=0; R[j]=RCREG; j++; if(j>2)j=0; if(R[0]=0x10){ flag=1; } } RCIE=1; } |
|
|
|
#include
#include __CONFIG(0xf73a); #define INT8U unsigned char #define INT16U unsigned int #define _XTRL_FREQ 1000000UL const INT8U SEG_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; volatile INT8U Display_Buffer[]={0,0,0,10,0,0,0,10}; INT8U R[5]; unsigned char disp_buff[20]; bit flag; //----------------------------------------------------------------- // 延时us //----------------------------------------------------------------- void delay(void) { INT8U k; for(k=10;k<100;k++); } //----------------------------------------------------------------- //延时ms //----------------------------------------------------------------- void delay_ms(INT16U setval) { INT16U a,b; for(a=0;a } //----------------------------------------------------------------- // 串口初始化 //----------------------------------------------------------------- void Serial_port_init() { SYNC=0; //选择异步通信模式 BRGH=1; //选择高速波特率发生模式 TXEN=1; //允许发送数据 SPBRG=_XTRL_FREQ/16/9600-1; //设置波特率为9600 SPEN=1; //串行通信端口打开 CREN=1; //使能连续接收串口数据 /* SPBRG=0X19; // 设置波特率为9600BPS TXSTA=0X24; // 使能串口发送,选择高速波特率 RCSTA=0X90; // 使能串口工作,连续接收 RCIE=0X1; // 使能接收中断 */ } void SendOneByte(INT8U c) { TXREG = c; while (TRMT==0); //判断是否TSR发送完毕,未完等待。 } //----------------------------------------------------------------- // A/D转换 //----------------------------------------------------------------- void ADC_Converter(INT8U Channel) { CHS2=Channel>>2; CHS1=Channel>>1; CHS0=Channel; ADGO=0x01; //开始AD转换 while(ADGO); //是否转换完毕,GO=0转换完毕 int result=(int)((ADRESL+(ADRESH<<8))*500.0/1023.0); if(2==Channel) { Display_Buffer[0]=result/100; Display_Buffer[1]=result/10%10; Display_Buffer[2]=result%10; } else if(3==Channel) { Display_Buffer[4]=result/100; Display_Buffer[5]=result/10%10; Display_Buffer[6]=result%10; } } void main() { TRISB=TRISD=0x00; PORTB=PORTD=0x00; TRISC=0xC0; PORTC=0xFF; Serial_port_init(); PCFG3=0;PCFG2=0;PCFG1=1;PCFG0=0; ADCS1=0;ADCS0=1; ADFM=1; ADON=1; delay(); PSA=0; PS2=0;PS1=PS0=1; TMR0=(INT8U)(256-_XTRL_FREQ/4/16*0.004); T0IF=0; T0CS=0; T0IE=1; GIE=1; PEIE=0X1; // 使能外部中断 while(1) { if(flag) { flag=0; SendOneByte('c'); } } } void interrupt TMR0_ISR() { static INT8U i=0; INT16U j = 0; if(T0IF) { PORTD=0x00; PORTB=SEG_CODE[Display_Buffer[i]]; PORTD=1< if(0==i ||4==i)RB7=0; i=(i+1)&0x07; TMR0=(INT8U)(256-_XTRL_FREQ/4/16*0.004); T0IF=0; } if(RCIE && RCIF) { RCIE=0; R[j]=RCREG; j++; if(j>2)j=0; if(R[0]=0x10){ flag=1; } } RCIE=1; } |
|
|
|
附上详细代码,帮忙看下,谢谢!
#include #include __CONFIG(0xf73a); #define INT8U unsigned char #define INT16U unsigned int #define _XTRL_FREQ 1000000UL const INT8U SEG_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; volatile INT8U Display_Buffer[]={0,0,0,10,0,0,0,10}; INT8U R[5]; unsigned char disp_buff[20]; bit flag; //----------------------------------------------------------------- // 延时us //----------------------------------------------------------------- void delay(void) { INT8U k; for(k=10;k<100;k++); } //----------------------------------------------------------------- //延时ms //----------------------------------------------------------------- void delay_ms(INT16U setval) { INT16U a,b; for(a=0;a } //----------------------------------------------------------------- // 串口初始化 //----------------------------------------------------------------- void Serial_port_init() { SYNC=0; //选择异步通信模式 BRGH=1; //选择高速波特率发生模式 TXEN=1; //允许发送数据 SPBRG=_XTRL_FREQ/16/9600-1; //设置波特率为9600 SPEN=1; //串行通信端口打开 CREN=1; //使能连续接收串口数据 /* SPBRG=0X19; // 设置波特率为9600BPS TXSTA=0X24; // 使能串口发送,选择高速波特率 RCSTA=0X90; // 使能串口工作,连续接收 RCIE=0X1; // 使能接收中断 */ } void SendOneByte(INT8U c) { TXREG = c; while (TRMT==0); //判断是否TSR发送完毕,未完等待。 } //----------------------------------------------------------------- // A/D转换 //----------------------------------------------------------------- void ADC_Converter(INT8U Channel) { CHS2=Channel>>2; CHS1=Channel>>1; CHS0=Channel; ADGO=0x01; //开始AD转换 while(ADGO); //是否转换完毕,GO=0转换完毕 int result=(int)((ADRESL+(ADRESH<<8))*500.0/1023.0); if(2==Channel) { Display_Buffer[0]=result/100; Display_Buffer[1]=result/10%10; Display_Buffer[2]=result%10; } else if(3==Channel) { Display_Buffer[4]=result/100; Display_Buffer[5]=result/10%10; Display_Buffer[6]=result%10; } } void main() { TRISB=TRISD=0x00; PORTB=PORTD=0x00; TRISC=0xC0; PORTC=0xFF; Serial_port_init(); PCFG3=0;PCFG2=0;PCFG1=1;PCFG0=0; ADCS1=0;ADCS0=1; ADFM=1; ADON=1; delay(); PSA=0; PS2=0;PS1=PS0=1; TMR0=(INT8U)(256-_XTRL_FREQ/4/16*0.004); T0IF=0; T0CS=0; T0IE=1; GIE=1; PEIE=0X1; // 使能外部中断 while(1) { if(flag) { flag=0; SendOneByte('c'); } } } void interrupt TMR0_ISR() { static INT8U i=0; INT16U j = 0; if(T0IF) { PORTD=0x00; PORTB=SEG_CODE[Display_Buffer[i]]; PORTD=1< if(0==i ||4==i)RB7=0; i=(i+1)&0x07; TMR0=(INT8U)(256-_XTRL_FREQ/4/16*0.004); T0IF=0; } if(RCIE && RCIF) { RCIE=0; R[j]=RCREG; j++; if(j>2)j=0; if(R[0]=0x10){ flag=1; } } RCIE=1; } |
|
|
|
|
|
|
|
|
|
|
|
不要用这么老的型号了吧
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2084 浏览 1 评论
3629 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2336 浏览 2 评论
2763 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4027 浏览 5 评论
976浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6362浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 08:04 , Processed in 0.722691 second(s), Total 100, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号