代码如下:
#include"reg52.h"
#include"absacc.h"
#include"intrins.h"
#define COM8155 XBYTE [0xFF20]
#define PA XBYTE [0xFF21]
#define PB XBYTE [0xFF22]
#define PC XBYTE [0xFF23]
#define ADC XBYTE [0xFEF3]
unsigned char code table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管数字查找表
sbit CLK=P2^5;
sbit CS=P2^7;
sbit IOM=P2^0;
sbit EO=P3^4;
sbit ADDA=P2^1;
sbit ADDB=P2^2;
sbit ADDC=P2^3; //定义P2^7为8155和AD0809的片选信号段
sbit wr=P3^2;
/*sbit RD=P3^1;*/
unsigned int ADCDat;
unsigned int vot=0;
unsigned int Data[4]={0,0,0,0};
unsigned int KEY;
void AD0809();
void delayms(unsigned int xms);
void Datacaculate(); //一坨函数声明
unsigned char Keyscan();
void Display(unsigned int key);
void DisplayEstimate(unsigned int key);
void delayms(unsigned int xms)
{
unsigned int i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
void Datacaculate() //用于计算数据
{
unsigned int j=0;
Data[0]=0; //数据的存储初始化
Data[1]=0;
Data[2]=0;
Data[3]=0;
vot=0;
AD0809();
delayms(5);
ADCDat=(unsigned int)ADCDat*1000/51;
vot=(unsigned int)ADCDat; //对四次抽样值求平均
Data[0]=vot/1000; //存储最终数据 依次为显示的第一位,第二位,第三位,第四位
Data[1]=vot%1000/100;
Data[2]=vot%100/10;
Data[3]=vot%10;
}
void AD0809() //在PI口加灯验证 读出数据
{
ADC=0; //启动IN0通道
CS=0; //片选信号
RD=1; //初始化OE=0
wr=1; //初始化ST=0 清楚缓冲器中内容
ADDA=0;ADDB=0;ADDC=0;
delayms(5);
wr=0;
delayms(5);
wr=1;
while(!EO);
RD=0;
P1=0XFF;
ADCDat=P1;
delayms(50);
wr=1;
RD=1;
delayms(1);
CS=1;
}
unsigned char Keyscan()
{
unsigned char temp,key=2;
PA=0x7f;
temp=PC;
temp&=0x0f;
if(temp!=0x0f)
{
delayms(10);
temp=PC;
temp&=0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case(0x07): key=4;break;
case(0x0b): key=3;break;
case(0x0d): key=2;break;
case(0x0e): key=1;break;
default : break;
}
}
}
while(temp!=0x0f)
{
temp=PC;
temp&=0x0f;
}
return key;
}
void Display(unsigned int key)
{
unsigned int j=0;
unsigned char dmask=0xbf;
COM8155=0x43;IOM=1;
PB=0xff;
KEY=1;
for(j=0;j<4;j++)
{
for(;KEY<key;KEY++)
{
PA=dmask;
PB=0xc0;
dmask=_cror_(dmask,1);
}
}
PA=dmask;
if(!j)
{
PB=~(table[Data[j]]||0x80);
delayms(50);
}
else
{
PB=~table[Data[j]];
delayms(50);
}
dmask=_cror_(dmask,1);
}
void DisplayEstimate(unsigned int key)
{
if(key==1)
{
if(!Data[0]) //超量程判断 0~0.5v
{
Display(key);
delayms(10);
}
else
{
PA=0xbf;
PB=~table[1];
delayms(10);
}
}
else if(key==2)
{
if(Data[0]<5) //超量程判断 0~5v
{
Display(key);
delayms(50);
}
else
{
PA=0xbf;
PB=~table[1];
delayms(50);
}
}
}
void main()
{
unsigned int Flag=2; //定义量程变量
COM8155=0x43; // 8155工作方式
CLK=0;
EA=1; //开全局中断
TMOD=0x01;
TL0=(65536-24)%256; //T0装载
TH0=(65536-24)/256;
ET0=1; //开T0定时器
TR0=1; // Gate=0 此时 TR0=1 开启定时器0
CS=0;
while(1)
{
Datacaculate();
Flag=Keyscan();
DisplayEstimate(Flag);
delayms(10);
}
}
void T0_time() interrupt 1
{
TL0=(65536-24)%256;
TH0=(65536-24)/256;
CLK=~CLK;
}
在proteus仿真结果是:ad输出端一直是高电平 另一个仿真用定时器中断作为ad的CLK时 无信号输入 (一直是灰色的)
|