⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm-801.c

📁 这是一个成熟的用于处理压力传感器输出的模拟信号的程序.
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include "TypeDefines.h"
#include "delay.h"
#define STOP 0
#define START 1
#define POSITIVE 0						//定义正向(推力)
#define NEGATIVE 1						//定义反向(拉力)
#define ADJUST 0xaa						//校准判定值
/****************************************
***I/O口定义
*****************************************/
sbit sda=P1^0;
sbit rclk=P1^1;
sbit sclk=P1^2;
sbit stop=P2^0;
sbit ad_CLK=P2^5;
sbit ad_CS=P2^7;
sbit ad_DO=P2^6;
sbit conrtol=P1^6;
sbit ZERO=P3^5;

/*******************************************
***函数声明
*********************************************/
void disp(uint disp_dat);									//显示函数
uint ad_read(uchar flag) reentrant;							
uint lvbo(uint *buf) reentrant;
void delay_xus(uchar x);
void delay_xms(uint x);
/********************************************
***数据表
********************************************/
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //7段字码表"0"~"9"

/*******************************************
***全局变量
*********************************************/
uint old_result=0;
uint new_result=0;
uint adj=0;
uchar polar=0;
uchar adj_way=POSITIVE;
/*******************************************
***主函数
*********************************************/
void main(void)
{

	TMOD=0x11;
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET1=1;	
	delay_xms(1000);
	adj=ad_read(ADJUST);
	TR1=1;
	for(;;)
	{
		if(ZERO==0)
			{
				delay_xms(30);
				if(ZERO==0)
					{
						adj=ad_read(ADJUST);
					}
			}
	}
	
}
/********************************************
***显示函数
**********************************************/
void disp(uint disp_dat)
{
	uchar i,j,dat;
	for(j=0;j<4;j++)
	{
		dat=table[disp_dat%10];
		for(i=0;i<8;i++)
		{
			dat<<=1;
			if(CY)
				sda=1;
			else
				sda=0;
			sclk=0;
			sclk=1;
		}
		disp_dat/=10;
	}

	if(polar==POSITIVE)											//显示正负号(正:显示”0“,负:显示”-“)
		{
			dat=table[0];
		}
	else
		{
			dat=0xbf;
		}
			for(i=0;i<8;i++)
			{
				dat<<=1;
				if(CY)
					sda=1;
				else
					sda=0;
				sclk=0;
				sclk=1;
			}
	rclk=0;
	rclk=1;
}

/**********************************************
***A/D采样函数
**********************************************/
uint ad_read(uchar flag) reentrant
{
	ulong temp=0;
	uint dat[9]={0};
	uchar i=0,j=0;
	ad_CLK=0;
	for(j=0;j<9;j++)
	{
		ad_CS=0;
		_nop_();
		ad_CLK=1;
		_nop_();
		ad_CLK=0;
		_nop_();
		ad_CLK=1;
		_nop_();
		ad_CLK=0;
		_nop_();
		ad_CLK=1;
		_nop_();
		ad_CLK=0;
		_nop_();
		for(i=0;i<12;i++)
			{
				ad_CLK=1;
				dat[j]=dat[j]<<1;
				if(ad_DO)	
					dat[j]++;
				ad_CLK=0;	
				_nop_();
			}
		ad_CS=1;
		ad_CLK=1;
		delay_xus(70);
	}
	
	temp=lvbo(dat);	
	if(flag==ADJUST)
		{
			temp*=10000;
			temp/=4096;
		}
	if(flag!=ADJUST)
		{
			temp*=10000;
			temp/=4096;
			
			if(temp>=adj)
				{
					temp=temp-adj;
					polar=POSITIVE;
				}
			else
				{
					temp=adj-temp;
					polar=NEGATIVE;
				}
		//	temp=temp*2000;
		//	temp=temp/912;
			temp=temp*1000;
			temp=temp/945;
			if(temp<50)
				{
					//temp=0;
				}
			else
				{
					temp=temp-30;
				}
		}

	return (uint)temp;		
}

/****************************************************
***中值滤波
*****************************************************/
uint lvbo(uint *buf) reentrant
{
	uint temp=0;
	uchar i,j;
	for(i=0;i<8;i++)
	{
		for(j=i+1;j<9;j++)
		{
			if(buf[i]>buf[j])
				{
					temp=buf[i];
					buf[i]=buf[j];
					buf[j]=temp;
				}
		}
	}
	temp=buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7];
	temp=temp/7;
	return temp;
}



/**********************************************
***time1中断
***********************************************/
void timer1() interrupt 3
{
	static uchar disp_time=0;

	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	disp_time++;
	if(disp_time==4)
		{
			disp_time=0;
			new_result=ad_read(0);
//********************************************		
			if(new_result < old_result)
				{
					if(new_result<100)
						{
							TR1=0;
							delay_xms(1000);
							old_result=new_result;
							TR1=1;
						}
					else
						new_result=old_result;
				}
			else
				{
					old_result=new_result;
				}
//*************************************************/		
			disp(new_result);
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -