标题:
干簧管式流量传感器单片机驱动程序
[打印本页]
作者:
zuozuozuo111
时间:
2017-5-8 22:20
标题:
干簧管式流量传感器单片机驱动程序
干簧管交叉排列,单片机读取电压值,自己实际标定之后转换为流量值
0.png
(50.31 KB, 下载次数: 34)
下载附件
2017-5-8 22:36 上传
单片机源程序:
#include "stc12c5a60s2.h"
#include "string.h" //字符串长度
#include "intrins.h" //_nop_或者移位操作
#include "stdio.h"
#define ADC_PWR 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDA 0x60 //不同的值可以改变转换速度
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit PWM=P2^0;
float AD_Result;//储存AD转换结果
#define uchar unsigned char
#define uint unsigned int
uchar DisplayData[8];
uchar code table[]={ //table[]里面无数字
//共阳极代码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90,
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //后边带分号
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //后无分号,i=xms 即延时约xms毫秒
for(j=110;j>0;j--);//有分号
}
void display(void)
{
unsigned char i;
for(i=0; i<8; i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0 = DisplayData[i];//发送段码
delayms(10); //扫描间隔时间设定
LSA=1;LSB=0;LSC=1; //显示小数点
P0 = 0x80;
delayms(10); //扫描间隔时间设定
P0 = 0x00;//消隐
}
//P0=table[keya];
}
/*
void send(uchar key_num)
{
SBUF=key_num;
while(!TI);
TI=0;
}
*/
void Init_adc()
{
P1ASF=0xff; //P1口为使用AD转换做准备,A/D通道选择,所有的P1口作为转换接口 ,AD使用总开关
ADC_RES=0; //清零AD转换结果寄存器高位
ADC_RESL=0; //清零AD转换结果寄存器低位
ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA;
delayms(1);
}
unsigned int AD_get(uchar channel)
{
ADC_CONTR=ADC_PWR|ADC_START|ADC_SPEEDA|channel; //初始化ADC控制寄存器,(转换速度为90个时钟周期转换一次,模拟输入通道为通道1)
_nop_(); //稳定ADC控制寄存器的值 变channel 值变模拟信号输入口
_nop_();
_nop_();
_nop_();
while((ADC_FLAG&0x10)==0); //查询转换是否结束
ADC_CONTR &= 0xef; //清零ADC_FLAG位
//ADC_CONTR = ADC_CONTR & 0xef;
return (ADC_RES*4+ADC_RESL); //返回转换结果 十位八位寄存器转换 ,去掉 ADC_RES*4则为八位
}
float AD_work(uchar channel) //计算结果
{
float AD_val;
AD_val=(float)AD_get(channel);
AD_val=(AD_val*5)/1023; //1023对应5
return AD_val;
}
main()
{
TMOD=0x01;//定时器0工作方式1?
TH0=(65536-1000)/256;//赋初值定时
TL0=(65536-1000)%256;//1ms
// EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
TMOD=0X20; //定时器1工作方式2
TH1 = 0Xfd; //设定初值
TL1=0xfd;
TR1=1; //启动T1
SM0=0;
SM1=1;
EA=1;
ES=1;
P0=0xff;
Init_adc();
//display();
while(1)
{
AD_Result=AD_work(0);
AD_Result = AD_Result*100;
//DisplayData[4]=DIG_CODE[AD_Result%10000/1000];
DisplayData[5]=table[(int)AD_Result%1000/100];
DisplayData[6]=table[(int)AD_Result%100/10];
DisplayData[7]=table[(int)AD_Result%10/1];
display();
// send(k);
}
}
void tim0() interrupt 1
{
uchar time;
TR0=0;//赋初值时,关闭定时器
TH0=(65536-922)/256;//赋初值定时
TL0=(65536-922)%256;//定时1ms
TR0=1;//打开定时器
time++;
if(time<=10)
PWM=0;//占空比0.1
else
PWM=1;
if(time>=100)
{
PWM = 0;
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整资料下载:
数据读取显示.zip
(33.29 KB, 下载次数: 28)
2017-5-8 22:19 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1