10334|11

56

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

求基于51单片机的rs232与PC机串口通讯程序 [复制链接]

编了几天了,越编头越大,哪位大大有,借鉴一下
此帖出自51单片机论坛

最新回复

学习  详情 回复 发表于 2011-6-25 16:27
点赞 关注
 

回复
举报

56

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
:Q 俺要的是51单片机内部的汇编程序
此帖出自51单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
:L 谁让我是初学者,老板让我编个51与PC机的串行程序,给了我一个别人编了的程序,结果我越看越头疼,那个程序是测试程序,有些参数都是模拟赋值,结果删了半天,还是看不明白,谁有借用一下,弄懂思路就好了,主要是中间的协议怎么样能定义得通是我头疼的地方,简单的串行我还是懂的.
此帖出自51单片机论坛
 
 
 

回复

1583

帖子

0

TA的资源

五彩晶圆(高级)

4
 
上位机的用什么软件????

它的通信协议是什么样子的???
还有包括速率等等这些信息,你可以先找一个串调试软件来练习一下。

如果这些不了解很不好弄的~~~~
此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
个人签名
 
 

回复

56

帖子

0

TA的资源

纯净的硅(高级)

5
 
;==========================================================
;* ******* 串行通讯子程序模块 Fiel=RS232.inc  ***********
;* fosc = 11.0592MHz
;* 字节数据格式:  一位起始位, 八位数据位, 一位停止位, 无校验
;* 即串行方式1
;* 波特率根据仪表Bt设定值: 300bps~9600bps
;* 2005/09/10
;==========================================================
; KTWP-L系列仪表通讯命令集
; 代 码   说       明
; U     上位机握手信号,
; A     下位机回送握手信号
; RD 读开关设备动态数据
; RR 读开关设备内部参数全部资料
; W1 写仪表内部参数资料
;==========================================================
这是老板给我的模样程序里定义的,我打算就用这个来了,上位机用什么软件,说实话,PC机里面的软件我也不知道该用什么好,因为都不怎么通,好心的大大帮我选个吧
此帖出自51单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

纯净的硅(高级)

6
 
还有一点想不明白就是我们的串口有可能用到的功能很多,是不是一一对应51和PC都要编出来,然后在PC上把软件各个功能全编在界面上,这是我的理解
此帖出自51单片机论坛
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

7
 
pc上面使用串口调试工具就可以了
此帖出自51单片机论坛
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

8
 
这里有个汇编的程序 你可以看看
本程序是用来显示倒计时的程序的
;
;'4'+'1'+HH+LL        表示雨强
;'4'+'2'+HH+LL        表示开度
;'4'+'3'+HH+LL        表示倒计时
        L1        BIT        P3.4;P3.3
        L2        BIT        P3.5;P3.2
        L3         BIT        P3.2;P3.5
        L4        BIT        P3.3;P3.4
       
        C_485        BIT        P3.7
       
       
        LED1        EQU        30H
        LED2        EQU        31H
        LED3        EQU        32H
        LED4        EQU        33H
        LED_CNT        EQU        34H
        DATA0        EQU        35H
        DATA1        EQU        36H
        DATA2        EQU        37H
        DATA3        EQU        38H
        DATA4        EQU        39H
        HH        EQU        3AH
        LL        EQU        3BH
       
       
        ORG        0000H
        LJMP        MAIN
        ORG        000BH
        LJMP        SCAN
        ORG        0023H
        LJMP        RXT
        ORG        0060H
MAIN:        MOV        SP,        #60H
        MOV        R6,        #50H
        MOV        R0,        #20H
        MOV        A,        #00H
STR0:        MOV        @R0,        A
        INC        R0
        NOP
        CLR        C_485
        DJNZ        R6,STR0       
        MOV        TMOD,        #21H
        MOV        SCON,        #50H
        MOV        TH1,#0fdh                        ;9600bit
        MOV        TL1,#0fdh
        MOV        TH0,#0EEH                        ;5ms
        MOV        TL0,#00H
        SETB        EA
        SETB        REN
        SETB    TR1
        SETB        ET0
        SETB        TR0
        SETB        ES
        MOV        HH,        #01H
        MOV        LL,        #12H
        MOV        LED1,        #00
        MOV        LED2,        #09
        MOV        LED3,        #07
        MOV        LED4,        #08
LL0:        ACALL        DISP_LED
        JMP        LL0


