车辆超载检测仿真原理图如下
电子地秤单片机源程序如下:
//线性区间标度变换公式: y=(115-15)/(243-13)*X+15kpa
#include
#include
#include
#define R24C04ADD 0xA1
#define W24C04ADD 0xA0
//ADC0832的引脚
sbit ADCS =P2^2; //ADC0832 chip seclect
sbit ADDI =P2^4; //ADC0832 k in
sbit ADDO =P2^4; //ADC0832 k out
sbit ADCLK =P2^3; //ADC0832 clock signal
sbit SDA = P2 ^ 1; //数据线
sbit SCL = P2 ^ 0; //时钟线
bit bAck; //应答标志 当bbAck=1是为正确的应答
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];
unsigned int temp;
unsigned char getdata; //获取ADC转换回来的值
void delay_1ms(void) //12mhz delay 1.01ms
{
unsigned char x,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void display(void) //数码管显示函数
{
char k;
for(k=0;k<4;k++)
{
P1 = dispbitcode[k];
P0 = dispcode[dispbuf[k]];
if(k==1) //加上数码管的dp小数点
P0&=0x7f;
delay_1ms();
}
}
/************
读ADC0832函数
************/
//采集并返回
unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
{
unsigned char i=0;
unsigned char j;
unsigned int dat=0;
unsigned char 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;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
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|=ndat;
return(dat); //return ad k
}
//启动I2C总线,即发送起始条件
void StartI2C()
{
SDA = 1; //发送起始条件数据信号
_nop_();
SCL = 1;
_nop_(); //起始建立时间大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0; //发送起始信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; //时钟操作
_nop_();
_nop_();
}
//结束I2C总线,即发送I2C结束条件
void StopI2C()
{
SDA = 0; //发送结束条件的数据信号
_nop_(); //发送结束条件的时钟信号
SCL = 1; //结束条件建立时间大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1; //发送I2C总线结束命令
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//发送一个字节的数据
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt = 0;BitCnt < 8;BitCnt++) //一个字节
{
if((c << BitCnt)& 0x80) SDA = 1; //判断发送位
else SDA = 0;
_nop_();
SCL = 1; //时钟线为高,通知从机开始接收数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
_nop_();
_nop_();
SDA = 1; //释放数据线,准备接受应答位
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
if(SDA == 1) bAck =0;
else bAck = 1; //判断是否收到应答信号
SCL = 0;
_nop_();
_nop_();
}
//接收一个字节的数据
unsigned char RevByte()
{
unsigned char retc;
unsigned char BitCnt;
retc = 0;
SDA = 1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL = 0; //置时钟线为低,准备接收
_nop_();
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』