您的当前位置:首页正文

STC12C5616AD来测电压

2024-01-03 来源:易榕旅网


/**************************main.c***************************/

#include

#include\"LCD1602.h\"

#include\"stdio.h\"

#include\"intrins.h\"

#define uint unsigned int

#define uchar unsigned char

sbit ya=P1^2;

uchar table1[]={\"fengsu: . m/s\

uchar table2[16]=\"dianyazhi: . V\";

/*得到A/D转换的数据结果********************************/

uint AD_get(uchar channel)

{

uchar AD_finished=0;

int result;

ADC_CONTR|=channel;

ADC_CONTR|=0x08;

while(AD_finished==0)

{

AD_finished=(ADC_CONTR&0x10);

}

result=ADC_DATA*4+ADC_LOW2;

ADC_CONTR&=0xe7;

return(result);

}

/*得到AD转换的电压结果*********************************/

float AD_work(uchar channel)

{

float AD_val=0;

uchar num;

for(num=0;num<100;num++)

AD_val=AD_val+AD_get(channel);

AD_val/=100;

AD_val=(AD_val*5)/1024;

return AD_val;

}

/*uint/D初始化***********************************************/

void AD_init()

{

P1M0=0x0f;

P1M1=0x0f;

ADC_CONTR=0xe0;

delayms(100);

}

void main()

{

float z;

LCD_init();

AD_init();

ya=1;

while(1)

{

z=AD_work(1); //AD转化通道一

z=(z*1000*3);

table1[11]='0'+(int)z%100/10;

table1[10]='0'+(int)z%1000/100;

table1[8]='0'+(int)z%10000/1000;

table1[7]='0'+(int)z%100000/10000;

displayLCD(0x80,table1); //液晶显示

delayms(1000);

z=z/1.5;

table2[13]='0'+(int)z%100/10;

table2[12]='0'+(int)z%1000/100;

table2[10]='0'+(int)z%10000/1000;

displayLCD(0xc0,table2);

delayms(1200);

}

}

/***************************LCD1602.h******************************/

#ifndef __LCD1602_H__

#define __LCD1602_H__

#define uint unsigned int

#define uchar unsigned char

#define LCDDATA P2

sbit RS = P1^5; //数据/命令选择端(H/L)

sbit RW = P1^6; //读/写选择端(H/L)

sbit EN = P1^7; //使能信号

sbit BUSY = P2^7; //用于检测LCD状态字中的FB标识

//**********************************************************

//延时函数

//**********************************************************

void delayms(uint x) //约1ms延时

{

uint i,j;

for(i = x; i > 0; i --)

for(j = 114; j > 0; j --);

}

//**********************************************************

//读状态

//**********************************************************

//时序:RS=L, RW=H, E=H

void readstate(void)

{

LCDDATA = 0xFF;

do

{

EN = 0;

RS = 0;

RW = 1;

EN = 1;

}while (BUSY == 1); //读数据D7引脚状态

EN = 0;

}

//**********************************************************

//写命令

//**********************************************************

//时序:RS=L, RW=L, D0~D7=指令码,E=H, E=L.

void write_com(uchar com)

{

readstate();

EN = 0;

RS = 0;

RW = 0;

LCDDATA = com;

EN = 1;

EN = 0;

}

//**********************************************************

//写数据

//**********************************************************

//时序:RS=H, RW=L, D0~D7=数据,E=1, E=0.

void write_data(uchar date)

{

readstate();

EN = 0;

RS = 1;

RW = 0;

LCDDATA = date;

EN = 1;

EN = 0;

}

//**********************************************************

//初始化1602液晶屏

//**********************************************************

void displayLCD(uchar add, uchar *p)

{

write_com(add);

while (*p != '\\0') //判断字符串结束标志\\0

{

write_data(*p ++);

}

}

void LCD_init(void)

{

delayms(15); //等待上电稳定

write_com(0x38); //功能设置:数据长度为8位,

delayms(5); // 双行显示,5*7点阵字体

readstate(); //读状态

write_com(0x38); //功能设置:数据长度为8位,

readstate(); // 双行显示,5*7点阵字体

write_com(0x08); //显示关闭:关闭显示

readstate();

write_com(0x01); //清除显示屏:清屏,光标归位

readstate();

write_com(0x06); //输入方式:文字不动,光标自动

readstate(); // 右移

write_com(0x0C); //显示开及光标:显示器开、

}

#endif

因篇幅问题不能全部显示,请点此查看更多更全内容