<br /> 我是一位在校的学生,在编写串口程序时遇到些问题,半个月也没有解决,希望大家帮助解决一下。<br />问题是这样:<br /> 我要做一个pda与单片机的串口通信,pda部分是在visual studio 2005 的vb中写的,已经可以用串口调试助手于pc进行通信。<br />程序如下:<br />Public Class Form1<br /> Dim F As Long, T As Long, First As Long, TH0 As Byte, TL0 As Byte, i As Integer<br /> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<br /><br /> 'SerialPort.CommPort = 1<br /> 'SerialPort.PortOpen = True<br /> 'SerialPort.Settings = "9600,N,8,1"<br /><br /> With SerialPort<br /> .PortName = "COM1"<br /> .BaudRate = 9600<br /> .DataBits = 8<br /> .StopBits = IO.Ports.StopBits.One<br /> .Parity = IO.Ports.Parity.None<br /> '.ReadTimeout = 1000<br /> End With<br /> End Sub<br /><br /> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click<br /><br /> F = Val(TextSend.Text) '确定发射频率<br /> T = 11059200 \ (24 * F) '计算定时器定时时间<br /> First = &HFFFF - T '计算定时器初值<br /> TL0 = &HFF And First '计算定时器初值低八位<br /> TH0 = (First - TL0) / &H100 '计算定时器初值高八位<br /> Dim TH0Hex<br /> Dim TL0Hex<br /><br /> TH0Hex = Hex(TH0) ' 返回 <br /><br /> TL0Hex = Hex(TL0) ' 返回 <br /><br /> 'SerialPort.PortName = 1<br /> SerialPort.Open() '打开串口<br /> 'SerialPort.BaudRate = "9600"<br /> 'SerialPort.Parity = SerialPort.Parity.None<br /> 'SerialPort.Open()<br /> 'SerialPort.WriteLineTextSend.Text)<br /> SerialPort.Write(Val(TH0Hex)) '发送定时器初值高八位<br /> TextBox2.Text = TH0Hex<br /> SerialPort.Close() '关闭串口<br /> Dim i As Integer<br /> For i = 0 To 10000000<br /> Next i<br /> SerialPort.Open() '打开串口<br /> SerialPort.Write(Val(TL0Hex)) '发送定时器初值低八位<br /> TextBox2.Text = TL0Hex<br /> 'SerialPort.WriteLine(TextSend.Text)<br /> SerialPort.Close() '关闭串口 <br /><br /> End Sub<br /><br /> Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click<br /> Application.Exit()<br /> End Sub<br />End Class<br />单片机部分就是要把接受到的高低八位给定时器,然后产生方波。用串口调试助手给单片机发数,已经可以工作程序如下:<br />#include <howevero.h><br /><br />//逻辑<br />#define FALSE 0<br />#define TRUE 1<br />#define H 1<br />#define L 0 <br /><br />//管脚定义<br />sbit std_cnt2 = p1^2;<br />sbit std_cnt1 = p0^1;<br />sbit std_cnt0 = p0^0;<br />sbit std_cnt3 = p0^3;<br /><br /><br />//函数声明<br />void serial_init(void);//串口初始化<br />void serial_send(void);<br /><br /><br />//全局变量声明<br />unsigned int idata send_letter;<br />//unsigned long data tempnumber=0;<br />unsigned char numberhigh,numberlow;<br />int i=0;<br />unsigned int data temp;<br /><br />/************ 主函数**************************/<br />void main(void)<br />{<br /> SP=0x60;<br />// interupt_init();<br /> serial_init();<br /> <br /> std_cnt0=0;<br /> std_cnt1=0;<br /> std_cnt2=0;<br /> std_cnt3=0;<br /><br /> while(i==0);//等待中断<br /><br /> /*发射波形*/<br /> TH0=numberhigh; <br /> TL0=numberlow;<br /> TF0=0;<br /> TR0=1;<br /> while(1)<br /> {<br /> while(TF0==0);<br /> TH0=numberhigh;<br /> TL0=numberlow;<br /> std_cnt3=!std_cnt3; <br /> TF0=0; <br /> TR0=1;<br /> }<br /><br />}<br /><br /><br /><br /><br />/************ 串口初始化?*************************/<br />void serial_init()<br />{ <br /> <br /> SCON=0x50; //工作方式1,单机通讯,接收允许<br /> TMOD=0x21; //方式1下波特率由SMOD和定时器1共同决定,定时器一工作在方式2下<br /> TR0=0; //<br /> PCON=0x00; //PCON=0x00速度不加倍<br /> TH1=0xFD; TL1=0xFD; //计数初值,晶振11.0592M,波特率9600,<br /> TR1=1; //启动定时器<br /> ET0=0; EX0=1; ES=1; EA=1;<br /> EX1=0;<br /> PS=1;<br />}<br /><br />/************ 串口中断函数**************************/<br />void serial_receive(void) interrupt 4 using 1<br />{ <br /> <br /> <br /><br /> RI=0;<br /> std_cnt3=0; //输出低电平(未发射方波时)<br /> for(temp=0;temp<2;temp++) //连续接收2个字节 <br /> {<br /> switch(temp)<br /> {<br /> case 0:numberhigh=SBUF;while(RI==0);RI=0;break;//给出定时器初值高八位,并等待下个串行中断<br /> case 1:numberlow=SBUF;break; //给出定时器初值低八位,准备跳出中断<br /> default:break;<br /> }<br /> } <br /><br /> RI=0;<br /> i++;<br />}<br />可是,把pda与单片机连接到一起时,不管pda串口发什么频率数,单片机的频率是一定的,我半个多月都没想明白,希望高手帮忙指点一下! |
|