?? led+0832.c
字號(hào):
/********************************************************
壓力測(cè)試儀
系統(tǒng)描述;輸入 15--115kPA壓力信號(hào)
輸出 00h--ffh數(shù)字信號(hào)(adc0832)
在LCD上顯示實(shí)際的壓力值,如果超限則報(bào)警
線性區(qū)間標(biāo)度變換公式: y=(115-15)/(243-13)*X+15kpa
作者:
單位:
日期:2008.3.7
********************************************************/
#include <reg51.H>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
//ADC0832的引腳
sbit ADCS =P2^0; //ADC0832 chip seclect
sbit ADDI =P3^7; //ADC0832 k in
sbit ADDO =P3^7; //ADC0832 k out
sbit ADCLK =P3^6; //ADC0832 clock signal
unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //位掃描
unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共陽數(shù)碼管字段碼
unsigned char dispbuf[4];
uint temp;
uchar getdata; //獲取ADC轉(zhuǎn)換回來的值
void delay_1ms(void) //12mhz delay 1.01ms
{
unsigned char x,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void display(void) //數(shù)碼管顯示函數(shù)
{
char k;
for(k=0;k<4;k++)
{
P1 = dispbitcode[k];
P0 = dispcode[dispbuf[k]];
if(k==1) //加上數(shù)碼管的dp小數(shù)點(diǎn)
P0&=0x7f;
delay_1ms();
}
}
/************
讀ADC0832函數(shù)
************/
//采集并返回
unsigned int Adc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令結(jié)束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收數(shù)據(jù)
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次時(shí)鐘脈沖
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收數(shù)據(jù)
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次時(shí)鐘脈沖
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void main(void)
{
while(1)
{ unsigned int temp;
float press;
getdata=Adc0832(0);
if(14<getdata<243) //當(dāng)壓力值介于15kpa到115kpa之間時(shí),遵循線性變換
{
int vary=getdata; //y=(115-15)/(243-13)*X+15kpa
press=((10.0/23.0)*vary)+9.3; //測(cè)試時(shí)補(bǔ)償值為9.3
temp=(int)(press*10); //放大10倍,便于后面的計(jì)算
dispbuf[3]=temp/1000; //取壓力值百位
dispbuf[2]=(temp%1000)/100; //取壓力值十位
dispbuf[1]=((temp%1000)%100)/10; //取壓力值個(gè)位
dispbuf[0]=((temp%1000)%100)%10; //取壓力值十分位
display();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -