?? tm-801.c.bak
字號:
#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);
uint lvbo(uint *buf);
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 result=0;
uint adj=0;
uchar polar=0;
/*******************************************
***主函數
*********************************************/
void main(void)
{
TMOD=0x11;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
for(;;)
{
if(ZERO==0)
{
delay_xms(30);
if(ZERO==0)
{
adj=ad_read(ADJUST);
}
}
result=ad_read(0);
}
}
/********************************************
***顯示函數
**********************************************/
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)
{
ulong temp=0;
uint dat[7]={0};
uchar i=0,j=0;
ad_CLK=1;
for(j=0;j<7;j++)
{
ad_CS=0;
_nop_();
ad_CLK=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(50);
}
temp=lvbo(dat);
temp*=5000;
temp/=4096;
if(temp>=2500)
{
temp=temp-2500;
polar=POSITIVE;
}
else
{
temp=2500-temp;
polar=NEGATIVE;
}
if(flag!=ADJUST)
{
if(temp>=adj)
temp=temp-adj;
else
temp=adj-temp;
temp=temp*2;
}
return (uint)temp;
}
/****************************************************
***中值濾波
*****************************************************/
uint lvbo(uint *buf)
{
uint temp=0;
uchar i,j;
for(i=0;i<6;i++)
{
for(j=i+1;j<7;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];
temp=temp/5;
return temp;
}
/**********************************************
***time1中斷
***********************************************/
void timer1() interrupt 3
{
static disp_time=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
disp_time++;
if(disp_time==10)
{
disp_time=0;
disp(result);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -