AD转换及单片机通信

要求

用两片单片机进行通信,其中甲机外接0809芯片进行AD转换,将AD转换结果送至P0端口用4位数码管显示,并将数据发送至乙机;乙机接收甲机发送的数据,和甲机同步显示AD转换结果。

ADC0809芯片

由于芯片介绍篇幅过大这里就,不做详细描述。详情请见ADC0809芯片简介

硬件及连线

在这里插入图片描述
甲机(发射机)代码:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
int display[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int show[4]={0,1,2,3};
sbit OE=P3^4;
sbit EOC=P3^5;
sbit ST=P3^6;
sbit CLK=P3^7;

sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
uint num;

void delay(int x)
{
   int i;
   while(x--)
   {
   	  for(i=0;i<120;i++);
   }
}

void xianshi(uint x)  //显示函数
{
    int i,p_2;    
    x=x*100/51;	  //AD转换值换算为相应电压值
    show[0]=0;//5V用不到这一位
    show[1]=x/100; 
    show[2]=x%100/10;
    show[3]=x%10;  

    p_2=0x01; 

    for(i=0; i<4; i++)
    {
        P0=0x00;	  //清屏,避免重影
        if(i==1)
            P0=display[show[i]]+0x80;  
        else
            P0=display[show[i]];	
        P2=~p_2;				
        p_2=p_2<<1;
        delay(3);
    }
}

void sending(uint i)//发送
{
	SBUF=i;//送给缓冲器
	while(!TI);//发送完毕
	TI=0;//清零
}

void Init()
{
	SCON=0X40;
	PCON=0x00;
	TMOD=0x20;
	TH1=0xFD;
	TL1=0xFD;
	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;	
}

void main()
{
	Init();
	while(1)
	{
		ST=0;
		OE=0;
		ST=1;//启动转换器,                                                                                                                          
		ST=0;//下降沿开始转换
		while(!EOC);//EOC转换完成
		OE=1;//输出允许位有效
		num=P1;
		xianshi(num);//将P3口状态显示
		
		OE=0;//输出关闭
		sending(num);
	} 
}

乙机(接收机)代码:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
int display[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int show[4]={0};
uint num=0;

void delay(int x)
{
   int i;
   while(x--)
   {
   	  for(i=0;i<120;i++);
   }
}
void xianshi()  //显示函数
{
    int i,p_2;
    
    num=num*100/51;	  //AD转换值换算为相应电压值
    show[0]=0;//5V用不到这一位
    show[1]=num/100; 
    show[2]=num%100/10;
    show[3]=num%10;  

    p_2=0x01; 

    for(i=0; i<4; i++)
    {
        P0=0x00;	  //清屏,避免重影
        if(i==1)
            P0=display[show[i]]+0x80;  
        else
            P0=display[show[i]];	
        P2=~p_2;				
        p_2=p_2<<1;
        delay(10);
    }
}

void receive() interrupt 4//接收
{
	if(RI)//接收完毕
		{	
			num=SBUF;//取出数据
			RI=0;//清零
		}
		//xianshi();
} 

void UART_init()
{
	TMOD=0x20;//T1工作方式2
	SCON=0x50;//串行口方式1允许接收
	PCON=0x00;//波特率不加倍
	TH1=0XFD;				//计数器初始值设置,注意波特率是9600的
	TL1=0XFD;
	TR1=1;
	EA=1;
	ES=1;
} 

void main()
{
	 UART_init();
	while(1)
	{
		xianshi();//将P3口状态显示
		
	} 
}

仿真结果

在这里插入图片描述
最大电压位5V:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/flakjsdfhjka/article/details/106955631