;显示数码管子程序       
DISP_LED:
        MOV        A,        HH
        ANL        A,        #0F0H
        SWAP        A
        MOV        LED1,        A
        MOV        A,        HH
        ANL        A,        #0FH
        MOV        LED2,        A
        MOV        A,        LL
        ANL        A,        #0F0H
        SWAP        A
        MOV        LED3,        A
        MOV        A,        LL
        ANL        A,        #0FH
        MOV        LED4,        A       
        CLR        L1
        CLR        L2
        CLR        L3
        CLR        L4
        MOV        A,        LED1
        MOV        DPTR,        #LED_CODE
        MOVC        A,        @A+DPTR
        MOV        P1,        A
        SETB        L1
        NOP
        CLR        L1
        MOV        A,        LED2
        MOV        DPTR,        #LED_CODE
        MOVC        A,        @A+DPTR
        MOV        P1,        A
        SETB        L2
        NOP
        CLR        L2
        MOV        A,        LED3
        MOV        DPTR,        #LED_CODE
        MOVC        A,        @A+DPTR
        MOV        P1,        A
        SETB        L3
        NOP
        CLR        L3
        MOV        A,        LED4
        MOV        DPTR,        #LED_CODE
        MOVC        A,        @A+DPTR
        MOV        P1,        A
        SETB        L4
        NOP
        CLR        L4
        RET

;定时中断
SCAN:        PUSH        ACC
        PUSH        PSW
       
       
SCAN2:        POP        PSW
        POP        ACC
        RETI       
;串口中断
RXT:        PUSH        ACC
        PUSH        PSW
        JNB        RI,RXT_END
        CLR        RI
        MOV        DATA0,DATA1
        MOV        DATA1,DATA2
        MOV        DATA2,DATA3
        MOV        DATA3,DATA4
        MOV        DATA4,SBUF
        MOV        A,        DATA0
        CJNE        A,        #34H,        RXT_END           ;'4'
        MOV        A,        DATA1
        CJNE        A,        #33H,        RXT_END                ;'3'
        MOV        HH,        DATA3
        MOV        LL,        DATA4
RXT_END:POP        PSW
        POP        ACC
        RETI

LED_CODE:DB 0FCH,0A0H,0DBH,0F2H,0A7H,76H,7EH,0E0H,0FEH,0F6H,0FCH       
        END
此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

56

帖子

0

TA的资源

纯净的硅(高级)

9
 
MOV @R0, A
INC R0
NOP
CLR C_485
DJNZ R6,STR0
这段指令是延时吗?

;定时中断
SCAN:
PUSH ACC
PUSH PSW
SCAN2:
POP PSW
POP ACC
RETI
这个起什么作用?


这里用到的协议就是下面这些吗?
;'4'+'1'+HH+LL 表示雨强
;'4'+'2'+HH+LL 表示开度
;'4'+'3'+HH+LL 表示倒计时

我是这样理解的,对不对我也不知道
必须知道51与PC具体操作哪些事情才好把整个串口编出来是吗?
也就是怎么样接收数据,接收什么样的数据,处理这些数据的子程序之类的
此帖出自51单片机论坛
 
个人签名新人的追求是阅历资深--就好像
孩子的追求是成为大人
 
 

回复

107

帖子

0

TA的资源

纯净的硅(中级)

10
 

这是DG128的不是51的 我自己写的

这是DG128的不是51的 我自己写的
/**************************************************/
/****该程序来自于dreamprosper***/
/******************************/
/**********EMALI:dreamprosper@126.com*******/
/**************************************************/
#include       
#include      
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

//char test[10];
unsigned char n[]={'O','K','!'};

int FOWARD_FLAG = 0;
int result_foward = 0;
int HANDLE_FLAG = 0;
int result_handle =0;

#define FIRST_SPEED 1500
#define SECON_SPEED 2000
#define THIRD_SPEED 3000
#define FIRST_L_HANDLE 600
#define SECON_L_HANDLE 800
#define FIRST_R_HANDLE 1200
#define SECON_R_HANDLE 1400

/*-------串口初始化----------------------*/
void SciInit(){
  SCI0BDL = (unsigned char)((16000000UL /* OSC freq */ / 2) / 9600 /* baud rate */ / 16 /*factor*/);
  SCI0CR1=0;                                        /*normal,no parity*/
  SCI0CR2=0X2C;       /*RIE=1,TE=1,RE=1*/
}

/*-------发射端程序----------------------*/
void SciTx(unsigned char text){
while (!(SCI0SR1&0x80));  /* wait for output buffer empty */
  SCI0DRH=0;
  SCI0DRL=text;
}

