提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
最近学习了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介绍请参阅其他文章。若有错误,请联系我指正。