5634|11

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急求51单片机串行通信c程序!!!谢谢老哥老姐们啦 [复制链接]

pc机和单片机间的通信,还有单片机与单片机间的通信

最新回复

ray_aijun@yahoo.com.cn  8楼也给我发一份吧 万分感谢  详情 回复 发表于 2010-1-6 15:16
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
#include
#include
#define uchar unsigned char
#define uint unsigned int

uchar chrec;
bit brec;
               
void commini (void)           //串口初始化
{
        SCON  = 0x50;     //01010000  //方式1,允许接收            
        TMOD |= 0x21;     //8位自动装入常数的定时器              
        TH1 = 0xfd;       //波特率产生器自动装入常数               
        TR1   = 1;        //T1开始运行               

        ES = 1;                          //打开串口中断
        EA=1;                          //打开全局中断
}

putbyte(unsigned char c)   //放入一个字节到发送缓冲区
{
SBUF=c;
while(!TI);TI=0;
}

void putstring(uchar  *puts)                 //发送一个定义在程序存储区的字符串到串口
{
        for(;*puts!=0;puts++)   //遇到停止符0结束
        putbyte(*puts);
}

void serial () interrupt 4           //串口中断处理
{
        if (RI)
        {
                RI = 0;
                brec=1;
                chrec=SBUF;
                SBUF=chrec;
        }
}
uchar code arrhex[]={"0123456789ABCDEF"};
void LCM1602 (uchar ch)                                //以十六进制显示从PC接收到的数据
{        uchar cht;
       
        cht=ch%16;
        lcdchar (13,1,arrhex[cht]);

        cht=ch/16;
        lcdchar (12,1,arrhex[cht]);
}
void main ()
{       
        commini ();           //串口初始化

        lcdreset();                                                  //LCM初始化
        lcdwda(0,0,"ZC-51 comm. Exp.");
        lcdwda(0,1," rec. char:     ");
        putstring("ZC-51 communications Exp.");
        while (1)
        {
                if (brec)
                {        brec=0;
                        LCM1602 (chrec);           //以十六进制显示从PC接收到的数据
                }
        }
}



#include
#include

sbit RSPIN = P1^0;           //数据/命令选择端
sbit RWPIN = P1^1;           //读写控制信号
sbit EPIN = P1^2;           //使能信号

unsigned char XPOS,YPOS;
unsigned char chbuff;

