打印
[PIC®/AVR®/dsPIC®产品]

关于pic16f676的模拟串口

[复制链接]
3360|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火山口的绿荫|  楼主 | 2013-11-12 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在PC端用串口调试助手收到的是错误的,比如我发01010101,接收到了就是00 00 00 00 ,就是有几个1就收到几组的00,我用内部晶振,波特率是9600的。程序如下:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define TXD RC4
__CONFIG(0x184);  //配置位
void delay(uint x)  //x等于多少就是多少ms
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=110;b>0;b--);
}
void init()
{
        TRISC=0;
        PORTC=0;
}
void send(uchar num)
{        int i;
        TXD=0;
        delay(104);//98有一位
        for(i=0;i<8;i++)
        {         TXD=num&0x01;
                delay(104);
                num=num>>1;
        }
        TXD=1;//发送校验位
        delay(104);
}
void main()
{
        init();
        while(1)
        {       
                send(0x55);
        }
}
我只要发送出来数据就可以了,但就是不行,请指导
沙发
ZG11211| | 2013-11-12 19:48 | 只看该作者
这个延时量不知道通讯频率有没有100HZ.

使用特权

评论回复
板凳
Dongfangyuxiao| | 2013-11-12 19:51 | 只看该作者
请用定时器定时发送,9600bps用晶振可靠些。

使用特权

评论回复
地板
火山口的绿荫|  楼主 | 2013-11-12 20:17 | 只看该作者
ZG11211 发表于 2013-11-12 19:48
这个延时量不知道通讯频率有没有100HZ.

额 不是1/9600=104us吗?

使用特权

评论回复
5
火山口的绿荫|  楼主 | 2013-11-12 20:18 | 只看该作者
Dongfangyuxiao 发表于 2013-11-12 19:51
请用定时器定时发送,9600bps用晶振可靠些。

用外部晶振?那用多少的比较可靠呢

使用特权

评论回复
6
火山口的绿荫|  楼主 | 2013-11-12 20:37 | 只看该作者
ZG11211 发表于 2013-11-12 19:48
这个延时量不知道通讯频率有没有100HZ.

对哦,我那是ms级的延时程序....。那如果延时1/9600=104us是没错的对吧

使用特权

评论回复
7
gegezaixiao| | 2013-11-13 09:44 | 只看该作者
看看串口协议,对着程序用示波器调试

使用特权

评论回复
8
yklstudent| | 2013-11-13 11:02 | 只看该作者
感觉这个延时函数就不会准

使用特权

评论回复
9
兰天白云| | 2013-11-13 11:13 | 只看该作者
void delay(uint x)  //x等于多少就是多少ms    这可是楼主自己说的
然后楼主用
for(i=0;i<8;i++)
        {         TXD=num&0x01;
                delay(104);
                num=num>>1;
        }
104是什么概念,延时104毫秒吗????,你应该延时104微秒才对,差了1000倍

使用特权

评论回复
10
火山口的绿荫|  楼主 | 2013-11-13 13:21 | 只看该作者
兰天白云 发表于 2013-11-13 11:13
void delay(uint x)  //x等于多少就是多少ms    这可是楼主自己说的
然后楼主用
for(i=0;i>1;

换了定时器的了,出不来..
//初始化函数
void init()
{
        TRISC=0;
        PORTC=0;
        INTCON=0x80;
        OPTION_REG=0x08;//不分频
}
void chuansend(uchar num)
{
        uchar i;
        RC1=0;
        T0IE=1;//定时器使能       
        TXD=0;
        TMR0=0x98;//初值//预值为256-104=152十六进制98
        T0IF=0;
        while(!T0IF);                               
        for(i=0;i<8;i++)
        {        
                TXD=num&0x01;
                TMR0=0x98;
                T0IF=0;
                while(!T0IF);
                num=num>>1;
        }
       
        TXD=1;//发送校验位
        TMR0=0x98;
        T0IF=0;       
        while(!T0IF);
        T0IE=0;//关闭定时器
}
这样还是出不来,求指教

使用特权

评论回复
11
yklstudent| | 2013-11-13 15:45 | 只看该作者
void Soft_Usart_SendByte(INT8U ucData)
{
INT8U tmpI;
Usart_Tx_Port = 1;
Usart_Tx_Port = 0;
for(tmpI=0; tmpI<8; tmpI++)
{
Soft_DelayMs(1);
Usart_Tx_Port = ((ucData>>tmpI)&0x01)?1:0;
}
Soft_DelayMs(1);
Usart_Tx_Port = 1;
Soft_DelayMs(2);
}

void Soft_DelayMs(INT16U ucTimeOut)
{
TMR2IF = 0;
do
{
if(TMR2IF == 1)
{
TMR2IF = 0;
ucTimeOut--;
}
}while(ucTimeOut);
}

void Init_Timer2(void)
{
T2CON = 0b00000110; //T2ON=1, 1:16
PR2 = BIT_TIME
TMR2 = 0x00;
TMR2IP = 0;
TMR2IF = 0;
}

#define BIT_TIME (INT8U)(XTAL / BAUD)

#ifndef XTAL
#define XTAL (8000000UL/4/16)
#endif

#ifndef BAUD
#define BAUD (9600UL)
#endif

#define Usart_Tx_Port PORTDbits.RD0
#define Usart_Tx_DDR TRISDbits.TRISD0
#define Usart_Rx_Port PORTDbits.RD1
#define Usart_Rx_DDR TRISDbits.TRISD1

使用特权

评论回复
12
yklstudent| | 2013-11-13 15:47 | 只看该作者
以上代码 楼主自己玩玩吧

使用特权

评论回复
13
兰天白云| | 2013-11-14 14:51 | 只看该作者
火山口的绿荫 发表于 2013-11-13 13:21
换了定时器的了,出不来..
//初始化函数
void init()

中断函数呢?

如果你实在高不定,建议你从简单开始,用NOP等进行延时,先把最基本的搞出来

使用特权

评论回复
14
火山口的绿荫|  楼主 | 2013-11-15 18:09 | 只看该作者
yklstudent 发表于 2013-11-13 15:47
以上代码 楼主自己玩玩吧

那个定时搞定了,换外部晶振比较好。
现在出现一个错误"Internal error - no stack allocated to function"?不知道怎么办呀

使用特权

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

本版积分规则

4

主题

16

帖子

0

粉丝