基于51单片机ADS1118驱动程序及LCD12864显示

本文详细介绍了如何在STC15F2K61S2单片机上编写ADS1118的驱动程序,包括延时、初始化、读写操作等步骤,并展示了如何使用LCD12864显示模块进行数据显示,包括初始化、写入命令和数据等。代码示例涵盖了数据处理和主程序流程,便于读者理解和实现ADC与LCD的结合应用。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、ADS1118驱动程序

1.延时

2.头文件

3.初始化

4.写入

5.读取

6.数据处理

7.main.c

二、LCD12864显示

1.写入命令

2.初始化

3.写入数据

4.确定字符位置

5.字符输入

6.显示

LCD12864主程序

三、程序集合

总结


前言

最近学习了ADS1118的驱动及显示,希望能帮到大家。新人作者求关注。


一、ADS1118驱动程序

1.延时

void delayms(int x)//1ms延时
{
	int i,j;
	for(i=0;i<x;i++)
	for(j=0;j<120;j++);
}

2.头文件

#include <stc15.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code qaz[]={"0123456789"};
sbit SCLK=P3^0;//SCLK信号
sbit DOUT=P3^1;//数据输出,数据由ADS1118发出到单片机
sbit DIN=P3^2;//数据输入,数据由单片机发出
sbit CS=P3^3;//片选信号
sbit RS=P2^0;//LCD12864 PS脚
sbit RW=P2^1;//LCD12864 RW脚
sbit EN=P1^2;//LCD12864 EN脚
sbit PSB=P2^6;//LCD12864 PSB脚

3.初始化

void ADS1118_INIT()
{
	SCLK=0;
	CS=1;
	DIN=0;
}

4.写入

void write_ADS1118_bit(int cmd)
{                     /写入字节,写入是16位的,不能使用char或者uchar来定义cmd和dat
	int i;
	for(i=0;i<16;i++)
	{
		SCLK=1;             //写入是在SCLK信号的下降沿,且SCLK信号空闲时是低电平
		DIN=cmd&0x8000;
		cmd<<=1;
		SCLK=0;
	}
}
void write_ADS1118(int dat)
{
	CS=0;
	_nop_();
	SCLK=0;
	_nop_();
	write_ADS1118_bit(dat);
	CS=1;
	
}

5.读取

int read_ADS1118()
{
	int i,temp;
	CS=0;
	_nop_();
	SCLK=0;
	_nop_();
	for(i=0;i<16;i++)
	{
		SCLK=1;
		temp<<=1;
		if(DOUT)
		temp|=0x01;
	  SCLK=0;
	}
	CS=1;
	_nop_();
	SCLK=0;
	_nop_();
	SCLK=1;
	_nop_();
	DOUT=0;
	_nop_();
	DOUT=1;
	_nop_();
	return temp;
}

6.数据处理

float read2;//获取小数部分
int read3;//取整
void data_dispose()
{
	int read1;
	read1=read_ADS1118();
	read2=read1*4.096*10/32767;//*10为了获得小数点后一位
	read3=read2;
}

7.main.c

void main()
{
  ADS1118_INIT();
   while(1)
	{
      read_ADS1118();
      data_dispose();
      }
}

二、LCD12864显示

1.写入命令

void write_cmd(uchar cmd)//12864写入命令
{
	RS=0;
	RW=0;
	EN=0;
	P0=cmd;
	delayms(5);
	EN=1;
	delayms(5);
	EN=0;
}

2.初始化

void lcd_init()//12864初始化
{
	PSB=1;

	write_cmd(0X30);

	write_cmd(0x0c);

	write_cmd(0x01);

}

3.写入数据

void write_dat(uchar dat)//12864写入数据
{
	RS=1;
	RW=0;
	EN=0;
	P0=dat;
	delayms(5);
	EN=1;
	delayms(5);
	EN=0;
}	

4.确定字符位置

void lcd_pos(uchar X,uchar Y)//确认位置
{
	uchar pos;
	if(X==0)//第一行
	{X=0X80;}
	else
		if(X==1)//第二行
		{X=0X90;}
	else
		if(X==2)//第三行
		{X=0X88;}
	else
		if(X==3)//第四行
		{X=0X98;}
		pos=X+Y;
		write_cmd(pos);
}

5.字符输入

void lcdprintstr(uchar *str)
{
	while(*str!='\0')
		 write_dat(*str++);
}

6.显示