void delay1(unsigned int t)          //延时
{  unsigned int i,j;
   for(i=0;i       for(j=0;j<10;j++)
         ;
}

void lcdwaitidle(void)            //读写检测.对控制器每次进行读写操作之前,都必须进行,
{  P0=0xff;
   RSPIN=0;
   RWPIN=1;
   EPIN=1;
   //while((P0&0x80)==0x80);         //确保STA7 为0
   while((P0&0x01)==0x01);         //确保STA7 为0
   EPIN=0;
}

void lcdwcn(unsigned char c)         //不判忙直接写指令
{  RSPIN=0;
   RWPIN=0;
   chbuff=0;
   if (c&0x01) chbuff=chbuff|0x80;
   if (c&0x02) chbuff=chbuff|0x40;
   if (c&0x04) chbuff=chbuff|0x20;
   if (c&0x08) chbuff=chbuff|0x10;
   if (c&0x10) chbuff=chbuff|0x08;
   if (c&0x20) chbuff=chbuff|0x04;
   if (c&0x40) chbuff=chbuff|0x02;
   if (c&0x80) chbuff=chbuff|0x01;
   P0=chbuff;
   EPIN=1;
   _nop_();
   EPIN=0;
}

void lcdwc(unsigned char c)                //判忙后写指令       
{  lcdwaitidle();
   lcdwcn(c);
}

void lcdwd(unsigned char d)                 //写数据        
{  lcdwaitidle();
   RSPIN=1;
   RWPIN=0;
   chbuff=0;
   if (d&0x01) chbuff=chbuff|0x80;
   if (d&0x02) chbuff=chbuff|0x40;
   if (d&0x04) chbuff=chbuff|0x20;
   if (d&0x08) chbuff=chbuff|0x10;
   if (d&0x10) chbuff=chbuff|0x08;
   if (d&0x20) chbuff=chbuff|0x04;
   if (d&0x40) chbuff=chbuff|0x02;
   if (d&0x80) chbuff=chbuff|0x01;
   P0=chbuff;
   EPIN=1;
   _nop_();
   EPIN=0;
}

void lcdpos(void)                       //确定当前光标位置
{  XPOS&=0x0f;
   YPOS&=0x03;
   if(YPOS==0x00)
      lcdwc(XPOS|0x80);
   else if(YPOS==0x01)
      lcdwc((XPOS+0x40)|0x80);
}

void lcdreset()                                         //LCM初始化
{  EPIN=0;
   delay1(150); lcdwcn(0x38);         //写指令38H
   delay1(50); lcdwcn(0x38);         //写指令38H
   delay1(50); lcdwcn(0x38);         //写指令38H
   lcdwc(0x38);                                         //显示模式设置,设置16X2 显示,5X7 点阵,8 位数据接口
   lcdwc(0x08);                //显示关闭                    
   lcdwc(0x01);                //显示清屏
   lcdwc(0x06);            //显示光标移动设置
   lcdwc(0x0c);            //显示开及光标设置
}

void lcdfill(unsigned char n)                //向1602写一满屏字符
{
   for(YPOS=0;YPOS<2;YPOS++)
      for(XPOS=0;XPOS<16;XPOS++)
      {  lcdpos();
         lcdwd(n);  }
}

void lcdchar(unsigned char x,unsigned char y,unsigned char ch)          //在1602指定位置写一个字符
{
        XPOS=x;  YPOS=y;
        lcdpos();
        lcdwd(ch);
}

void lcdwda(unsigned char x,unsigned char y,unsigned char *s) //在1602指定位置写一行字符串
{  YPOS=y;
   for(XPOS=x;XPOS<16;XPOS++)
   {  lcdpos();
             if (*s=='\0') return;
      lcdwd(*s);
      s++;
      //delay1(5000);//(400);
   }
}
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
/************************************************************************/
/******************      广州信先行电子科技有限公司     ****************/
/******************          WWW.XXXMCU.COM             ****************/
/******************          <单片机、PC通讯数据互发>   ****************/
/******************           MCU:STC89C52RC            ****************/
/***********************************************************************/


//晶振:11.0592M (注意,如果选用其他频率晶振请调节好定时器参数)

#include "reg51.h"
#include
#include


#define CMD_LEN    75   // 命令长度
#define CMD_TAG    1   // 提示符长度

unsigned char g_ucCmd[CMD_LEN + 1] = {0};
unsigned char g_ucLen = 0;   // 命令长度
unsigned char g_ucCur = 1;   // 光标位置


char uart_data;
void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

//向串口发送一个字符串
void send_string_com(unsigned char *str )
{
    unsigned int k=0;
    do
    {
        send_char_com(*(str + k));
        k++;
    } while(k < strlen(str));
       
}

/* 串行通信初始化*/
void UartInit()
{
        SCON = 0x50;                    // uart 模式1 (8 bit), REN=1;
        TMOD = TMOD | 0x20 ;        // 定时器1 模式2;
  TH1  = 0xFD;                // 9600 Bds at 11.059MHz
        TL1  = 0xFD;       
        //        TH1  = 0xFA;                // 9600 Bds at 22.1184MHz
        //        TL1  = 0xFA;       
        //         TH1  = 0xF7;                // 9600 Bds at 32MHz
        //        TL1  = 0xF7;

        ES = 1;                     //允许uart中断;
        EA = 1;                            //允许CPU中断;
        TR1 = 1;                    //运行定时器1:
}



/************************************************************

  *  字符处理过程函数。根据输入的普通字符或控制字符判断回显。
  
***********************************************************/
void UartCharPro( unsigned char ch)
{
        switch(ch)
        {
        case '\b':    // 退格键
                if(g_ucCur > CMD_TAG)
                {
                        send_char_com('\b');
                        send_char_com(' ');
                        send_char_com('\b');
                        if(g_ucLen)
                        {
                                g_ucLen--;
                        }
                        g_ucCur--;
                }break;
               
        case '\r':    // 回车键
                send_string_com("\r\n");
                send_string_com(g_ucCmd);
                send_string_com("\r\nroot:>");
               
                while(g_ucLen > 0)  //清空命令缓冲区
                        g_ucCmd[g_ucLen--]=' ';
               
                g_ucCur = 1;
                break;
    default:    // 其它字符
                send_char_com(ch);
                g_ucCur++;
                if(g_ucLen < CMD_LEN)
                {
                        g_ucCmd[g_ucLen++] = ch;
                }
                else
                {
                        g_ucCmd[g_ucLen] = 0;
                }
        }
}

void serial_IT(void) interrupt 4
{
        uart_data = SBUF;             //读接收到的数据;
        if (RI == 1)                                         //如果是接收;
        {                                                 
                RI = 0;                                     //清接收标志以便可以接收下一个数据;
                //send_char_com(uart_data);
                UartCharPro(uart_data);
                // send_string_com("you have send\n" );
        }
       
}
void main (void)
{
       
    UartInit();
        TI = 0;                                //清发送标志;

    send_string_com(" The Serial Command Server:\r\nroot:>" );          
    while(1);
          
}       
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
xuexile
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
一楼的不错。楼主可以用了吗?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢大家啊   真是太感谢了  我会慢慢学的  谢谢好心人们
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
上面的一楼大哥的程序好像是液晶显示的吧。。。。。。
我学的还没那么深啊
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
我有protues仿真的双机通信你要不,可以留下你的邮箱
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
谢谢啊  我的邮箱是suibiyixiao@163.com
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
大哥大姐好:

谁有“单片机与PC机串行通信接口设计”的程序及仿真图。     急用!!!!!!    万分感谢!!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
ray_aijun@yahoo.com.cn  8楼也给我发一份吧 万分感谢
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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