8255接口芯片与ADC0809的的使用

实验目的:利用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);  //显示电压值
			}
	}	 
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书中藏着宇宙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值