PIC16f877a 串口程序问题

programmerxiaoke 2009-11-02 07:31:30
各位老师好,我是惠州的小肖。^_^平时有空就搞一下单片机。。对单片机这一块我就一菜鸟。。这不我照着李学海老师的书上我测试了一串口通信程序。李学海老师写的串口程序是用的汇编语言。。我试着把这程序用C语言改写。。可就是不能实现同样的功能(不可以进入中断程序)。。附件有ASM和C写的。ASM写的可以通过。在硬件上测试也通过了。。。C语言改写的编译通过,但硬件上测试通不过。好苦恼,几天晚上都睡不着。。试了很多次都发现不了问题,您们帮我看看好吗?(我用的是MPLAB IDE V8.10和PIC C Compiler,程序实现的的功能是通过超级终端显示键盘输入的键值)。。谢啦!!

VAL_US equ .249
VAL_MS equ .200
;***********************************
STATUS equ 3h
Z equ 2h
INTCON equ 0bh
PORTC equ 07h
TRISC equ 87h
TRISD equ 88h
PORTD equ 08h
RP0 equ 5h
PIR1 equ 0ch
PIE1 equ 8ch
RCSTA equ 18h
TXSTA equ 98h
SPBRG equ 99h
RCREG equ 1ah
TXREG equ 19h
GIE equ 7
PEIE equ 6
RCIF equ 5
RCIE equ 5
;**************************************
count equ 0x70
count_ms equ 0x71
;**************************************

ORG 0X0000
GOTO Startup
ORG 0x0004
;**************************************
BTFSS PIR1, RCIF
GOTO Err_Exit
MOVF RCREG, 0
MOVWF TXREG
Err_Exit retfie
;**************************************
Startup
bsf STATUS,RP0
clrf TRISD
bsf TRISC,6
bsf TRISC,7
movlw .12
movwf SPBRG
movlw b'00100100'
movwf TXSTA
bsf PIE1, RCIE
bcf STATUS, RP0
movlw b'10010000
movwf RCSTA
bsf INTCON,GIE
bsf INTCON, PEIE
;**************************************
main clrwdt
incf PORTD,f
call delay_ms
call delay_ms
goto main
;**************************************
delay_ms:
movlw VAL_MS
movwf count_ms
loop_ms call delay_us
decfsz count_ms,f
goto loop_ms
return
;**************************************
delay_us:
nop
movlw VAL_US
movwf count
loop_us nop
decfsz count,f
goto loop_us
return
end
;**************************************






#device PIC16F877A
#fuses NOWDT, PUT,XT, BROWNOUT, NOLVP, NOPROTECT, NOCPD, NOWRT, NODEBUG
#id CHECKSUM
#device icd=true
#include "pic16F87.h"

#use delay (clock = 4000000)
//--------------------------------------------------------------

void Initial_USART(void)
{
TRISC=0xc0;
TRISD=0;
SPBRG=0x0c;
TXSTA=0X24;
RCIE=1;
RCSTA=0X90;
GIE=1;
PEIE=1;
PORTD=0;
}


void main()
{

Initial_USART();
while(1)
{
restart_wdt();
PORTD++;
delay_ms(1000);

}

}


#INT_RDA
void serial_isr()

{
if(RCIF==1)
TXREG=RCREG;
else
TXREG=RCREG;

}















...全文
305 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰满 2010-09-13
  • 打赏
  • 举报
回复
呵呵,建议先把汇编好好看看,完全理解了,再改为c语言,你的情况有可能连中断都没有进入,看看中断是如何设置的,有可能你的中断控制寄存器设置有误,慢慢来,一步一步跟进,,要学会设置断点,查看变量和寄存器里面的值,学会利用keil来调试。。。。。。。。。。
shizhiyong001 2010-09-13
  • 打赏
  • 举报
回复
维护别人的代码需要勇气,维护自己的代码需要智慧。
s123451 2010-09-12
  • 打赏
  • 举报
回复
维护别人的代码需要勇气,维护自己的代码需要智慧。
lyh1987a 2010-09-06
  • 打赏
  • 举报
回复
无语了。。。。。。。
DISINHUI 2009-11-03
  • 打赏
  • 举报
回复
1. 汇编中断服务代码:
BTFSS PIR1, RCIF
GOTO Err_Exit
MOVF RCREG, 0
MOVWF TXREG

Err_Exit retfie
2。C中断服务代码
if(RCIF==1)
TXREG=RCREG;
else
//TXREG=RCREG;
您要仔细阅读汇编代码,领会其实际操作本质,然后在写C代码。
注意:维护别人的代码需要勇气,维护自己的代码需要智慧。
programmerxiaoke 2009-11-03
  • 打赏
  • 举报
回复
无语了。。。。。。。
lgy198612 2009-11-02
  • 打赏
  • 举报
回复
在上班,没有时间看完你的程序,太长了
贝隆 2009-11-02
  • 打赏
  • 举报
回复
学习

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