STC12C5A60S2单片机实现AD采样并液晶显示(数字燃油表)

  • 格式:doc
  • 大小:57.00 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字燃油表模拟电路设计可实现以下功能:

1、推动滑动变阻器,能使LCD从0显示到100

2、档显示数字低于10时,灯亮,LCD显示“oil low”

以下为C程序:

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}

sbit LED=P1^0;

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[]={" "};

//延时

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_();

P0=cmd;Delay4us();

LCD_EN=1;Delay4us();LCD_EN=0;

}

// 写数据

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_V oltage(uchar val)

{

uchar Tmp; //最大值为255,对应100L,255/100=2.55 val=val*0.393;

V oltage[2]=val/100+'0'; //

Tmp=val%100; //

V oltage[1]=Tmp/10+'0';

Tmp=Tmp%10;

V oltage[0]=Tmp+'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++)

{