×
单片机 > 单片机程序设计 > 详情

基于单片机的车辆超载监测系统

发布时间:2020-06-18 发布时间:
|

车辆超载检测仿真原理图如下

电子地秤单片机源程序如下:


//线性区间标度变换公式:    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_();



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址