⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd与ad转换.c

📁 STC几款型号单片机的AD转换设置和AD转换程序示例
💻 C
字号:
/*flashman编写,QQ28479691*/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char  // 0~255
#define uint  unsigned int   // 0~65535

sfr ADCR=0xc5;				//控制寄存器
sfr ADDR=0xc6;				//结果寄存器
sfr P1M0=0x91;
sfr P1M1=0x92;

char code DisV[]={"V:"};//灵敏度
char code DisP[]={"P:"};//精确度

sbit RS=P1^7;
sbit RW=P1^6;
sbit E=P1^5;

void LcdIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void delay();
void DisText(uchar addr,uchar *text);
void ShowNum(uchar addr,uint num);			//在addr处显示数字num
void ShowByte(uchar addr,uchar num);
char AdcVal(uchar n);						//取出单次ADC的值
char AdcValPro(uchar n);					//进行软件滤波后的ADC的值

char data BCD[6];			//十位二进制的显示码分别是千百十个位的显示
char data Adc[2];			//存放Adc转换后的值

void main(void)
{
  SP=0X5F;
  LcdIni();
  DisText(0x80,DisV);
  DisText(0xc0,DisP);
  while(1)
  {
  	ShowByte(0x82,AdcValPro(0));
  	ShowByte(0xC2,AdcVal(1));
  }
}
//-----------------------------------------
//ADC相关程序
char AdcVal(uchar n)
{//软件滤波
	uchar i,k;
	uint tmp=0,val;
	for(i=0;i<20;i++)
		{
			k=AdcValPro(n);
			tmp=(tmp+k)/2;
		}
	val=(uchar)(tmp);
	k=val>Adc[n] ? (val-Adc[n]):(Adc[n]-val);
	Adc[n]=k>0 ? val:Adc[n];
	return Adc[n];
}

char AdcValPro(uchar n)
{//返回第N个ADC的值从0到7
	uchar val;
	P1M0=0x03;
	P1M1=0x03;
	ADCR=0x88+n;
	while((ADCR & 0x10) ==0);
	val=ADDR;
	ADCR=0x00;
	return val;
}
//-----------------------------------------
//LCD相关程序
void ShowNum(uchar addr,uint num)			//在addr处显示数字num
{//将num转化成五个BCD码存放在全局数组BCD[5]中
	uchar i;
	for(i=5;i>0;i--)       //将NUM数据转化成ASCII码,如521会转化为00521
	{
       	  BCD[i-1]=(uchar)(num%10+0x30);     //取出最低位
       	  num/=10;                           //去掉最低位
    }
    i=0;
	while(BCD[i] ==0x30 && i<4) BCD[i++]=' ';    //NUM转换成数组存放,但还没有加上小数点
	BCD[5]='\0';
	DisText(addr,BCD);
}

void ShowByte(uchar addr,uchar num)
{//将num转化成五个BCD码存放在全局数组BCD[5]中
	uchar i;
	for(i=3;i>0;i--)       //将NUM数据转化成ASCII码,如521会转化为00521
	{
       	  BCD[i-1]=(uchar)(num%10+0x30);     //取出最低位
       	  num/=10;                           //去掉最低位
    }
    i=0;
	while(BCD[i] ==0x30 && i<4) BCD[i++]=' ';    //NUM转换成数组存放,但还没有加上小数点
	BCD[3]='\0';
	DisText(addr,BCD);
}

void DisText(uchar addr,uchar *p)
{
	WrOp(addr);
	while(*p !='\0')WrDat(*(p++));
}

void LcdIni()
{
	WrOp(0x38);	
	WrOp(0x28);		
	WrOp(0x06);
	WrOp(0x0E);			//光标加1
}

void WrOp(uchar dat)
{
	ChkBusy();
	RS=0;
	RW=0;
	E=0;
	
	P3=(dat>>4);
	E=1;
	delay();
	E=0;
	
	P3=dat;
	E=1;
	delay();
	E=0;
}

void WrDat(uchar dat)
{
	ChkBusy();
	RS=1;
	RW=0;
	E=0;
	
	P3=(dat>>4);
	E=1;
	delay();
	E=0;
	
	P3=dat;
	E=1;
	delay();
	E=0;
}

void ChkBusy()
{
	uchar dat;
	do
	{
		P3|=0x0f;	//
		RS=0;
		RW=1;
		E=1;
		dat=P3;		//读出P3数据
		E=0;
	
		E=1;
		_nop_();
		E=0;
	}while(dat & 0x08);
}

void delay(void)
{
 	uchar j;
	for(j=0;j<3;j++);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -