程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit OE=P1^0; // 输出允许控制信号
sbit EOC=P1^1; // 转换结束状态信号
sbit ST=P1^2; // 转换启动信号
sbit CLK=P1^3; // 时钟信号
sbit C3=P1^4; //
sbit C2=P1^5; //
sbit C1=P1^6; //
sbit led1=P1^7;//
sbit DR=P3^4;
unsigned int temp;
unsigned char show[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; // 0-9
uint incept_flag,flag,a=0x01,all=1;
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=112;j>0;j--);
}
void display() // 显示程序
{
P3=0X80; //10000000
P0=show[temp/1000]&0X7F;
delay(9);
}
unsigned int ADC0809()
{
unsigned int dat;
ST=0;
ST=1;
_nop_();
ST=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EOC=1;
while(EOC==0);
OE=1;
P2=0XFF; // 设P2口为输入口
dat=P2;
OE=0;
return dat; //输出2V时,数值为255*2/(5-0)=102 01100110 输出1V时,数值为255*1/(5-0)=51 00110011
}
void panduan() //判断闪烁程序
{
if(ADC0809() > 0x66)//2V判断闪烁
{
led1=~led1;
delay(100);
}
else if((ADC0809() > 0x33)&&(ADC0809() <= 0x66)) //1V判断闪烁
{
led1=~led1;
delay(500);
}
else
{led1=1;}
}
void init0() // 初始化程序
{
ET0=1;// 定时器0允许中断
ES=1;
EA=1; // 允许中断
TI=RI=0;
TMOD=0X20; // 设置定时器工作方式为2
SCON=0x50; // 串口工作在模式1
TH1=0xfd;
TL1=0xfd;
PCON|=0x80; // 串口波特率加倍
TH0=0XFF;
TL0=0X0;
TR0=1;
TR1=1; //启动定时器1
REN=1; //允许接收
CLK=1;
ST=0;
OE=0;
C1=0;C2=0;C3=0;
}
void send() //串口发送程序
{
while(all)
{
if(flag)
{
DR=1;
delay(5);
SBUF=a;
while(!TI);
TI=0;
flag=0;
}
DR=0;
}
}
void main()
{
init0();
while(1)
{
temp=ADC0809()*19.53125; //19.53125=5/256*1000 5/256 为精度 乘以1000是为了方便在数码管显示
display();
panduan();
if(ADC0809() > 0x66)
{
flag=1;
send();
}
}
}
void inex_T0() interrupt 1 //中断程序
{
TH0=0XFF;
TL0=0X0;
CLK=!CLK;
}
/***接收数据***/
void incept_data() interrupt 4
{
incept_flag=SBUF;
if(incept_flag)
{
led1=0;
all=0;
}
RI=0;
flag=1;
}
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit OE=P1^0; // 输出允许控制信号
sbit EOC=P1^1; // 转换结束状态信号
sbit ST=P1^2; // 转换启动信号
sbit CLK=P1^3; // 时钟信号
sbit C3=P1^4; //
sbit C2=P1^5; //
sbit C1=P1^6; //
sbit led1=P1^7;//
sbit DR=P3^4;
unsigned int temp;
unsigned char show[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; // 0-9
uint incept_flag,flag,a=0x01,all=1;
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=112;j>0;j--);
}
void display() // 显示程序
{
P3=0X80; //10000000
P0=show[temp/1000]&0X7F;
delay(9);
}
unsigned int ADC0809()
{
unsigned int dat;
ST=0;
ST=1;
_nop_();
ST=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EOC=1;
while(EOC==0);
OE=1;
P2=0XFF; // 设P2口为输入口
dat=P2;
OE=0;
return dat; //输出2V时,数值为255*2/(5-0)=102 01100110 输出1V时,数值为255*1/(5-0)=51 00110011
}
void panduan() //判断闪烁程序
{
if(ADC0809() > 0x66)//2V判断闪烁
{
led1=~led1;
delay(100);
}
else if((ADC0809() > 0x33)&&(ADC0809() <= 0x66)) //1V判断闪烁
{
led1=~led1;
delay(500);
}
else
{led1=1;}
}
void init0() // 初始化程序
{
ET0=1;// 定时器0允许中断
ES=1;
EA=1; // 允许中断
TI=RI=0;
TMOD=0X20; // 设置定时器工作方式为2
SCON=0x50; // 串口工作在模式1
TH1=0xfd;
TL1=0xfd;
PCON|=0x80; // 串口波特率加倍
TH0=0XFF;
TL0=0X0;
TR0=1;
TR1=1; //启动定时器1
REN=1; //允许接收
CLK=1;
ST=0;
OE=0;
C1=0;C2=0;C3=0;
}
void send() //串口发送程序
{
while(all)
{
if(flag)
{
DR=1;
delay(5);
SBUF=a;
while(!TI);
TI=0;
flag=0;
}
DR=0;
}
}
void main()
{
init0();
while(1)
{
temp=ADC0809()*19.53125; //19.53125=5/256*1000 5/256 为精度 乘以1000是为了方便在数码管显示
display();
panduan();
if(ADC0809() > 0x66)
{
flag=1;
send();
}
}
}
void inex_T0() interrupt 1 //中断程序
{
TH0=0XFF;
TL0=0X0;
CLK=!CLK;
}
/***接收数据***/
void incept_data() interrupt 4
{
incept_flag=SBUF;
if(incept_flag)
{
led1=0;
all=0;
}
RI=0;
flag=1;
}