打印

adda我的程序有什么问题为什么518952单片机没任何显示

[复制链接]
597|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
2020工程师|  楼主 | 2017-3-16 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
试验要求上的AD,DA调一调,用键盘输入一个2V以下电压比如1.2V,DA输出1.2V,ADC采集 如果大于1.2,让DA减少,小于1.2让DA增大,同时液晶上显示设定值和实测值,
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
sbit SCL=P2^0;                            //I2C时钟引脚
sbit SDA=P2^1;                            //I2C数据输入输出引脚
uchar Recv_Buffer[4];                     //数据接收缓冲
uint Voltage[]={'0','0','0','0'};         //数据分解为电压x.xx
bit bdata IIC_ERROR;                      //I2C错误标志位
uchar LCD_Line_1[]={"   .  V         "};
//延时
void delay(int ms)
{
uchar i;
while(ms--) for(i=0;i<250;i++) Delay4us();
}
//LCD忙检测
bit LCD_Busy_Check()
{
bit Result;
LCD_RS=0;LCD_RW=1;
LCD_EN=1;Delay4us();Result=(bit)(P0&0x80);
LCD_EN=0;
return Result;
}
//写指令
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();
LCD_EN=1;Delay4us();LCD_EN=0;
P0=cmd;Delay4us();
}
// 写数据
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us();
LCD_EN=1;Delay4us();LCD_EN=0;
}
//初始化
void LCD_Initialise()
{
LCD_Write_Command(0x38);delay(5);
LCD_Write_Command(0x0c);delay(5);
LCD_Write_Command(0x06);delay(5);
LCD_Write_Command(0x01);delay(5);
}
//设置显示位置
void LCD_Set_Position(uchar pos)
{
LCD_Write_Command(pos|0x80);
}
//显示一行
void LCD_Display_A_Line(uchar Line_Addr,uchar s[])
{
uchar i;
LCD_Set_Position(Line_Addr);
for(i=0;i<16;i++)LCD_Write_Data(s[i]);
}
// 将模数转换后得到的值分解存入缓存
void Convert_To_Voltage(uchar val)
{
uchar Tmp;                       //最大值为255,对应5V,255/5=51
Voltage[2]=val/51+'0';           //整数部分
Tmp=val%51*10;                   // 第一位小数
Voltage[1]=Tmp/51+'0';
Tmp=Tmp%51*10;
Voltage[0]=Tmp/51+'0';
}
//启动I2C总线
void IIC_Start()
{
SDA=1;SCL=1;Delay4us();SDA=0;Delay4us();SCL=0;
}
//停止I2C总线
void IIC_Stop()
{
SDA=0;SCL=1;Delay4us();SDA=1; Delay4us();SCL=0;
}
// 从机发送应答位
void Slave_ACK()
{
SDA=0;SCL=1;Delay4us();SCL=0;SDA=1;
}
// 从机发送非应答位
void Slave_NOACK()
{
SDA=1;SCL=1;Delay4us();SCL=0;SDA=0;
}
//发送一字节
void IIC_SendByte(uchar wd)
{
uchar i;
for(i=0;i<8;i++) //循环移入8位
{
SDA=(bit)(wd&0x80);_nop_();_nop_();
SCL=1;Delay4us();SCL=0;wd<<=1;
}
Delay4us();
SDA=1;                                 //释放总线并准备读取应答
SCL=1;
Delay4us();
IIC_ERROR=SDA;                        //IIC_ERROR=1表示无应答
SCL=0;
Delay4us();
}
//接收一字节
uchar IIC_ReceiveByte()
{
uchar i,rd=0x00;
for(i=0;i<8;i++)
{
SCL=1;rd<<=1;rd|=SDA;Delay4us();SCL=0;Delay4us();
}
SCL=0;Delay4us();
return rd;
}
//连续读入4路通道的A/D转换结果并保存到Recv_Buffer
void ADC_PCF8591(uchar CtrlByte)
{
uchar i;
IIC_Start();
IIC_SendByte(0x90);                         // 发送写地址
if(IIC_ERROR==1)return;
// IIC_SendByte(CtrlByte);                  //发送控制字节
//if(IIC_ERROR==1)return;
IIC_Start();                               //重新发送开始命令
IIC_SendByte(0x91);                        // 发送读地址
if(IIC_ERROR==1)return;
IIC_ReceiveByte();                        //空读一次,调整读顺序
Slave_ACK();                             //收到一字节后发送一个应答位
for(i=0;i<4;i++)
{
Recv_Buffer[i++]=IIC_ReceiveByte();
Slave_ACK();                          //收到一个字节后发送一个应答位
}
Slave_NOACK();
IIC_Stop();                          //收到一个字节后发送一个非应答位
}
// 向 PCF8591发送1字节进行AD转换
//主程序
void main()
{
LCD_Initialise();
while(1)
{
ADC_PCF8591(0x04);
Convert_To_Voltage(Recv_Buffer[0]);
LCD_Line_1[2]=Voltage[2];
LCD_Line_1[4]=Voltage[1];
LCD_Line_1[5]=Voltage[0];

LCD_Display_A_Line(0x00, LCD_Line_1);
}
}

相关帖子

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

本版积分规则

1

主题

1

帖子

0

粉丝