打印

PIC单片机串口通信问题

[复制链接]
2421|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhengxinydc|  楼主 | 2015-10-17 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我是一个单片机初学者,望支持。谢谢!我的问题如下,TX-5A学习板,希望实现通过串口助手发送模拟键值给TX-5A实现当键值为0XEE时,数码管显示六个0,为0XED时显示六个1,以此类推为0X77时显示六个F,已能实现PC机串口发送和串口接收功能,在主程序里添加key_num=0X77;        也能实现数码管显示六个F。
程序如下:
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0X3B31);
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar key_num;
void init();
void disp();
void main()
{
        init();
        key_num=0X77;       
        disp();
        while(1);
}
void init()
{
        TRISD=0;
        TRISA=0;
        PORTD=0;
        PORTA=0XFF;
        TXSTA=0x24;
        RCSTA=0X90;
        SPBRG=25;
        GIE=1;
        PEIE=1;
        RCIE=1;
}
void interrupt com()
{
        if(RCIE&&RCIF)
        {
                key_num=RCREG;
                TXREG=key_num;
                while(!TRMT);
        }
}
void disp()
{
        switch(key_num)
        {
                case 0xee:PORTD=table[0];break;
                case 0X31:PORTD=table[1];break;
                case 0xeb:PORTD=table[2];break;
                case 0xe7:PORTD=table[3];break;
                case 0xde:PORTD=table[4];break;
                case 0xdd:PORTD=table[5];break;
                case 0xdb:PORTD=table[6];break;
                case 0xd7:PORTD=table[7];break;
                case 0xbe:PORTD=table[8];break;
                case 0xbd:PORTD=table[9];break;
                case 0xbb:PORTD=table[10];break;
                case 0xb7:PORTD=table[11];break;
                case 0x7e:PORTD=table[12];break;
                case 0x7d:PORTD=table[13];break;
                case 0x7b:PORTD=table[14];break;
                case 0x77:PORTD=table[15];break;

        }
}
沙发
yklstudent| | 2015-10-17 15:18 | 只看该作者
感觉说了很多,没有一句有用的
问题都不知道说下

使用特权

评论回复
板凳
zhengxinydc|  楼主 | 2015-10-17 20:22 | 只看该作者
本帖最后由 zhengxinydc 于 2015-10-17 20:49 编辑

哈哈,不好意思!有点匆忙把问题都忘了说。问题是用串口助手用十六进制发送如EE,应该在数码管上显示六个0,但就是没有显示,而PC端能接收到EE。

使用特权

评论回复
地板
poorhack| | 2015-10-17 21:30 | 只看该作者
助手上有没有选择发送hex?

使用特权

评论回复
5
zhengxinydc|  楼主 | 2015-10-17 22:15 | 只看该作者
选择了,接收和发送都选了,PC接收的是正确的。

使用特权

评论回复
6
yklstudent| | 2015-10-18 09:16 | 只看该作者
PC端发送 PC端接收
检测下你的硬件部分

使用特权

评论回复
7
zhengxinydc|  楼主 | 2015-10-18 12:43 | 只看该作者
本帖最后由 zhengxinydc 于 2015-10-18 13:48 编辑

我在主程序里给key_num赋值0x77,六个数码管都显示F,按道理硬件应该是没有问题的,我怀疑助手发给单片机的数据是不是有什么问题?或者我进行key_num=RCREG;操作是不是有什么问题?麻烦高手指点,谢谢!

使用特权

评论回复
8
shaoziyang| | 2015-10-18 14:46 | 只看该作者
接收中断里,没有清除RCIF中断标志。另外不要再中断里延时等待发送完成标志。

使用特权

评论回复
9
zhengxinydc|  楼主 | 2015-10-18 20:40 | 只看该作者
刚试了一下加上接收中断RCIF=0操作,问题没有解决;屏蔽掉while(!TRMT),问题依旧。

使用特权

评论回复
10
zhengxinydc|  楼主 | 2015-10-18 21:39 | 只看该作者
总感觉是中断函数里给key_num的赋值没有反映到key_num的全局变量里面来,不知是什么原因?

使用特权

评论回复
11
GeekyGeek| | 2015-10-19 21:03 | 只看该作者
应该是编译器优化造成的。
定义key_num 变量时在前面加上“volatile“修饰词, 应该就可以了

使用特权

评论回复
12
zhengxinydc|  楼主 | 2015-10-21 20:52 | 只看该作者
我已经试过定义key_num变量前加volatile了,问题还是没有变化。郁闷!

使用特权

评论回复
13
GeekyGeek| | 2015-10-21 21:17 | 只看该作者
zhengxinydc 发表于 2015-10-17 20:22
哈哈,不好意思!有点匆忙把问题都忘了说。问题是用串口助手用十六进制发送如EE,应该在数码管上显示六个0 ...

串口助手发送0xEE, PC端能接收到0xEE, 你是如何确认PC接收到了0xEE?  0xEE在PC端是可视字符?