void LCDdisplay1()//显示固定不变的值
{
	
	
 
	write_cmd(0x01);	
	lcd_pos(0,0);
	lcdprintstr("ADS1118");
	lcd_pos(1,0);
	lcdprintstr("电压");

	lcd_pos(2,0);
	lcdprintstr("123");	
	lcd_pos(3,0);
	lcdprintstr("LCD12864");
}


void LCDdisplay2()//显示数据读取之后的值
{
int q,w;
	q=read3/10;
	w=read3%10;
		lcd_pos(1,3);
	write_dat(qaz[q]);
	lcdprintstr(".");

	write_dat(qaz[w]);
	lcdprintstr("V");
}

LCD12864主程序

void main()
{
  lcd_init();
  LCDdisplay1();
while(1)
{
LCDdisplay2();
}
}

三、程序集合

#include <stc15.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code qaz[]={"0123456789"};
sbit SCLK=P3^0;
sbit DOUT=P3^1;//数据输出,数据由ADS1118发出到单片机
sbit DIN=P3^2;//数据输入,数据由单片机发出
sbit CS=P3^3;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P1^2;
sbit PSB=P2^6;
float read2;
int read3;
void ADS1118_INIT()
{
	SCLK=0;
	CS=1;
	DIN=0;
}
void delayms(int x)
{
	int i,j;
	for(i=0;i<x;i++)
	for(j=0;j<120;j++);
}

void write_ADS1118_bit(int cmd)
{
	int i;
	for(i=0;i<16;i++)
	{
		SCLK=1;
		DIN=cmd&0x8000;
		cmd<<=1;
		SCLK=0;
	}
}
void write_ADS1118(int dat)
{
	CS=0;
	_nop_();
	SCLK=0;
	_nop_();
	write_ADS1118_bit(dat);
	CS=1;
	
}
int read_ADS1118()
{
	int i,temp;
	CS=0;
	_nop_();
	SCLK=0;
	_nop_();
	for(i=0;i<16;i++)
	{
		SCLK=1;
		temp<<=1;
		if(DOUT)
		temp|=0x01;
	  SCLK=0;
	}
	CS=1;
	_nop_();
	SCLK=0;
	_nop_();
	SCLK=1;
	_nop_();
	DOUT=0;
	_nop_();
	DOUT=1;
	_nop_();
	return temp;
}


void data_dispose()
{
	int read1;
	
	read1=read_ADS1118();
	read2=read1*4.096*10/32767;
	read3=read2;
}
//LCD12864//
void write_cmd(uchar cmd)//12864写入命令
{
	RS=0;
	RW=0;
	EN=0;
	P0=cmd;
	delayms(5);
	EN=1;
	delayms(5);
	EN=0;
}
void write_dat(uchar dat)//12864写入数据
{
	RS=1;
	RW=0;
	EN=0;
	P0=dat;
	delayms(5);
	EN=1;
	delayms(5);
	EN=0;
}	
void lcd_pos(uchar X,uchar Y)//确认位置
{
	uchar pos;
	if(X==0)
	{X=0X80;}
	else
		if(X==1)
		{X=0X90;}
	else
		if(X==2)
		{X=0X88;}
	else
		if(X==3)
		{X=0X98;}
		pos=X+Y;
		write_cmd(pos);
}
void lcd_init()//12864初始化
{
	PSB=1;

	write_cmd(0X30);

	write_cmd(0x0c);

	write_cmd(0x01);

}
void lcdprintstr(uchar *str)
{
	while(*str!='\0')
		 write_dat(*str++);
}
void LCDdisplay1()
{
	
	
 
	write_cmd(0x01);	
	lcd_pos(0,0);
	lcdprintstr("ADS1118");
	lcd_pos(1,0);
	lcdprintstr("电压");

	lcd_pos(2,0);
	lcdprintstr("123");	
	lcd_pos(3,0);
	lcdprintstr("LCD12864");
}
void LCDdisplay2()
{
	int q,w;
	q=read3/10;
	w=read3%10;
		lcd_pos(1,3);
	write_dat(qaz[q]);
	lcdprintstr(".");

	write_dat(qaz[w]);
	lcdprintstr("V");
}

void main()
{
	lcd_init();
	ADS1118_INIT();
	LCDdisplay1();
	while(1)
	{
		write_ADS1118(0x428b);//采用AIN0-GAD端口,FSR为4.096V,连续转换模式,128SPS传输速率
                               //ADC模式 
		 read_ADS1118();
		data_dispose();
		LCDdisplay2();
	}
}


总结

本文基于51单片机编写,准确说是基于STC15F2K61S2单片机编写,LCD12864显示了,ADS1118介绍或者LCD12864介绍请参阅其他文章。若有错误,请联系我指正。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶1234

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值