#include <reg51.h>
#include <main.h>
#include <ad.h>
#include <intrins.h>
#include <stdio.h>
sbit LED1=P1^6; //测试灯
#define AddWr 0x90 //写数据地址
#define AddRd 0x91 //读数据地址
extern bit ack;
unsigned char ReadADC(unsigned char Chl);
bit WriteDAC(unsigned char dat);
u8 SEG[4];
u8 test_flag=0;
code u8 display_duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; //定义段码
code u8 display_wei[4]={0x70,0xB0,0xC0,0xE0}; //定义位码
//1ms定时中断
void Time1_Init()
{
TMOD = 0X10;
TH1 = 0XFC;
TL1 = 0X18;
TR1 = 1;
ET1 = 1;
EA = 1;
}
//纯延时
void Delay_ms(u16 i)
{
u8 j;
for(;i >0;i--)
{
for(j=0;j < 110;j++);
}
}
//数码管显示
void Shu_dispaly(u8 wei,u8 duan)
{
P2=display_wei[wei];
P0=display_duan[duan];
if(wei==3)
{
P0=P0|0x80;
}
}
void main()
{
u8 num,i;
float Voltage_temp; //定义浮点变量
u16 Voltage;
Time1_Init();
LED1=0;
Delay_ms(20);
while(1)
{
if(test_flag)//1S读取一次
{
test_flag=0;
for(i=0;i<5;i++) //连续读5次,取最后一次,以便读取稳定值
num=ReadADC(0); //读取第1路电压值,范围是0-255
Voltage_temp=(float)num*5/256; //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
Voltage=Voltage_temp*1000;
}
SEG[0]=Voltage%10; //个位
SEG[1]=Voltage/10%10;//十位
SEG[2]=Voltage/100%10;//百位
SEG[3]=Voltage/1000%10;//千位
for(i=0;i<4;i++)
{
Shu_dispaly(i,SEG[i]);
Delay_ms(10);
}
}
}
//中断入口:1S
void interrupt_time_1() interrupt 3
{
static u16 Counter=0;
TH1 = 0XFC;
TL1 = 0X18;
Counter++;
if(Counter==1000)
{
LED1=~LED1;
Counter=0;
if(test_flag==0)
{
test_flag=1;
}
}
}
//ADC值读取
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1); //1001 0001 是读命令
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
} |