8255接口芯片与ADC0809的的使用
实验目的:利用8255接口芯片和ADC0809实现对模拟电压读取实验电路:详细代码:#include<reg51.h>#include<absacc.h>#define PA_ADDRXBYTE[0x300] //PA口,段码口#define PB_ADDRXBYTE[0x301] //PB口,位扫描口#define PC_ADDRXBYTE[0x302] //PC口,AD
·
实验目的:利用8255接口芯片和ADC0809实现对模拟电压读取
实验电路:
详细代码:
#include<reg51.h>
#include<absacc.h>
#define PA_ADDR XBYTE[0x300] //PA口,段码口
#define PB_ADDR XBYTE[0x301] //PB口,位扫描口
#define PC_ADDR XBYTE[0x302] //PC口,AD转换数据口
#define CMD_ADDR XBYTE[0x303] //8255命令口
sbit start= P1^0; //ADC0809启动信号
sbit adda= P1^1; //通道选择
sbit addb= P1^2;
sbit addc= P1^3;
sbit eoc= P1^4; //转换结束信号
sbit baoj=P3^1;//waring light
sbit buzz=P3^2;//warning voice
sbit xuanzhe=P1^6;//按键选择通道
unsigned char flag=0; //50ms到标志位
unsigned char code SEG[10]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d, 0x07,0x7f,
0x6f};
unsigned char code SEG1[10]={0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd, 0x87,0xff,
0xef};
unsigned char dispbuf[3]={1,1,0}; //显示缓冲区百十个位
void Timer0_Init()
{ TMOD=0x01; //定时器0方式1
TH0=(65536-5000)/256; //定时5ms
TL0=(65536-5000)%256;
ET0=1; //开中断
EA=1;
TR0=1; //开定时器0
}
void Timer0_ISR() interrupt 1 using 0
{
static unsigned char i=0,k=0;
TH0=(65536-5000)/256; //重赋初值
TL0=(65536-5000)%256;
k++;
if(k==10)
{
k=0;
flag=1; //50ms到则flag置1
}
PB_ADDR=0xff; //关闭所有数码管
if(i!=2) PA_ADDR= SEG[dispbuf[i]] ; //送段码
else PA_ADDR= SEG1[dispbuf[i]] ; //最高位显示小数点
PB_ADDR=~(0x01<<i); //送扫描码
i++;
if(i==3)i=0;
// }
}
void display(unsigned int m)
{ dispbuf[2]= m/100 ; //获取百位
dispbuf[1]= m/10%10 ; //获取十位
dispbuf[0]= m%10 ; //获取个位
}
void delay()
{ unsigned char i;
for(i=0;i<120;i++); //延时1ms
}
/*AD转换,里面就是根据时序图进行读取的,
AD0809的驱动设计*/
unsigned char ad_converse() //AD转换函数
{ unsigned char temp;
if(xuanzhe==1)
{addc=0;addb=1; adda=1;} //选择通道6
else
{
addc=1 ; addb=0 ; adda=1;}//选中通道5
start= 1 ;
delay();
start= 0 ; //start信号下降沿锁存通道,启动AD
if(!eoc) ; //等待eoc 变低
if(eoc) ; //等待eoc 变高即转换结束
temp=PC_ADDR; //从PC口读取转换结果到temp
return temp; //返回AD转换结果
}
void main()
{ unsigned int xianzhi_1;
unsigned char adresult;
unsigned int voltage;
CMD_ADDR=0x89 ; //8255初始化,方式0,A口和B口输出,C口输入
Timer0_Init();
buzz=0;
xianzhi_1=250;
while(1)
{
if(flag==1) //判断是否50ms定时到
{flag=0;
adresult=ad_converse(); //启动一次AD转换,结果存到adresult
voltage=PC_ADDR*500.00/256; //数字量转换为电压值
if(voltage>xianzhi_1)// range of waring is yourself setting,this is 2.50V
{baoj=~baoj;
buzz=1;}
else
{
baoj=0;
buzz=0;
}
disp ay(voltage); //显示电压值
}
}
}

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)