您的位置:首页 > 其它

(2)基于51单片机的电压表程序

2011-01-15 23:47 344 查看
#include<reg52.h>
#include <absacc.h>
#include "lcd1602.h"
#include "ad0809.h"
#define IN0 XBYTE[0x7ff8]
#define uint unsigned int
#define uchar unsigned char
#define V20 (20*255)
#define V5 255
//////////位定义//////////////////
sbit KEY=P2^5;
sbit KEY1=P3^2;
///////////////变量定义/////////////
uint num,ch;
uint ad;
uchar ad_adr;
uchar serial_data[4];
uint flag;
uint num1;
//////////////////////////////
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//////////开关扫描///////////////

uint key()
{
if(!KEY)
{
delay(5);
if(!KEY)
{
while(!KEY) ;
num++;
if(num>7)
num=0;
}
}
return num;
}

uint key1()
{
if(!KEY1)
{
delay(5);
if(!KEY1)
{
while(!KEY1) ;
num1++;
if(num1>3)
num1=0;
}
}
return num;
}
/////////////////////////////AD转换,通道ch/////////////////
uint ad0809(uint ch)
{
uchar p;
uchar xdata *ad_adr;
uint ad_result;
ad_adr=&IN0;
ad_adr+=ch;
*ad_adr=0;
p=p;
p=p;
while(EOC==0);
ad_result=*ad_adr;
ad_result=(100*ad_result)/53;
return ad_result;
}

void ad0809_loop(uchar idata *x)
{
uchar i;
uchar xdata *ad_adr;
//uint ad_result;
ad_adr=&IN0;
for(i=0;i<8;i++)
{
//ad_adr+=i;
*ad_adr=0;
i=i;
i=i;
while(EOC==0);
x[i]=*ad_adr;
x[i]=(100*x[i])/53;
ad_adr++;
}
}

////////////////////////////AD显示子程序/////////////////////////
void vShowVoltage(uchar x,uchar y,uint uiNumber)
{
uint ucaNumber[4],uCount;
if(uiNumber>999)
uiNumber=999;
ucaNumber[0]=uiNumber/100; //把计算数字的每个位存入数组。
ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;
ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];
for(uCount=0;uCount<3;uCount++)
{
if(x>117) //每行122列 一般英文占6列 最后一个允许只占5列
{ //剩余不足一个英文 则换行(122-117=5)
x=0;
y++;
if(y>3)
y=0;
}
PrintInt(x,y,ucaNumber[uCount]);
x+=6;
if(uCount==0)
{
PrintEN(x,y,'.');
x+=6;
}
}
}

/////////////////////////////AD采集量程切换/////////////////////
void com_v(uint voltage)
{
long number;
number=40*voltage;
if(number>V20)
{
CH200=1;
CH50=0;
CH5=0;
flag=0;
}
else if(number<V5)
{
CH200=0;
CH50=0;
CH5=1;
flag=1;
}
else
{
CH200=0;
CH50=1;
CH5=0;
flag=2;
}
}

void serial_send_ad(uint uiNumber)
{
if(uiNumber>999)
uiNumber=999;
serial_data[0]=uiNumber/100; //把计算数字的每个位存入数组。
serial_data[1]='.';
serial_data[2]=(uiNumber-100*(int)serial_data[0])/10;
serial_data[3]=uiNumber-100*(int)serial_data[0]-10*serial_data[2];
}
//////////////////////串行通信//////////////////////////////////////
/*static void com(void) interrupt 4 using 1
{
char c;
if(TI!=0)
{
TI=0;
if(ostart!=end)
{
SBUF=outbuf[ostart++&(OLEN-1)];
sendfull=0;
}
else
{
sendactive=0;
}
}
} */
////////////////////////主程序///////////////////////////////////
void main()
{
static uchar idata xx[10];
uint i=0;
num=0;
num1=0;
ad=0;
//////////////////////串口///////////////////
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0xd8;
PCON=0x00;
TR1=1;
Init();
Clean();
while(1)
{
aa: PrintString(0,0,"Select Your Action!");
if (num1==0)
{
PrintString(0,0,"Select Your Action!");
PrintString(0,1," ");
PrintString(0,2," ");
PrintString(0,3," ");
key1();
if(num1==1)
goto aa;
}
else if(num1==1)
{
PrintString(0,0,"Welcome to 00820424!");
PrintString(0,1,"Channel: (T)");
PrintString(0,2," ");
PrintString(0,3,"Voltage: (V)");
while(1)
{
num=key();
PrintInt(6*10,1,num);
ad=ad0809(num);
vShowVoltage(6*10,3,ad);
key1();
if(num1==2)
goto aa;
}
}
else if(num1==2)
{
PrintString(0,0,"Welcome to 00820424!");
PrintString(0,1,"Channel: (T)");
PrintString(0,2,"more Channel for V!");
PrintString(0,3,"Voltage: (V)");
while(1)
{
ad0809_loop(xx);
for(i=0;i<8;i++)
{
vShowVoltage(6*10,3,xx[i]);
}
key1();
if(num1==3)
goto aa;
}
}
if(num1==3)
{

PrintString(0,0,"Welcome to 00820424!");
PrintString(0,1,"Channel: (T)");
PrintString(0,3,"Voltage: (V)");
PrintString(0,2,"Now Serial connect!");
serial_send_ad(ad);
while(serial_data[i]!='/0')
{
SBUF=serial_data[i];
while(TI==0);
TI=0;
i++;
key1();
if(num1==0)
goto aa;
}
key1();
if(num1==0)
goto aa;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: