标题:
单片机电压表代码 lcd1602显示
[打印本页]
作者:
sxk
时间:
2017-6-25 10:58
标题:
单片机电压表代码 lcd1602显示
电压表代码
0.png
(47.49 KB, 下载次数: 140)
下载附件
2017-6-26 02:36 上传
单片机源程序如下:
/*=======================================================
<<<<<<<<<<<<<<<<<<< 爱普雷德技术团队 >>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<< 我们一起追求卓越 >>>>>>>>>>>>>>>>>>>>
---------------------------------------------------------
官方邮箱: njaplid@163.com
技术QQ1: 535676091
技术QQ2: 1915624375
技术QQ3: 154211813
---------------------------------------------------------
All right reserved.2013.01
---------------------------------------------------------
文件名: main.c
描述: 液晶1602主程序文件
作者:
=========================================================
-----------------------------------------------------------------------------------------------------------*/
#include "LCD1602_drv.h"
#include "ads1115.h"
/**********************************************
功能:
延时函数
输入参数:
n: 延时时长
输出参数:
无
返回值:
**********************************************/
static void Delay(uint16 n)
{
uint16 i;
while(n--)
{
i=200;
while(i--);
}
}
/*---------------------------------------------------------------------------------------------------------*/
/**********************************************
主函数,LCD1602从0显示到1000
**********************************************/
//void main()
//{
// uint16 i;
//
// LCD1602Init(); //液晶1602初始化
// Delay(20); //延时,保证显示更稳定
// ScreenClear(); //清屏
//
// StringPrint(0,0,"zhoudecong");
// Delay(10000);
// ScreenClear(); //清屏
//// StringDisplay(12,0,"周德聪");
// Delay(10000);
// ScreenClear(); //清屏
//
// while(1)
// {
// for(i=0;i<=1000;i++)
// {
// NumDisplay(0,0,i);
// Delay(100);
// }
// }
//}
int main(void)
{
u16 ADS1115_Value;
ADS1115_Port_Init(); // ADS1115端口初始化
LCD1602Init(); //液晶1602初始化
Delay(20); //延时,保证显示更稳定
ScreenClear(); //清屏
InitADS1115();
while(1)
{
ADS1115_Value = ADS1115(0);
ScreenClear(); //清屏
NumDisplay(0,0,ADS1115_Value);
delay_ms(500);
// ADS1115_Value = ADS1115(1);
// ScreenClear(); //清屏
// NumDisplay(0,0,ADS1115_Value);
// delay_ms(5000);
// ADS1115_Value = ADS1115(3);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电压表代码.rar
(99.21 KB, 下载次数: 34)
2017-6-25 10:58 上传
点击文件名下载附件
作者:
daizhi1970
时间:
2017-8-6 18:05
O(∩_∩)O谢谢学习辛苦
作者:
escle
时间:
2017-9-2 18:00
请问,我从哪里设置量程?0-5V,稍微有个电压都报表了
作者:
escle
时间:
2017-9-2 19:34
楼主帮忙看一下,我的测量的数据要么是0xffff 要么是 0x0b58
换算5V量程 4.92 和0.21V,有个很小的电压就显示0XFFFF,
keil u4 +STCI SP (v6.33)+STC12C5A60S2 (40 PIN DIP)
还有个问题,主函数中有一句
InitADS1115(); 但是在子函数中这个需要参数,不知道这一句是否在执行。先出过编译不过,后出的警告
/*********************************************************************************************
函数名:通过串口发送温度与电压随时间变化
上位机软件 LABVIEW 2015
返回值:2字节数据,温度= (高8位*256+低8位)*0.25 ℃
2字节数据 ,电压=(高8位*256+低8位)*0.00007539 V
备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 9600,8,无,1,无 ]
温度传感器芯片 max6675
电压传感芯片 ADS1115
/**********************************************************************************************/
#include <STC12C5A60S2.H>
#include <string.h>
#include<intrins.h >
#include<ads1115.h>
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
//定义全局变量与接口
bit flag;
unsigned char LOW_1;// 存放温度低8位
unsigned char HI_1;//存放温度高8位,其中4位未用
unsigned char LOW_2;// 存放电压低8位
unsigned char HI_2;//存放电压高8位
sbit SO=P0^2;//P0.2 与SO相连 6675
sbit CS= P0^1;//P0.1 与CS相连 6675
sbit SCK=P0^0;//P0.0与SCK相连 6675
unsigned int P_Temp;
sbit SDA= P2^0; //P2.0与SDA相连 1115
sbit SCL= P2^1; //P2.1与SCL相连 1115
// ADDR 与GND相连
// ALRT 空
//
char Channel_Value;
int D_ADS; //转换的数字量
unsigned int Config;
unsigned char Writebuff[4],Readbuff[3];
unsigned int Result[2];
/*********************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
参 数:无
返回值:无
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xFD; //定时器初值高8位设置
TL1 = 0xFD; //定时器初值低8位设置
// PCON = 0x80; //波特率倍频(屏蔽本句波特率为9600)
TR1 = 1; //定时器启动
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口接收中断处理函数
调 用:[SBUF收到数据后中断处理]
参 数:无
返回值:无
结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备 注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量
RI = 0; //令接收中断标志位为0(软件清零)
UART_data = SBUF; //将接收到的数据送入变量 UART_data
flag=1;
//用户函数内容(用户可使用UART_data做数据处理)
//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
//while(TI == 0); //检查发送中断标志位
//TI = 0; //令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口发送函数
调 用:UART_T (?);
参 数:需要UART串口发送的数据(8位/1字节)
返回值:无
结 果:将参数中的数据发送给UART串口,确认发送完成后退出
备 注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:微秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void delay_us (unsigned int a){
unsigned char i;
for(i = 0;i < a;i++)
_nop_();
}
/*********************************************************************************************
函数名:热电偶温度读取
调 用:?=RE_CONVERT()
参 数:无
返回值:温度
结 果:
备 注:
/**********************************************************************************************/
unsigned int Re_Convert() //热电偶转换
{
unsigned int i;
unsigned long Temp_2;
Temp_2=0;
CS = 0; //低电平使能,开始传送数据
delayNOP();
SCK = 1; // 打开时钟
delayNOP();
for(i=16;i>0;i--)// 读取16位数据
{
Temp_2 = Temp_2<<1; // 左移一位
delayNOP();
SCK=1;
if(SO == 1){
Temp_2 = Temp_2|0x0001;} // 若接收到的位为1,则数据的最后一位置1
else
Temp_2 = Temp_2 & 0xffff; // 否则数据的最后一位保持不变,置0(前6行左移自动补0)
delayNOP();
SCK=0; //时钟滴答一次
delayNOP(); //等待数据切换
}
CS=1;// 读数完毕,关闭低电平使能
Temp_2=Temp_2<<1;
Temp_2=Temp_2>>4;
return(Temp_2);
}
/*********************************************************************************************
函数名:数据发送
调 用:DATA_SEND()
参 数:无
返回值:
结 果:
备 注:2字节数据
/**********************************************************************************************/
void DATA_SEND(){
LOW_1=P_Temp&0x000ff;// 获取温度低8位
P_Temp>>=8; //右移位,干掉低8位
HI_1=P_Temp&0x000ff;// 获取温度高8位
LOW_2 =D_ADS&0x000ff;// 获取电压低8位
D_ADS>>=8; //右移位,干掉低8位
HI_2=D_ADS&0x000ff;// 获取电压高8位
UART_T(HI_1); // 发送温度高8位
UART_T(LOW_1); // 发送温度低8位
UART_T(HI_2); // 发送电压高8位
UART_T(LOW_2) ; // 发送电压低8位
}
/******************************************************************************
STM32F103RCT6 Scorpio Ver5.1
By:天星科技
网址:gods-star.com
技术支持:天星科技.com
淘宝网店:gods-star.taobao.com
QQ:3184693939
******************************************************************************/
void ADS1115_Port_Init(void)
{
;
}
void ADS1115_SDAPort_IN(void)
{
;
}
void ADS1115_SDAPort_OUT(void)
{
;
}
///*******************************************
//函数名称:Start
//功 能:完成IIC的起始条件操作
//参 数:无
//返回值 :无
//********************************************/
void Start(void)
{
SCL=1;
SDA=1;
delay_us(15);
SDA=0;
delay_us(15);
SCL=0;
delay_us(15);
}
//
///*******************************************
//函数名称:Stop
//功 能:完成IIC的终止条件操作
//参 数:无
//返回值 :无
//********************************************/
void Stop(void)
{
SDA=0;
delay_us(15);
SCL=1;
delay_us(15);
SDA=1;
delay_us(15);
}
///*******************************************
//函数名称:ACK
//功 能:完成IIC的主机应答操作
//参 数:无
//返回值 :无
//********************************************/
void ACK(void)
{
SDA=0;
delay_us(1);
SCL=1;
delay_us(15);
SCL=0;
delay_us(1);
SDA=1;
delay_us(15);
}
//*******************************************
//函数名称:NACK
//功 能:完成IIC的主机无应答操作
//参 数:无
//返回值 :无
//********************************************/
void NACK(void)
{
SDA=1;
delay_us(1);
SCL=1;
delay_us(15);
SCL=0;
delay_us(1);
SDA=0;
delay_us(15);
}
//**********检查应答信号函数******************/
///*如果返回值为1则证明有应答信号,反之没有*/
///*******************************************
//函数名称:Check
//功 能:检查从机的应答操作
//参 数:无
//返回值 :从机是否有应答:1--有,0--无
//********************************************/
unsigned char Check(void)
{
unsigned char slaveack;
SDA=1;
delay_us(1);
SCL=1;
ADS1115_SDAPort_IN(); // SDA设置为输入
delay_us(15);
slaveack = SDA_IN; //读入SDA数值
SCL=0;
delay_us(15);
ADS1115_SDAPort_OUT(); // SDA设置为输出
if(slaveack) return FALSE;
else return TRUE;
}
/***************Write a Byte****************/
void Write_1_Byte(unsigned char DataByte)
{
int i;
for(i=0;i<8;i++)
{
if(DataByte&0x80) //if((DataByte<<i)&0x80)
SDA=1;
else
SDA=0;
delay_us(15);
SCL=1;
delay_us(15);
SCL=0;
delay_us(15);
DataByte <<= 1;
}
SDA=1;
delay_us(1);
}
/***************Write N Byte****************/
unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
{
int i;
for(i=0;i<n;i++)
{
Write_1_Byte(*writebuffer);
if(Check())
{
writebuffer ++;
}
else
{
Stop();
return FALSE;
}
}
Stop();
return TRUE;
}
//***************Read a Byte****************/
unsigned char Read_1_Byte(void)
{
unsigned char data_Value = 0, FLAG, i;
for(i=0;i<8;i++)
{
SDA=1;
delay_us(15);
SCL=1;
ADS1115_SDAPort_IN(); // SDA设置为输入
delay_us(15);
FLAG=SDA_IN;
data_Value <<= 1;
if( FLAG)
data_Value |= 0x01;
SCL=0;
delay_us(15);
ADS1115_SDAPort_OUT(); // SDA设置为输出
}
return data_Value;
}
//***************Read N Byte****************/
void Read_N_Byte(unsigned int*readbuff, unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
{
readbuff[i]=Read_1_Byte();
if(i==n-1)
NACK(); //不连续读字节
else
ACK(); //连续读字节
}
Stop();
}
//*****************初始化******************/
void InitADS1115(unsigned char S_MUX_0, unsigned char S_MUX_1)
{
if (S_MUX_0 == 0 && S_MUX_1 == 0)
Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
if (S_MUX_0 == 0 && S_MUX_1 == 1)
Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
if (S_MUX_0 == 1 && S_MUX_1 == 0)
Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
if (S_MUX_0 == 1 && S_MUX_1 == 1)
Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;
Writebuff[0]=ADDRESS_W;
Writebuff[1]=Pointer_1;
Writebuff[2]=Config/256;
Writebuff[3]=Config%256;
Readbuff[0]=ADDRESS_W;
Readbuff[1]=Pointer_0;
Readbuff[2]=ADDRESS_R;
}
//***************Write a Word***********************/
void WriteWord(void)
{
int t;
Start(); //写入4个字节
do
{
t=Write_N_Byte(Writebuff,4);
}while(t==0);
}
//***************Read Word***********************/
void ReadWord(void)
{
int t;
Start(); //写入2个字节
do
{
t=Write_N_Byte(Readbuff,2);
}while(t==0);
Start(); //写入2个字节
do
{
t=Write_N_Byte(&Readbuff[2],1);
}while(t==0);
Read_N_Byte(Result,2); //读出2个字节
}
//***************ADS1115********************/
unsigned int ADS1115(unsigned char Channel)
{
unsigned char S_MUX_0, S_MUX_1;
switch(Channel)
{
case 0:
S_MUX_0 = 0;
S_MUX_1 = 0;
Channel_Value = Channel + '0';
break;
case 1:
S_MUX_0 = 0;
S_MUX_1 = 1;
Channel_Value = Channel + '0';
break;
case 2:
S_MUX_0 = 1;
S_MUX_1 = 0;
Channel_Value = Channel + '0';
break;
case 3:
S_MUX_0 = 1;
S_MUX_1 = 1;
Channel_Value = Channel + '0';
break;
default :
break;
}
InitADS1115(S_MUX_0, S_MUX_1);
WriteWord();
DELAY_MS(1);
ReadWord();
D_ADS=Result[0]*256+Result[1]; //转换的数字量
return D_ADS;
}
main(void)
{
unsigned int ADS1115_Value;
ADS1115_Port_Init(); // ADS1115端口初始化
InitADS1115();
UART_init();// 串口初始化
CS=1;
while(1)
{
ADS1115_Value = ADS1115(0); //通道0的数值
P_Temp=Re_Convert(); //获取温度ADC值
DATA_SEND();// 将数据发送出去
DELAY_MS(1000);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1