ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AD转换及单片机通信

2020-06-26 12:07:48  阅读:264  来源: 互联网

标签:P2 AD int unsigned 甲机 通信 单片机 sbit define


要求

用两片单片机进行通信,其中甲机外接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:
在这里插入图片描述

标签:P2,AD,int,unsigned,甲机,通信,单片机,sbit,define
来源: https://blog.csdn.net/flakjsdfhjka/article/details/106955631

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有