|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;//声明键盘
sbit LED1=P3^2;
sbit LED2=P3^3;
sbit LED3=P3^4;
sbit LED4=P3^5; //数码管位选
sbit dp=P1^4;//小数点
static uchar dispdata[4]; //前三位用来存放由转换结果分离出的各位数字,第四位用来存放通道地址
static float Vi[8];//存放8通道采集的数据
unsigned char code num[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
}; //数码管0-9编码表
void keyscan();//键盘扫描函数声明
void delayus(uint us)//微秒级延时函数
{
while(us--);
}
void delayxms(uint xms)//毫秒级延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*************************************************************************************************************************
**************************************************************************************************************************
AD部分
**************************************************************************************************************************
**************************************************************************************************************************/
uchar ad_action(uchar chn)//读取通道“chn”的AD转换结果(位0-255之间的一个数),chn为0-7,以P0口的低三位作为地址
{
uchar read_data;
XBYTE[0x7ff8+chn]=chn;//向地址指针写地址
delayus(15);
read_data=XBYTE[0x7ff8+chn];//读取AD转换的数据,8位二进制数(读取相应通道的AD转换值)
return read_data;
}
/*****************************************************************************************************************************
**********************************************************************************************************************************
8通道循环采集
***********************************************************************************************************************************
*******************************************************************************************************************************/
void ad0toad7()//将通道 0-7的AD转换结果存入相关数组
{
uchar i;
for(i=0;i<8;i++)
Vi=(ad_action(i)/255.0)*5.0+0.009;//0.009为校准的AD转换误差
}
/**********************************************************************************************************************************
**********************************************************************************************************************************
选择一路通道采集
***********************************************************************************************************************************
************************************************************************************************************************************/
void ad_single(uchar j)
{
Vi[j]=(ad_action(j)/255.0)*5.0+0.009;//0.009为校准的AD转换误差
}
/***********************************************************************************************************************
*********************************************************************************************************************
分离出每位数码管上的数字,并存入相应的数组
*****************************************************************************************************************
*******************************************************************************************************************/
void decodenum(float adv,uchar chn)//两个形参分别为AD转换的结果(十进制形式 )和相应的通道数,是数码管要显示的数,
//通过该函数的第二个形参来控制地址的显示
{
uint temp;
temp=(uint)(adv*100);
dispdata[0]=temp/100;//第一位数码管
dispdata[1]=temp/10%10;//第二位数码管
dispdata[2]=temp%10;//第三位数码管
dispdata[3]=chn;//第四位数码管
}
/*********************************************************************************
********************************************************************************
数码管显示部分
****************************************************************************************
******************************************************************************************/
void dispone(uchar LED,bit ifpoint,uchar number)//number 0-9,数码管显示函数,数码管为共阴极 ,
//从左到右三个形参分别为数码管位选,数码管小数点,数码管位选
{
switch(LED)//数码管位选部分
{
case 0ED1=0;
break;
case 1ED2=0;
break;
case 2ED3=0;
break;
case 3ED4=0;
break;
default3=0xff;//其他情况数码管关闭
}
if(ifpoint)//数码管小数点部分
dp=1;
else
dp=0;
P2=num[number];//数码管位选部分,不含小数点
delayus(300);
P3=0xff;//关闭所有数码管
}
void disp()//数码管显示函数
{
uchar i;
bit point;
for(i=0;i<4;i++)//用for循环实现数码管的动态显示
{
if((i==1)||(i==3))//让第一个小数点和第二个小数点点亮,如果想让第四个也亮,
//可改“(i==1)||(i==3)” 为“i==1”
point=0;
else
point=1;
dispone(i,point,dispdata);
}
}
/**************************************************************************************
***************************************************************************************
主函数
*************************************************************************************
*************************************************************************************/
void main()
{
while(1)
{
keyscan();
}
}
void keyscan()//在键盘扫描函数中调用显示函数
{
uchar flag;
int num;
if(key1==0)
{
delayxms(5);
if(key1==0)
{
num++;
if(num>7)//num大于7时重新归7
num=7;
while(!key1);//等待按键释放
}
ad_single(num);
}
if(key2==0)
{
delayxms(5);
if(key2==0)
{
num--;
if(num<0)//num小于0时重新归0
num=0;
while(!key2);//等待按键释放
}
ad_single(num);
}
if(key3==0)
{
delayxms(5);
if(key3==0)
{
flag=0;
while(!key3);//等待按键释放
}
}
if(key4==0)
{
delayxms(5);
if(key4==0)
{
flag=1;
while(!key4);//等待按键释放
}
}
if(flag==0)
{
ad_single(num);
decodenum(Vi[num],num);
disp();
}
else
{
uint cnt=0;
while(key3)
{
switch(cnt++)
{
case 0:ad0toad7();
break;
case 1:decodenum(Vi[0],0);
break;
case 70:decodenum(Vi[1],1);
break;
case 140:decodenum(Vi[2],2);
break;
case 210:decodenum(Vi[3],3);
break;
case 280:decodenum(Vi[4],4);
break;
case 350:decodenum(Vi[5],5);
break;
case 420:decodenum(Vi[6],6);
break;
case 490:decodenum(Vi[7],7);
break;
case 560:cnt=0;
break;
}
disp();
}
}
}
电子技术课程设计.rar
(1.34 MB, 下载次数: 0)
|
-
|