📄 max147.c
字号:
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
#define WEI P2
#define DUAN P0
code uchar display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
data uchar Disp_Data[4]={0,0,0,0};
idata uint D_Temp[10]={0,0,0,0,0,0,0,0,0};
idata float D_Temp1[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
sbit START=P3^2;
/*************变量定义******************/
float Vref=2.5;
bit End_Flag=0;
/*************函数声明******************/
void delay(uchar j);//
void Data_Process(void);
void led_display(void);
void Wr_Contrl_Byte(uchar CB);
/**************************************/
sbit SCLK = P1^0; //串行时钟
sbit CS = P1^1; //片选端
sbit DIN = P1^2; //串行数据输入
sbit SSTRB = P1^3; //输出闸门
sbit DOUT = P1^4; //串行数据输出
/***************************************/
void delay(uchar j)
{ register i;
while(j--)
{
for(i=0;i<125;i++)
{;}
}
}
/***************************************/
void Wr_Contrl_Byte(uchar CB)
{
uchar i;
CS=0;
for(i=0;i<8;i++)
{
SCLK=0;
DIN=0;
if((CB<<i)&0x80)DIN=1;
SCLK=1;
nop();
nop();
nop();
}
CS=1;
}
/***************************************/
uint Re_Data(void)
{
uint Con_Data=0;
uchar i;
CS=0;
Con_Data=0;
DOUT=1;
for(i=0;i<12;i++)
{
SCLK=0;
nop();
nop();
nop();
SCLK=1;
Con_Data<<=1;
if(DOUT)
{Con_Data|=0x01;}
}
CS=1;
return Con_Data;
}
/***************************************/
void Data_Process(void)
{
uchar i;
float tt;
uint dispnumber;
if(End_Flag)
{
for(i=0;i<10;i++)
{
D_Temp1[i]=2.0*(D_Temp[i]*Vref)/4095.0;
}
tt=(D_Temp1[0]+D_Temp1[1]+D_Temp1[2]+D_Temp1[3]+D_Temp1[4]+D_Temp1[5]+D_Temp1[6]+D_Temp1[7]+D_Temp1[8]+D_Temp1[9])/10.0;
//计算数字量对应的电压值(单极性×2)
tt*=1000.0; //电压放大1000倍,显示到
dispnumber=(uint)tt;
Disp_Data[0]=dispnumber/1000;
Disp_Data[1]=dispnumber%1000/100;
Disp_Data[2]=dispnumber%1000%100/10;
Disp_Data[3]=dispnumber%1000%100%10;
End_Flag=0;
}
}
/**************************************/
void led_display(void)
{
uchar i,j,k;
uchar *p,*q;
p=&Disp_Data[0];
q=display;
k=0x08;
for(i=0;i<4;i++)
{
WEI=k;
j=*(p+i);
DUAN=*(q+j);
if(i==0)
{DUAN|=0x80;}
k>>=1;
delay(1);
}
}
/**************************************/
void main(void)//主程序
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TMOD=0x01;
ET0=1;
EA=1;
while(1)
{ if(!START)
{
delay(5);
while(!START);
TR0=1;
}
Data_Process();
led_display();
}
}
void timer0(void)interrupt 1
{
static uchar cnt;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
Wr_Contrl_Byte(0xce); //10001110:通道0,单极单端输入,内部时钟模式
D_Temp[cnt]=Re_Data();
cnt++;
if(cnt==10)
{
cnt=0;
End_Flag=1;
TR0=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -