打印

PIC16F1933怎样通过串口发送数据

[复制链接]
501|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
supernan|  楼主 | 2021-1-18 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用单片机PIC16F1933的内部4M Hz振荡,想通过单片机的串口脚TX发送数据出去

使用特权

评论回复
沙发
gongche| | 2021-1-18 21:57 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
supernan|  楼主 | 2021-1-18 21:59 | 只看该作者
程序如下:
[size=13.3333px]//PIC16F1933无外部晶振,使用内部4M振荡
[size=13.3333px]//RC6做TX,  RC7做RX
[size=13.3333px]#include <htc.h>

[size=13.3333px]  //配置字1
[size=13.3333px]  __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_ON & CPD_ON & BOREN_ON &
[size=13.3333px]      CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);

[size=13.3333px]  //配置字2
[size=13.3333px]  __CONFIG(WRT_ALL & VCAPEN_OFF & PLLEN_OFF & STVREN_ON & BORV_25 & LVP_ON);

[size=13.3333px]  typedef unsigned char UCHAR;
[size=13.3333px]  typedef unsigned int UINT;
[size=13.3333px]volatile UCHAR cRC_Dat[30];

[size=13.3333px]void PortInit1933(void);
[size=13.3333px]void UARTinit(void);
[size=13.3333px]void DLYxmS(UCHAR ci);
[size=13.3333px]void DLYx10mS(void);

[size=13.3333px]  void PortInit1933(void)
[size=13.3333px]  {
[size=13.3333px]   ANSELA=0x0;
[size=13.3333px]   SRCON0=0x0;
[size=13.3333px]   TRISA=0x8;     //RA4接Busy输出,RA3接/strobe输入
[size=13.3333px]   LATA=0x8;      //RA4 0,RA3 1

[size=13.3333px]   ANSELB=0x0;
[size=13.3333px]   TRISB=0x3;     //RB0接<-DB6, RB1接<-DB7
[size=13.3333px]   LATB=0xc3;      //RB7,RB6是ISP引脚 RB0输入, RB1输入
[size=13.3333px]   OPTION_REG=0x0; //允许弱上拉
[size=13.3333px]   WPUB=0x3;      //RB0、RB1上拉
[size=13.3333px]   LCDCON=0x0;    //禁止LCD

[size=13.3333px]   TRISC=0xff;    //RC7-RX in,RC6-TX out, RC5~0 in  
[size=13.3333px]   LATC=0xff;     //
[size=13.3333px]  }

[size=13.3333px]  void UARTinit(void)
[size=13.3333px]  {
[size=13.3333px]   SPBRGH=0x0;
[size=13.3333px]   SPBRGL=25;     //9600bps
[size=13.3333px]   BAUDCON=0x0;   //BRG16=0
[size=13.3333px]   //bit4:SYNC 0=异步模式 ,bit3: SENDB 1=在下一次发送时发送同步间隔字符 (完成时由硬件清零)
[size=13.3333px]   //bit2:高波特率选择位,1  = 高速;;bit1:TRMT 发送移位寄存器状态位,1  = TSR 为空
[size=13.3333px]   //bit0:TX9D 发送数据的第 9 位
[size=13.3333px]   TXSTA=0xc;     //,
[size=13.3333px]   RCSTA=0x80;    //bit7:SPEN=1使能串口, bit4:CREN连续接收使能位 0  = 禁止接收器

[size=13.3333px]  }

[size=13.3333px]void DLYxmS(UCHAR ci)
[size=13.3333px]{

[size=13.3333px]UINT ix;
[size=13.3333px]for(; ci !=0; ci--)
[size=13.3333px]   {
[size=13.3333px]           for(ix=0x7fff; ix !=0; ix--)  //ix=0x145
[size=13.3333px]        {
[size=13.3333px]              asm("nop");
[size=13.3333px]        }   
[size=13.3333px]   }
[size=13.3333px]}

[size=13.3333px]void DLYx10mS(void)
[size=13.3333px]{
[size=13.3333px]UINT ix;
[size=13.3333px]for(ix=0x589; ix !=0; ix--)  //ix=0x145
[size=13.3333px]   {
[size=13.3333px]           asm("nop");
[size=13.3333px]   }
[size=13.3333px]}

[size=13.3333px]void main(void)
[size=13.3333px]{
[size=13.3333px]volatile UCHAR ci;
[size=13.3333px]OSCCON = 0x6a;    //4MHz  01101010
[size=13.3333px]do
[size=13.3333px]   {
[size=13.3333px]    asm("nop");
[size=13.3333px]    ci = OSCSTAT;   //bit 4 HFIOFR:高频内部振荡器就绪位,1  = HFINTOSC 就绪
[size=13.3333px]   }while(!(ci & 0x10));  //

[size=13.3333px]DLYx10mS();  
[size=13.3333px]PortInit1933();
[size=13.3333px]UARTinit();
[size=13.3333px]for(;;)
[size=13.3333px]   {
[size=13.3333px]    TXEN=1;
[size=13.3333px]        for(ci=0;ci<25;ci++)
[size=13.3333px]          {        
[size=13.3333px]           cRC_Dat[ci]=ci;
[size=13.3333px]           TXREG=cRC_Dat[ci];
[size=13.3333px]           
[size=13.3333px]           DLYx10mS();
[size=13.3333px]          }               
[size=13.3333px]    DLYxmS(250);
[size=13.3333px]        TXEN=0;        
[size=13.3333px]        DLYxmS(250);
[size=13.3333px]   }
[size=13.3333px]}        

[size=13.3333px]编译烧录正常,就是发不出数据

使用特权

评论回复
地板
supernan|  楼主 | 2021-1-18 22:02 | 只看该作者
在 void PortInit1933(void)函数里,将TRISC=0xff改成TRISC=0xbf后,发送出来的全是00,00

使用特权

评论回复
5
chenho| | 2021-1-18 22:03 | 只看该作者
先用MCC配置一下吧,会省很多事情。

使用特权

评论回复
6
tian111| | 2021-1-18 22:07 | 只看该作者
波特率对不对呀

使用特权

评论回复
7
juventus9554| | 2021-1-18 22:13 | 只看该作者
我改用外部晶体振荡器,还是一样。

使用特权

评论回复
8
dingy| | 2021-1-18 22:16 | 只看该作者
用示波器看晶振波形

使用特权

评论回复
9
supernan|  楼主 | 2021-1-18 22:18 | 只看该作者
一会振荡,一会不振荡

使用特权

评论回复
10
xxmmi| | 2021-1-18 22:20 | 只看该作者
应该原因是反复自动复位。

使用特权

评论回复
11
supernan|  楼主 | 2021-1-18 22:28 | 只看该作者
可是我没开看门狗啊。波特率是对的。

使用特权

评论回复
12
zyf部长| | 2021-1-18 22:30 | 只看该作者
串口不要用延时,检测发送完成状态位,让串口发送一直输出,使用sscom32.exe看输出,更改不同的波特率显示

使用特权

评论回复
13
kangzj| | 2021-1-18 22:32 | 只看该作者
即使反复自动复位也可以看到串口输出

使用特权

评论回复
14
supernan|  楼主 | 2021-1-18 22:37 | 只看该作者
发现自己犯了低级错误,复位电路电阻和电容刚好焊错位置了,焊正确就行了

使用特权

评论回复
15
llia| | 2021-1-18 22:41 | 只看该作者
那意思就是你系统根本没跑起来

使用特权

评论回复
16
supernan|  楼主 | 2021-1-18 22:43 | 只看该作者
是的

使用特权

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

本版积分规则

730

主题

10412

帖子

6

粉丝