使用特权

评论回复
14
GeekyGeek| | 2015-10-21 21:53 | 只看该作者
GeekyGeek 发表于 2015-10-21 21:17
串口助手发送0xEE, PC端能接收到0xEE, 你是如何确认PC接收到了0xEE?  0xEE在PC端是可视字符? ...

你应该也是让它按十六进制显示吧,不过这个问题应该还是很好Debug的,如果你有Debugger和话,设下断点,很快就能定位问题的

使用特权

评论回复
15
zhengxinydc|  楼主 | 2015-10-22 08:42 | 只看该作者
是通过助手窗口显示的字符确认的,是十六进制发送十六进制接收。

使用特权

评论回复
16
millenniumm| | 2015-10-22 09:21 | 只看该作者
disp()应该放到while(1)循环里吧

使用特权

评论回复
17
zhengxinydc|  楼主 | 2015-10-22 11:10 | 只看该作者
disp()在while(1)的循环里,我试过和disp()的位置没有关系,只要我在主程序里给key_num赋合适的值,就能在数码管上有相应的显示。

使用特权

评论回复
18
GeekyGeek| | 2015-10-22 21:16 | 只看该作者
millenniumm 发表于 2015-10-22 09:21
disp()应该放到while(1)循环里吧

正解, disp()应该放在while(1)循环里面。

使用特权

评论回复
19
zhengxinydc|  楼主 | 2015-10-23 15:25 | 只看该作者
本帖最后由 zhengxinydc 于 2015-10-23 15:28 编辑
GeekyGeek 发表于 2015-10-21 21:53
你应该也是让它按十六进制显示吧,不过这个问题应该还是很好Debug的,如果你有Debugger和话,设下断点, ...

GeekyGeek您好!今天买了一个PICkit 3,想设断点试试,但是这个断点设在哪里能看到key_num的值呢?请指导一下,谢谢!我试了几个地方都没有看到变化,key_num\RCREG\TXREG都是0x00.

使用特权

评论回复
20
zhengxinydc|  楼主 | 2015-10-23 17:00 | 只看该作者
本帖最后由 zhengxinydc 于 2015-10-23 17:01 编辑

今天买了PICkit 3,为了能在线调试配置字做了修改0x3139,编译程序后出现了一个窗口如下,不知有何用途?另外断点在哪设合适?谢谢朋友们支持!

; HI-TECH C Compiler for PIC10/12/16 MCUs V9.83
; Copyright (C) 1984-2011 HI-TECH Software
; Auto-generated runtime startup code for final link stage.
;
; Compiler options:
;
; -olesson14.cof -mlesson14.map --summary=default --output=default \
; lesson14.p1 --chip=16F877A -P --runtime=default --opt=default \
; -D__DEBUG=1 --debugger=pickit3 -g --asmlist \
; --errformat=Error   [%n] %f; %l.%c %s --msgformat=Advisory[%n] %s \
; --warnformat=Warning [%n] %f; %l.%c %s
;

processor 16F877A
global _main,start,_exit,reset_vec
fnroot _main
psect config,class=CONFIG,delta=2
psect idloc,class=IDLOC,delta=2
psect code,class=CODE,delta=2
psect powerup,class=CODE,delta=2
psect reset_vec,class=CODE,delta=2
psect maintext,class=CODE,delta=2
C set 0
Z set 2
PCL set 2
INDF set 0
STATUS equ 3
PCLATH equ 0Ah
psect eeprom_data,class=EEDATA,delta=2,space=2
psect intentry,class=CODE,delta=2
psect functab,class=CODE,delta=2
global intlevel0,intlevel1,intlevel2, intlevel3, intlevel4, intlevel5
intlevel0:
intlevel1:
intlevel2:
intlevel3:
intlevel4:
intlevel5:
psect init,class=CODE,delta=2
psect cinit,class=CODE,delta=2
psect text,class=CODE,delta=2
psect end_init,class=CODE,delta=2
psect clrtext,class=CODE,delta=2
FSR set 4
psect strings,class=CODE,delta=2,reloc=256
psect reset_vec
reset_vec:
nop ; NOP inserted due to debugger requirements
; No powerup routine
global start
; jump to start
goto start & 0x7FF | (reset_vec & not 0x7FF)

psect init
start
_exit
psect end_init
global start_initialization
ljmp start_initialization ;jump to C runtime clear & initialization
psect bank0,class=BANK0,space=1
psect bank1,class=BANK1,space=1
psect bank2,class=BANK2,space=1
psect bank3,class=BANK3,space=1
psect ram,class=RAM,space=1
psect abs1,class=ABS1,space=1
psect common,class=COMMON,space=1
psect sfr0,class=SFR0,space=1
psect sfr1,class=SFR1,space=1
psect sfr2,class=SFR2,space=1
psect sfr3,class=SFR3,space=1

end start


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

33

帖子

0

粉丝