#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);
} |