参考了书籍《传感器计算及应用》第三章力敏传感器的电路图和代码
仿真后乱码,不知是什么原因
烧录代码如下
#include <reg51.H> //单片机SFR头文件
#include "intrins.h" //内部函数头文件
#define uint unsigned int //定义无符号整型变量uint
#define uchar unsigned char //定义无符号字符变量uchar
//ADC0832的引脚
sbit ADCS = P2^0; //ADC0832片选
sbit ADDI = P3^7; //ADC0832数据输入
sbit ADDO = P3^7; //ADC0832数据输出
sbit ADCLK = P3^6; //ADC0832时钟
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}; //共阳数码管字段码
unsigned char dispbuf[4];//显示缓冲区,存放显示值
uint temp;//数据暂存单元
uchar getdata; //获取ADC转换后的数据
void delay_1ms(void) //延时函数
{
unsigned char x, y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void display(void) //数码管显示函数
{
char k;//4位数码管循环显示控制变量
for(k=0;k<4;k++)//4位数码管循环显示
{
P1 = dispbitcode[k];//显示位控制
P0 = dispcode[dispbuf[k]];//显示内容
if(k==1)//加上数码管的dp小数点
P0 &= 0x7f;//共阳极数码管,低电平小数点亮
delay_1ms();
}
}
/************读ADC0832函数************/
unsigned int adc0832(unsigned char channel)//A-D转换,返回结果
{
uchar i=0;//控制接收第一字节数据
uchar j;//控制接收第二字节数据
uint dat=0;//存放16位数据
uchar ndat=0;//存放第二字节8位数据
if(channel==0) channel=2;//0通道输入10
if(channel==1) channel=3;//1通道输入11
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;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)//循环接收ADC0832转换的8位数据
{
dat |= ADDO;//接收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat <<= 1;//数据移位
if(i==7) dat |= ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j = j | ADDO;//接收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j = j << 7;
ndat = ndat | j;
if(i<7) ndat >>= 1;
}
ADCS=1;//拉高CS端(原注释写错,这里修正注释)
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat <<= 8;//dat左移8位
dat |= ndat;//dat或运算ndat,形成16位数据
return(dat); //返回结果
}
void main(void) //主程序
{
while(1)
{
unsigned int temp;//压力值暂存单元
float press;//压力数据
getdata=adc0832(0);//获得0通道转换数据
if(getdata>14 && getdata<243) //修正原语法错误:if(14<getdata<243) C语言不支持这种写法
{
//当值介于15~115kPa时,遵循下列补偿变换,否则,为越界
int vary=getdata;
//y=(115-15)/(243-13)*X+15 kPa
press=((10.0/23.0)*vary)+15;//实际补偿值根据实际情况改变
temp=(int)(press*10);//放大10倍,便于后面的计算
dispbuf[3]=temp/1000;//取压力值百位
dispbuf[2]=(temp%1000)/100;//取压力值十位
dispbuf[1]=((temp%1000)%100)/10;//取压力值个位
dispbuf[0]=((temp%1000)%100)%10;//取压力值十分位
display();
}
}
}不知道该如何解决?感谢您的回复
|