要求
用两片单片机进行通信,其中甲机外接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: