历史上的今天
今天是:2024年10月29日(星期二)
2019年10月29日 | 基于单片机的车辆超载监测系统
2019-10-29 来源:51hei
车辆超载检测仿真原理图如下

电子地秤单片机源程序如下:
//线性区间标度变换公式: 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_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL = 1; //置时钟线为高使得数据有效 _nop_(); _nop_(); retc = retc << 1; //左移补零
史海拾趣
|
单脉冲序列对双激式开关电源变压器铁心的磁化开关电源原理与设计(连载53) 2-1-1-4.脉冲序列对双激式开关电源变压器铁心的磁化 双激式变压器与单激式变压器的区别主要是两者输入电压的参数不一样。单激式变压器输入的电压是单极性直流脉冲,而双激式变压器输入的电压是双极性交流脉冲。为了简单起见,我们把双激式变压器 ...… 查看全部问答> |
|
数字视频监控系统主要包括DVR、DVS、IP-Camera等,涉及到嵌入式系统技术、视频编解码技术、音频编解码技术、联网及域名处理技术等。硬件对于系统而言,相当于建筑的地基,地基牢,建筑才可靠,才能够经历风风雨雨的考验。 概述 & ...… 查看全部问答> |
|
我做摄像头的数据采集,用CreateFile打开设备,然后调用DeviceIoControl函数,第二个参数需要的是控制CODE,这个CODE需要驱动来提供?不是标准调用吧。如果驱动没有提供读数据的控制CODE,那我是不是就没有办法用DeviceIoControl得到数据了?… 查看全部问答> |
|
driverStudio 生成的驱动程序 实现 IO读写功能 驱动程序代码中两个操作如下: NTSTATUS RW6070Device::RW6070_IOCTL_800_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; //t … 查看全部问答> |
|
RT-Thread开源实时操作系统/STM32F103VB0.3.0b3版本 这个版本更新有些多,RT-Thread/STM32F103VB 0.3.0 beta3更改记录:- 内核,添加IAR EWARM 5.x工程,在内核定义中做相应的平台定义;- 添加文件系统组件DFS,DFS是一套虚拟文件系统(类似Linux的VFS,但几乎不占 ...… 查看全部问答> |
|
有关2812的资料其寄存器都没有地址,所见的都是C语言的头文件,用了结构体和共用体,找不出起物理地址了,想用一段汇编,找不到外设和寄存器的地址,没法编那.谁有这方面的资料?或给指点一下… 查看全部问答> |




