打印

高手帮帮小弟吧!

[复制链接]
1703|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gsypuma|  楼主 | 2007-7-31 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

   我是一位在校的学生,在编写串口程序时遇到些问题,半个月也没有解决,希望大家帮助解决一下。
问题是这样:
    我要做一个pda与单片机的串口通信,pda部分是在visual studio 2005 的vb中写的,已经可以用串口调试助手于pc进行通信。
程序如下:
Public Class Form1
    Dim F As Long, T As Long, First As Long, TH0 As Byte, TL0 As Byte, i As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'SerialPort.CommPort = 1
        'SerialPort.PortOpen = True
        'SerialPort.Settings = "9600,N,8,1"

        With SerialPort
            .PortName = "COM1"
            .BaudRate = 9600
            .DataBits = 8
            .StopBits = IO.Ports.StopBits.One
            .Parity = IO.Ports.Parity.None
            '.ReadTimeout = 1000
        End With
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        F = Val(TextSend.Text)         '确定发射频率
        T = 11059200 \ (24 * F)        '计算定时器定时时间
        First = &HFFFF - T             '计算定时器初值
        TL0 = &HFF And First           '计算定时器初值低八位
        TH0 = (First - TL0) / &H100    '计算定时器初值高八位
        Dim TH0Hex
        Dim TL0Hex

        TH0Hex = Hex(TH0)   ' 返回 

        TL0Hex = Hex(TL0)   ' 返回 

        'SerialPort.PortName = 1
        SerialPort.Open()              '打开串口
        'SerialPort.BaudRate = "9600"
        'SerialPort.Parity = SerialPort.Parity.None
        'SerialPort.Open()
        'SerialPort.WriteLineTextSend.Text)
        SerialPort.Write(Val(TH0Hex))         '发送定时器初值高八位
        TextBox2.Text = TH0Hex
        SerialPort.Close()             '关闭串口
        Dim i As Integer
        For i = 0 To 10000000
        Next i
        SerialPort.Open()               '打开串口
        SerialPort.Write(Val(TL0Hex))          '发送定时器初值低八位
        TextBox2.Text = TL0Hex
        'SerialPort.WriteLine(TextSend.Text)
        SerialPort.Close()             '关闭串口 

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Application.Exit()
    End Sub
End Class
单片机部分就是要把接受到的高低八位给定时器,然后产生方波。用串口调试助手给单片机发数,已经可以工作程序如下:
#include <howevero.h>

//逻辑
#define FALSE  0
#define TRUE   1
#define H      1
#define L      0    

//管脚定义
sbit std_cnt2 = p1^2;
sbit std_cnt1 = p0^1;
sbit std_cnt0 = p0^0;
sbit std_cnt3 = p0^3;


//函数声明
void serial_init(void);//串口初始化
void serial_send(void);


//全局变量声明
unsigned int idata send_letter;
//unsigned long  data tempnumber=0;
unsigned char numberhigh,numberlow;
int i=0;
unsigned  int data temp;

/************ 主函数**************************/
void main(void)
{
    SP=0x60;
//    interupt_init();
    serial_init();
    
    std_cnt0=0;
    std_cnt1=0;
    std_cnt2=0;
    std_cnt3=0;

    while(i==0);//等待中断

    /*发射波形*/
    TH0=numberhigh; 
    TL0=numberlow;
    TF0=0;
    TR0=1;
    while(1)
    {
     while(TF0==0);
     TH0=numberhigh;
     TL0=numberlow;
     std_cnt3=!std_cnt3; 
     TF0=0;    
     TR0=1;
    }

}




/************ 串口初始化?*************************/
void serial_init()

    
    SCON=0x50;   //工作方式1,单机通讯,接收允许
    TMOD=0x21;   //方式1下波特率由SMOD和定时器1共同决定,定时器一工作在方式2下
    TR0=0;       //
    PCON=0x00;   //PCON=0x00速度不加倍
    TH1=0xFD;  TL1=0xFD;  //计数初值,晶振11.0592M,波特率9600,
    TR1=1;   //启动定时器
    ET0=0; EX0=1; ES=1;  EA=1;
    EX1=0;
    PS=1;
}

/************ 串口中断函数**************************/
void serial_receive(void) interrupt 4 using 1
{    
    
     

    RI=0;
    std_cnt3=0;                  //输出低电平(未发射方波时)
    for(temp=0;temp<2;temp++) //连续接收2个字节 
    {
    switch(temp)
    {
    case 0:numberhigh=SBUF;while(RI==0);RI=0;break;//给出定时器初值高八位,并等待下个串行中断
    case 1:numberlow=SBUF;break;                   //给出定时器初值低八位,准备跳出中断
    default:break;
    }
    }  

        RI=0;
        i++;
}
可是,把pda与单片机连接到一起时,不管pda串口发什么频率数,单片机的频率是一定的,我半个多月都没想明白,希望高手帮忙指点一下!     

相关帖子

沙发
gsypuma|  楼主 | 2007-8-1 15:38 | 只看该作者

有做过的吗?

帮看一看。

使用特权

评论回复
板凳
dyq117119| | 2007-8-3 08:05 | 只看该作者

re:

你的单片机程序能工作????有点奇怪!!!!

使用特权

评论回复
地板
gsypuma|  楼主 | 2007-8-3 14:08 | 只看该作者

用上面的程序是可以与pc通信和工作的

但是现在我改成用定时器2工作了,现在连单片机与pc通信都不可以了,太奇怪了。

使用特权

评论回复
5
oudi| | 2007-8-7 07:45 | 只看该作者

是TTL电平和RS232电平没有统一的问题么?

使用特权

评论回复
6
gsypuma|  楼主 | 2007-8-14 14:54 | 只看该作者

PDA还是不能于单片机通信

但是,pda和单片机都可以于pc机通信。不知道什么原因

使用特权

评论回复
7
erhui_cn| | 2007-8-15 09:25 | 只看该作者

RE:

你的PDA是PDA里面的哪种?

使用特权

评论回复
8
gsypuma|  楼主 | 2007-8-20 14:52 | 只看该作者

问题解决了

问题在于pda和单片机的串口引脚不一样,真郁闷,卡了我这么久,我一直以为是程序的问题。

使用特权

评论回复
9
ch_worm| | 2007-8-31 15:00 | 只看该作者

回上帖

看你最后的帖子 难道是引线没有交叉对接好?????? 
PDA都有串口座子的啊 呵呵  偶也有个老PDA 
有时间还真想玩一下 ... 嗯
偶的MSN  呵呵
CH-littleworm@hotmail.com

使用特权

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

本版积分规则

32

主题

140

帖子

0

粉丝