void pwminit()
{
/*-------后轮电机PWM出始化----------------------*/
  PWME_PWME0=0;
  PWMCAE_CAE0=0;                          //选择输出模式为左对齐输出模式
  PWMCNT0 = 0;                                        //计数器清零;
  PWMPOL_PPOL0=1;                                //先输出高电平,计数到DTY时,反转电平
  PWMPRCLK_PCKA = 0;    //clockA不分频;  clockA=busclock=8MKHz;         
  PWMSCLA = 16;         //对clockSA 进行32分频;pwm clockSA=clockA/32=250KHz;
  PWMDTY0 = 124;        //高电平时间为0.5ms;            
  PWMPER0 = 249 ;       //周期1ms;1KHz;                  
  PWMCLK_PCLK0 = 1;     //选择clock SA做时钟源;            
  PWME_PWME0 = 1;       //开启PWM
  
  PWME_PWME1=0;
  PWMCAE_CAE1=0;                          //选择输出模式为左对齐输出模式
  PWMCNT1 = 0;                                        //计数器清零;
  PWMPOL_PPOL1=1;                                //先输出高电平,计数到DTY时,反转电平
  PWMPRCLK_PCKA = 0;    //clockA不分频;  clockA=busclock=8MKHz;         
  PWMSCLA = 16;          //对clockSA 进行32分频;pwm clockSA=clockA/32=250KHz;
  PWMDTY1 = 0;        //高电平时间为0.5ms;            
  PWMPER1 = 249;        //周期1ms;1KHz;                  
  PWMCLK_PCLK1 = 1;     //选择clock SA做时钟源;            
  PWME_PWME1 = 1;       //开启PWM        PWM2输出接PA7257的1脚,PWM2零时?A7257的2脚接地反转。
              
/*-------舵机PWM出始化----------------------   */
  PWME_PWME3=0;
  PWMCTL_CON23=1;
  PWMPRCLK_PCKB = 2;    //clockB进行8分频;  clockA=busclock/8=1MHz;         
  PWMSCLB =8;          //对clockSB 进行40分频;pwm clockSA=clockA/40=12.5KHz;160 is T=20ms
  PWMCLK_PCLK3 = 1;     //选择clock SB做时钟源;            
  PWMPOL_PPOL3=1;                                //先输出高电平,计数到DTY时,反转电平
  PWMCAE_CAE3=0;                          //选择输出模式为左对齐输出模式

  PWMCNT23 = 1;                                        //计数器清零;
  PWMDTY23 = 190;         //初始舵机标定  孟兴旺   
  PWMPER23 = 9999 ;     //周期20ms; 100Hz;                  
  PWME_PWME3 = 1;       //开启PWM


/*-------电机PWM出始化----------------------   */
  PWME_PWME5=0;
  PWMCTL_CON45=1;
  PWMPRCLK_PCKA = 2;    //clockA进行8分频;  clockA=busclock/8=1MHz;         
  PWMSCLA =8;          //对clockSB 进行40分频;pwm clockSA=clockA/40=12.5KHz;160 is T=20ms
  PWMCLK_PCLK5 = 1;     //选择clock SB做时钟源;            
  PWMPOL_PPOL5=1;                                //先输出高电平,计数到DTY时,反转电平
  PWMCAE_CAE5=0;                          //选择输出模式为左对齐输出模式

  PWMCNT45 = 1;                                        //计数器清零;
  PWMDTY45 = 0;         //初始舵机标定  孟兴旺   
  PWMPER45 = 9999 ;     //周期20ms; 100Hz;                  
  PWME_PWME5 = 1;       //开启PWM

}

void handle()        //转角控制
{
      PWMDTY23 = result_handle; //773是孟兴旺机械调整后改
      return;
         
}

void speed_sci()
{
   PWMDTY45 = result_foward;
   PWMDTY1 = 0;
}

void SCIREX()
{               
  char temp;
  //byte scir;
  temp = SCI0SR1;      /*clear flag*/
  while(!(SCI0SR1&0x20));
  //scir=SCI0DRL;
  //result = scir;
  FOWARD_FLAG = SCI0DRL;
  if(FOWARD_FLAG == 43 )
  {
   while(!(SCI0SR1&0x20));
   result_foward = SCI0DRL;
   while(!(SCI0SR1&0x20));
   result_handle = SCI0DRL;
  }
}
void control()
{
  switch(result_foward)
  {
   
    case 'w':
    result_foward = FIRST_SPEED;
    break;
    case 'e':
    result_foward = SECON_SPEED;
    break;
    case 'r':
    result_foward = THIRD_SPEED;
    break;
    default:
    result_foward = 0;
    break;   
  }
  switch(result_handle)
  {
   
    case 'a':
    result_handle = FIRST_L_HANDLE;
    break;
    case 's':
    result_handle = SECON_L_HANDLE;
    break;
    case 'd':
    result_handle = FIRST_R_HANDLE;
    break;
    case 'f':
    result_handle = SECON_R_HANDLE;
    break;
    default:
    result_handle = 700;
    break;   
  }
}
void main()
{
  int i,j;
        PORTB=0x00;         
  DDRB=0xFF;
  SciInit();
  pwminit();
   while(1)
  {                 
       SCIREX();
       control();
      
       handle();
       speed_sci();      
       PORTB=0B00001111;
       for(i=0;i<3;i++)
                   {  
        SciTx(n);        //向串口发送HELLO WORLD
                   }
       PORTB=0B1111000;
   
      
  }

  
}
此帖出自51单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

纯净的硅(高级)

11
 
嗯,我大概也明白了一些,昨天晚上和老板讨论了一下
我们传输的量主要有
指示灯显示数据---PC端接收(这个应该是一个八位数据全部搞定了,因为只有6个指示灯)
机器端LCD---PC端接收(机器本身有显示功能,但要在PC机上也有)
机器控制按钮---PC端发送,机器接收
此帖出自51单片机论坛
 
个人签名新人的追求是阅历资深--就好像
孩子的追求是成为大人
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

12
 
学习
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表