找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1611|回复: 2
打印 上一主题 下一主题
收起左侧

怎么把51单片机在led显示改成在pc端显示 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:677091 发表于 2019-12-30 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
#include<reg52.h>   
#include <intrins.h>
#define ulong unsigned long
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_PORT P1               
#define  PCF8591 0x90   
#define  NOP()   _nop_()   
#define  _Nop()  _nop_()  
sbit SCL=P2^1;      
sbit SDA=P2^0;      
sbit LCD1602_RS = P2^5;         
sbit LCD1602_RW = P2^4;         
sbit LCD1602_EN = P2^3;        
bit ack;     
sbit key1= P0^4;
sbit key2 = P0^5;
sbit buzz = P2^6;
void delay_ms(uint n)        
{
        unsigned int  i,j;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}


            /*应答标志位*/

// 变量定义
uchar AD_CHANNEL;
ulong xdata  LedOut[8];          //单片机内部存取器
ulong  f,a,cj,v;

uchar date;

// 函数申明
extern bit ack;                //起动总线函数
extern void Start_I2c();        //结束总线函数  
extern void Stop_I2c();                //应答子函数
extern void Ack_I2c(bit a);                //字节数据发送函数
extern void  SendByte(uchar  c);        //有子地址发送多字节数据函数               
extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) ;        //无子地址发送多字节数据函数   
extern bit ISendStrExt(uchar sla,uchar *s,uchar no);        //无子地址读字节数据函数               
extern uchar RcvByte();

void LCD1602_delay_ms(uint n);
void LCD1602_write_com(uchar com);
void LCD1602_write_data(ulong dat);
void LCD1602_write_word(uchar *s);
void Init_LCD1602();

bit ISendByte(uchar sla,uchar c);
uchar IRcvByte(uchar sla);

//MS延时函数(12M晶振下测试)

//写指令
void LCD1602_write_com(uchar com)
{
        LCD1602_RS = 0;                 //1602液晶显示屏的数据/命令选择端置0,数据/命令(H/L),此时选择写命令操作
        delay_ms(1);
        LCD1602_EN = 1;                 //使能,也就是打开液晶接收数据命令的通道
        LCD1602_PORT = com;         //把命令送给P2口
        delay_ms(1);
        LCD1602_EN = 0;
}

//写数据
void LCD1602_write_data(ulong dat)
{
        LCD1602_RS = 1;                 //1602液晶显示屏的数据/命令选择端置0,数据/命令(H/L),此时选择写数据操作
        delay_ms(1);        
        LCD1602_PORT = dat;         //把数据送给P2口
        LCD1602_EN = 1;
        delay_ms(1);
        LCD1602_EN = 0;
}

//连续写字符
void LCD1602_write_word(uchar *s)
{
        while(*s>0)
        {
                LCD1602_write_data(*s);
                s++;
        }
}

//1602初始化函数
void Init_LCD1602()                                       
{
        LCD1602_EN = 0;
        LCD1602_RW = 0;                                                //设置为写状态
        LCD1602_write_com(0x38);                        //显示模式设定
        LCD1602_write_com(0x0c);                        //开关显示、光标有无设置、光标闪烁设置
        LCD1602_write_com(0x06);                        //写一个字符后指针加一
        LCD1602_write_com(0x01);                        //清屏指令
}
/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void Start_I2c()
{
  SDA=1;         /*发送起始条件的数据信号*/
  _Nop();
  SCL=1;
  _Nop();        /*起始条件建立时间大于4.7us,延时*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;         /*发送起始信号*/
  _Nop();        /* 起始条件锁定时间大于4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;       /*钳住I2C总线,准备发送或接收数据 */
  _Nop();
  _Nop();
}

/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void Stop_I2c()
{
  SDA=0;      /*发送结束条件的数据信号*/
  _Nop();       /*发送结束条件的时钟信号*/
  SCL=1;      /*结束条件建立时间大于4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;      /*发送I2C总线结束信号*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}

/*******************************************************************
                 字节数据发送函数               
函数原型: void  SendByte(UCHAR c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  SendByte(uchar  c)
{
uchar  BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
       else  SDA=0;               
     _Nop();
     SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
      _Nop();
      _Nop();             /*保证时钟高电平周期大于4μs*/
      _Nop();
      _Nop();
      _Nop();         
     SCL=0;
    }

    _Nop();
    _Nop();
    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        /*判断是否接收到应答信号*/
    SCL=0;
    _Nop();
    _Nop();
}

/*******************************************************************
                 字节数据接收函数               
函数原型: UCHAR  RcvByte();
功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
          发完后请用应答函数应答从机。  
********************************************************************/   
uchar   RcvByte()
{
  uchar  retc;
  uchar  BitCnt;

  retc=0;
  SDA=1;                     /*置数据线为输入方式*/
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;                  /*置时钟线为低,准备接收数据位*/
        _Nop();
        _Nop();                 /*时钟低电平周期大于4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  /*置时钟线为高使数据线上数据有效*/
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}

/********************************************************************
                     应答子函数
函数原型:  void Ack_I2c(bit a);
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{
  if(a==0)SDA=0;              /*在此发出应答或非应答信号 */
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();                    /*时钟低电平周期大于4μs*/
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
  _Nop();
  _Nop();   
}


/*******************************************************************
ADC发送字节[命令]数据函数               
*******************************************************************/
bit ISendByte(uchar sla,uchar c)
{
   Start_I2c();              //启动总线
   SendByte(sla);            //发送器件地址
   if(ack==0)return(0);
   SendByte(c);              //发送数据
   if(ack==0)return(0);
   Stop_I2c();               //结束总线
   return(1);
}

/*******************************************************************
ADC读字节数据函数               
*******************************************************************/
uchar IRcvByte(uchar sla)
{  
   uchar c;
   Start_I2c();          //启动总线
   SendByte(sla+1);      //发送器件地址
   if(ack==0)return(0);
   c=RcvByte();          //读取数据0
   Ack_I2c(1);           //发送非就答位
   Stop_I2c();           //结束总线
   return(c);
}

//        字符显示函数
void Display()
{
        LCD1602_write_com(0x80);                        //指针设置,指向1602液晶第一行第一列
    LCD1602_write_word("V=");
        LCD1602_write_com(0xc0+0x00);                        //指针设置,指向1602液晶第二行第一列
    LCD1602_write_word("  LOVE      ");
}

//采集数据显示
void Display_Voltage()
{
  v=(v*10000/255);
        LCD1602_write_com(0x82);        
        LCD1602_write_data(v/1000%10 + 0x30);
  LCD1602_write_data('.');
        LCD1602_write_data(v/100%10 + 0x30);
  LCD1602_write_data(v/10%10 + 0x30);
        LCD1602_write_data('V');

}

main()
{  
    Init_LCD1602(); //初始化LCD1602
    Display();
                while(1)
        {
                ISendByte(PCF8591);
                v=IRcvByte(PCF8591);         
                Display_Voltage();        
                                                
        }         
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:648281 发表于 2019-12-31 20:06 | 只看该作者
你好!
1、加上串口初始化
2、加上串口发送函数
3、发送测到的数据
回复

使用道具 举报

板凳
ID:430308 发表于 2019-12-31 21:26 | 只看该作者
用串口打印出来   串口调试助手可以在网上下载一个
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表