(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;
}
}
}
#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;
}
}
}
相关文章推荐
- (3)基于51单片机电压表的程序
- 基于51单片机的74HC164驱动六位数码管动态显示程序
- 基于51单片机及DS18B20温度传感器数码管显示程序
- 基于51单片机的NRF905收发程序
- 基于51单片机和数码管的万年历程序
- 基于51单片机的可控硅调压调光程序-带过零检测
- 基于51单片机及DS18B20数字温度计设计(课程设计+原理图+程序+仿真)
- (1)设计基于51单片机的电压表
- 基于51单片机 红绿灯数码管程序
- 基于51单片机矩阵键盘程序
- 基于Java语言的51单片机串口通讯PC机程序
- 基于51单片机的简单交通灯程序
- 基于51单片机的计算器程序
- 基于Java语言的51单片机串口通讯PC机程序
- C++:基于LL(1)方法的语法分析程序-2
- 个人作业1——四则运算题目生成程序(基于控制台)
- 51单片机程序参考大全
- 基于51单片机的脉搏测量仪
- 基于51单片机的99-00倒计时秒表
- 51单片机A/D转换接口扩展,做一个16进制显示的电压表