找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2536|回复: 0
收起左侧

adc0832模数转换与显示

[复制链接]
ID:270277 发表于 2018-1-2 16:28 | 显示全部楼层 |阅读模式



//-----------------------------------------------------------------------------------
//           说明:调整VR1时,adc0832将模拟电压转换为数字电压显示在1602液晶
//           屏第0行,液晶屏第一行同时以进程条方式显示当前电压大小。
//-----------------------------------------------------------------------------------
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
//adc0832引脚定义
sbit CS = P2^0;     //片选线
sbit CLK = P2^1;
sbit DIO = P2^2;
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
#define LCD_PORT P0
uchar Disp_Buffer1[] = "VOLTAGE:   0.00V";
uchar Disp_Buffer2[16];
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
//--------------------------
//
//-------------------------
void delay_ms(uint x)
{
uchar t;
while(x--)
  for(t = 0; t < 120 ;t++);
}
//----------------------------
//  du mang
//-----------------------------
bit Read_LCD_Busy_Flag()
{
uchar result;
LCD_PORT = 0XFF;
RS = 0;
RW = 1;
E = 1;
delay4us();
result = P0;E = 0;
return(result&0x80)?1:0;
}
//-----------------
//xie lcd  command
//-----------------
void Write_LCD_Command(uchar cmd)
{
while(Read_LCD_Busy_Flag() );
RS = 0;
RW = 0;
E = 0;
  _nop_();
LCD_PORT = cmd;
delay4us();
E = 1;
delay4us();
E = 0;
}
//-------------------
//xie lcd  data
//------------------------
void Write_LCD_Data(uchar dat)
{
while (Read_LCD_Busy_Flag() );
  RS = 1;
RW = 0;
E = 0;
  _nop_();
LCD_PORT = dat;
delay4us();
E = 1;
delay4us();
E = 0;
}
//------------------------------------------------
//在lcd制定行列显示字符串
//-----------------------------------------------
void LCD_Show_String(uchar r,uchar c,char *s)
{
uchar i = 0;
uchar code DDRAM[] = {0x80,0xc0};
Write_LCD_Command(DDRAM[r]|c);
while(s[i]&&i<16)
  Write_LCD_Data(s[i++]);
}
//-------------------------------------------------
//LCD初始化
//--------------------------------------
void LCD_Init()
{
Write_LCD_Command(0x38);delay_ms(1);
Write_LCD_Command(0x0c);delay_ms(1);
Write_LCD_Command(0x06);delay_ms(1);
Write_LCD_Command(0x01);delay_ms(1);
}
//获取ad转换结果
uchar Get_AD_Result()
{
  uchar i,dat1 = 0,dat2 = 0;
CS = 0;CLK = 0;

DIO = 1;_nop_();_nop_();
CLK = 1;_nop_();_nop_();

CLK = 0;DIO = 1;_nop_();_nop_();
CLK = 1;_nop_();_nop_();

CLK = 0;DIO = 0;_nop_();_nop_();
CLK = 1;_nop_();_nop_();

CLK = 0;DIO = 1;_nop_();_nop_();

for (i=0;i<8;i++)
{
CLK = 1;_nop_();_nop_();
CLK = 0;_nop_();_nop_();
dat1=(dat1<<1)|DIO;
}
  for (i=0;i<8;i++)
{
dat2=dat2|((uchar)DIO<<i);
CLK = 1;_nop_();_nop_();
CLK = 0;_nop_();_nop_();
dat1=(dat1<<1)|DIO;
}
CS= 1;
return(dat1 = dat2)?dat1:0x00;
}
//-----------
//串口输出字符串
//------------------
void Putstr(char *s)
{
uchar i=0;
while(s[i])
{
SBUF = s[i++];
  while(TI == 0);
  TI = 0;
}
}
//------------------------------------------
//------主程序
//-----------------------------------------
void main()
{
uchar i,AD;
uint d;
LCD_Init();

SCON = 0X50;
TMOD = 0X20;
PCON = 0X00;
TH1=TL1=0XFD;
IE = 0X91;
IT0 = 1;
TR1 = 1;

while(1)
{
AD = Get_AD_Result();
d = AD*500.0*2/511.0;
  Disp_Buffer1[11]=d/100+'0';
  Disp_Buffer1[13]=d/10%10+'0';
   Disp_Buffer1[11]=d%10+'0';
  
LCD_Show_String(0,0,Disp_Buffer1);
  
Putstr(strcat((char*)Disp_Buffer1,"\r\n"));
delay_ms(50);
  
  
  
i=(uint)AD*16/255;
memset(Disp_Buffer2,'\xff',i);
memset(Disp_Buffer2+i,'\xdb',16-i);
  LCD_Show_String(1,0,Disp_Buffer2);  //memset是以字节为单位,初始化内存块。
}
}

1111.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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