智能倾角测量系统的C51编程实现
基于单片机的高精度倾角测量系统的设计
基于单片机的高精度倾角测量系统的设计在地质石油勘探、设备安装、道路桥梁建设等工程应用以及机器人控制、坦克和舰船火炮平台控制、飞机姿态控制等系统的自动水平调节中,都需要高精度的倾角测量。
但高精度的倾角,测量设备通常体积较大,成本高,使许多工程应用受到限制。
本文从倾角的高精度测量出发,着重介绍了倾角传感器输出稳定性处理、温度补偿、非线性处理(正弦曲线拟合)、信号调理及其测量电路的特殊处理等。
1 倾角测量系统的硬件设计倾角测量系统硬件部分主要由MEMS 传感器(含双轴倾角传感器和温度传感器)、SOC 电路、数据处理及传输和其他辅助电路等模块组成。
倾角测量系统的组成框图如图1 所示。
1.1 MEMS 倾角传感器接口MEMS 倾角传感器采用芬兰VTI Technologies 公司的SCA100T 系列中的SCA100T-D01,测量范围为±30°。
SCA100T 系列是采用微机电系统(MEMS)技术制造的一款高分辨率双轴倾角传感器。
SCA100T-D01 数字输出分辨率为0.035°/LSB,模拟输出分辨率为0.002 5°。
模拟输出的分辨率大大高于数字输出的分辨率,故本设计采用其模拟输出。
模拟输出将涉及较为复杂的模拟信号处理,如果模拟信号处理不当,系统的分辨率和精度将大打折扣,有时甚至还不如数字输出。
采用合理的模拟信号处理电路是保证系统精度的方法之一。
SCA100T-D01 内置温度传感器,可以通过其自带的SPI 数字接口读取温度值,并在处理器中进行相应的温度补偿。
这是保证系统精度的又一方法。
1.2 阻抗匹配及放大SCA100T-D01 输出阻抗为10 KΩ,为保证MEMS 倾角传感器SCA100T-D01 输出的信号有效地传递,即要求衰减最小,设计中采用了具有高输入阻抗的场效应管型运放TL081 设计了阻抗匹配电路,采用同相输入,以提高输入阻抗。
倾角传感器程序编写指南
SSA0330H1-TTL/232。
单片机: STC89C52RC.6T(双倍速)
晶振:
11.0592M
波特率: 9600
功能: (1)倾角传感器上下限报警指示
(2)倾角传感器频率设置
端口:
上限指示:P0.0,下限指示:P0.1,角度达到上限或者下限,相应端口输出低电
平。
默认报警角度:30 度
程序编写: 硕锋电子
if(RI)//接收中断
{
RX_BUFFER[UART_COUNT++] = SBUF; //读取数据
RI = 0;
OutTime = 1;
//使能超时判断标志!!
OutTimeCount = 150;
//设定超时时间
if(UART_COUNT > 13)
{
UART_COUNT = 0;
wait_flat = 1;
put_char('P');
while(1)
{
DisposeUart();
//接受超时处理
if(1==wait_flat)
//有命令要处理
{
if(RX_BUFFER[0] == 'S',RX_BUFFER[13] == 'P')
{
limitNum = (RX_BUFFER[2]-'0')*10 + (RX_BUFFER[3]-'0');
if('+'==RX_BUFFER[1]) //如果为正
{
DOWN = 1;
if(limitNum >= critical_value){UP = 0;/*在这里可以插入上限报警
基于C51单片机的智能仪器综合设计实验
基于单片机的智能仪器综合设计实验一、实验目的在实验一~实验三的基础上,完成综合设计实验,学会信号采集、数据处理、键盘控制、LCD或LED显示等功能的智能仪器设计。
二、复习与参考实验一~实验三三、设计指标利用K分度号热电偶进行温度检测,测温范围为500-1200ºC,室温为20ºC,用LCD或LED显示室温和测量温度。
具有4路温度信号循环检测功能,通道切换时间可调;具有任意指定通道显示功能。
四、实验要求1.选择传感器,设计硬件电路,包括检测电路、信号调理电路、AD转换电路、单片机最小系统、LED显示(单号)、LCD显示(双号)、独立式按键,画出电路原理图。
2.画出软件流程图。
3.用Keil C51编写程序。
3.实验结果在LCD或LED上显示出来。
4.实验前完成第1、2项备查。
五、实验仪器设备和材料清单PC机;单片机实验板、连接导线、ST7920图形液晶模块Keil c51软件六、实验成绩评定方法实验成绩包括预习、实验完成质量、实验报告质量3部分组成,各部分所占比例分别为30%、40%、30%。
八、实验报告要求实验报告格式:●实验名称●实验目的●实验内容●硬件设计●软件设计●调试过程●参考文献●附1:电路原理图●附2:程序清单附录:实验程序源代码如下:(陈寅)#include "reg51.h"#define THC0 0xee //5ms时间常数设置#define TLC0 0x00sbit ADWR=P3^6; /***WR*****/sbit ADRD=P3^7; /***RD*****/sbit ADCS=P2^7; /***CS*****/sbit EOC=P3^3; /***EOC****/sbit ADA=P1^3; //通道选择引脚sbit ADB=P1^4;sbit ADC=P1^5;sbit CS =P1^0; /****************/sbit SID=P1^1; /**液晶引脚定义**/sbit SCLK=P1^2; /****************/sbit MODE=P2^0; /*************************/sbit UP=P2^1; /*四个按键接口,0表示按下*/sbit DOWN=P2^2; /*************************/sbit LED1=P2^3; /**4个LED灯引脚定义**/sbit LED2=P2^4; /********************/sbit LED3=P2^5; /********************/sbit LED4=P2^6; /********************//***************500~1200°C范围的K分度表,间隔10*******************/ unsigned int code K_TABLE[71]={20644,21066,21493,21919,22346,22772,23198,23624,24050,24476,24902,25327,25751,26176,26599,27022,27445,27867,28288,28709,29128,29547,29965,30383,30799,31214,31629,32042,32455,32866,33277,33686,34095,34502,34909,35314,35718,36121,36524,36925,37325,37725,38122,38519,38915,39310,39703,40096,40488,40897,41296,41657,42045,42432,42817,43202,43585,43968,44349,44729,45108,45486,45863,46238,46612,46985,47356,47726,48095,48462,48828}; unsigned char GetAdData[10]={0}; //存放获得AD值的数组变量unsigned char ViewTemperature[4]={"0000"}; //显示温度缓冲数组变量unsigned MODESelect=1;int ChangeTime=2; //通道切换时间,单位Sint TongDao=1;void delay(unsigned int j){unsigned char i;do{for(i=0;i<100;i++);}while(j--);}void send_command(unsigned char command_data) //发送命令{unsigned char i;unsigned char i_data;i_data=0xf8; //操作命令,可以查看资料delay(10);CS=1;SCLK=0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data=i_data&0x0f;i_data<<=4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void send_data(unsigned char command_data) //发送数据{unsigned char i;unsigned char i_data;i_data=0xfa; //操作命令,可以查看资料delay(10);CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data=i_data&0x0f; //取低四位i_data<<=4; //左移四位,从而变成高四位for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void InitLCD() //液晶初始化{send_command(0x30); //功能设置:一次送8位数据,基本指令集send_command(0x06); //点设定:显示字符/光标从左到右移位,DDRAM地址加1send_command(0x0c); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x04); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x01); //清DDRAMsend_command(0x02); //DDRAM地址归位send_command(0x80); //把显示地址设为0X80,即为第一行的首位}/* x,y为起始座标x(0<=x<=3),y(0<=y<=7),x为行座标,y为列座标;how为要显示汉字的个数;style为显示字符的类型,0表汉字,1表字母;str是要显示汉字的地址*/void Display(unsigned char x,unsigned char y,unsigned char how,bit style,unsigned char *stri) //液晶显示{unsigned char hi=0;if(x==0) send_command(0x80+y);else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);if(style==0){for(hi=0;hi<how;hi++){send_data(*(stri+hi*2));send_data(*(stri+hi*2+1));}}elsefor(hi=0;hi<how;hi++) send_data(*(stri+hi));}float LvBo(void)//复合滤波{unsigned char max,min,i;unsigned int sum=0;float U1;max=GetAdData[0];min=GetAdData[0];for(i=0;i<10;i++){sum=sum+GetAdData[i];if(max<GetAdData[i]) max=GetAdData[i];if(min>GetAdData[i]) min=GetAdData[i];}sum=sum-max-min;U1=(float)sum/8;U1=10.0*((U1*5.0)/255); //换成mvreturn U1;}void search (void)//查表子函数{unsigned int da=0,max,min,mid,j;unsigned int var;da=LvBo()*1000; //u1扩大1000倍da=da+798; //20度max=71;min=0;var=0;while(1){mid=(max+min)/2; //中心元素位置if(K_TABLE[mid]==da) {var=mid*10;break;} //中心元素等于查表元素,计算相应温度else if(K_TABLE[mid]>da) max=mid-1;else min=mid+1;if(max-min==1) /*线性插值计算温度值*/{j=(K_TABLE[max]-K_TABLE[min])/10; /*表中相邻两值对应温度相差10°C*/j=(da-K_TABLE[min])/j;var=10*min+j;break;}if(max==min){if(da>=K_TABLE[min]){j=(K_TABLE[min+1]-K_TABLE[min])/10;j=(da-K_TABLE[min])/j;}else if(da<K_TABLE[min]){j=(K_TABLE[min]-K_TABLE[min-1])/10;j=(da-K_TABLE[min-1])/j;min=min-1;}var=10*min+j;break;}}var=var+500;ViewTemperature[0]=var/1000+0x30;ViewTemperature[1]=var/100%10+0x30;ViewTemperature[2]=var/10%10+0x30;ViewTemperature[3]=var%10+0x30;}void LcdDisplay(void){unsigned char ViewMODESelect,ViewTongDao[5]={"0 "},ViewChangeTime[5]={"00(S)"};ViewMODESelect=MODESelect+0x30;ViewTongDao[0]=TongDao+0x30;if(MODESelect==1||MODESelect==2){if(MODESelect==1) Display(0,3,5,0,":自动切换");else if(MODESelect==2) Display(0,3,5,0,":手动切换");Display(0,0,2,0,"模式"); //液晶显示Display(0,2,1,1,&V iewMODESelect);Display(1,0,5,0,"温度通道:");Display(1,5,5,1,V iewTongDao);Display(2,0,4,0,"温度值:");Display(2,4,4,1,V iewTemperature);Display(2,6,2,1,"℃");}else if(MODESelect==3){ViewChangeTime[0]=ChangeTime/10+0x30;ViewChangeTime[1]=ChangeTime%10+0x30;Display(0,0,2,0,"模式");Display(0,2,1,1,&V iewMODESelect);Display(0,3,5,0,":设置时间");Display(1,0,5,0,"切换时间:");Display(1,5,5,1,V iewChangeTime);Display(2,0,14,1," "); //本行清屏}}void TDSelect(void) //AD通道设置{if(TongDao>=5) TongDao=1;if(TongDao<=0) TongDao=4;if(TongDao==1) {ADC=0;ADB=0;ADA=0;}else if(TongDao==2) {ADC=0;ADB=0;ADA=1;}else if(TongDao==3) {ADC=0;ADB=1;ADA=0;}else if(TongDao==4) {ADC=0;ADB=1;ADA=1;}}main(){unsigned char AdCount=0; //用来存放AD采集次数InitLCD();TMOD=0x11; //定时器0初始化TH0=THC0;TL0=TLC0;TR0=1;ET0=1;EA=1;P2|=0x07; //按键初始为高while(1){ADWR=1; /************/ADCS=0; /************/ADWR=0; /**AD初始化**/ADWR=1; /************/while(!EOC); //等待转换结束ADRD=0;GetAdData[AdCount]=P0; //读取转换结果AdCount++;if(AdCount>=10) //连续采集10次值{AdCount=0;search(); //查表LED1=!LED1;LcdDisplay(); //显示}}}void Timer0() interrupt 1{static unsigned char count=0,UPFlag=1,DOWNFlag=1; //按键标志位static unsigned int TimeCount=0;TH0=THC0;TL0=TLC0;if(MODE==0||UP==0||DOWN==0){count++;if(count>=30) //消抖处理{count=0;if(MODE==0) //按键按下{MODESelect++;if(MODESelect>=4) MODESelect=1;}else if(UP==0){UPFlag=0;if(MODESelect==2){TongDao++;TDSelect();}}else if(DOWN==0){DOWNFlag=0;if(MODESelect==2){TongDao--;TDSelect();}}}}else count=0;if(MODESelect==1){TimeCount++;if(TimeCount>=(ChangeTime*1000/5)){TimeCount=0;TongDao++;TDSelect();}}else if(MODESelect==3){if(UPFlag==0) {UPFlag=1;ChangeTime++;}else if(DOWNFlag==0){DOWNFlag=1;ChangeTime--;if(ChangeTime<=0) ChangeTime=1;}}}。
基于单片机的方位角与倾角测试系统的实现
基于单片机的方位角与倾角测试系统的实现熊明春李积彬王华权徐刚罗飞TheImpfementatiOnOfMCU—basedAzimuthandObIiquity’sMeasUrementXIOngMingchunLjJjbinWangHuaquanXuGangLuoFei摘要:提出了一种基于HT(Holtek)系列l,0型单片机的方位角和倾角的测量方案,分析了系统数据采集、温度补偿、控制和显示的原理,给出了该方案的实现方法。
实验表明,该系统工作稳定可靠,实现了方位角和倾角的自动测试。
关键词:方位角倾角单片机芯片通信汇编算法水平方位角和竖直倾角是杆件在空间定位的基本参数。
方位角的测量一般是以地磁方向作依据,用该原理可测得物件的绝对方位角;倾角的测量依据是重力方向.依此原理设计的传感器有“固体摆”式、“液体摆”式、“气体摆”式三种类型f”。
方位角与倾角是吊车、起重机、火炮、单壁机器人和雷达等两自由度结构的重要参数.该参数的准确获得可以为设备的精确控制提供依据,在这些应用中.方位角没有必要测相对地磁方向的绝对量,因此可用光电编码器或旋转电位器来测量相对方位角,而倾角的测量可用液体摆传感器测得。
随着计算机技术的发展和微型化,特别是单片计算机Mcu(简称单片机,MicroComputerunit)的应用,传感测试技术越趋自动化,方位角和倾角的角度参数应用单片机进行自动采集是一个较好的解决方案。
下面以吊车悬梁的限位控制作为单片机测试系统的一个实现实例。
在吊车悬梁摆动过程中,操作者对水平方向方位角和竖直方向倾角有一定的限制范围,限制范围以外是人群或住宅等危图1方位角与倾角测试系统框图险区。
这就要求要对两个方向的角度参数进行采集,为操作者提供操作依据。
一、系统组成1系统组成框图由单片机、倾角传感器、电位器方位角传感器、温度传感器、~D转换器、数据存储器、键盘编码器、键盘、数码管驱动器和数码管等组成。
整个系统的结构如图1所示。
倾角传感器程序编写指南
倾角传感器程序编写指南编写一个倾角传感器程序需要以下几个步骤:1.硬件设置:首先,需要初始化传感器和进行基本的设置。
这包括选择传感器的量程范围、设置滤波器和采样率等参数。
这些设置根据具体的传感器型号和使用需求来确定。
2.数据采集:接下来,需要实时采集传感器的数据。
通常,倾角传感器会以一定的频率生成数据,我们需要定期读取这些数据。
可以在程序中设置一个循环来实现数据的连续采集。
3.数据处理:一旦成功采集到传感器的数据,就需要对它进行处理。
首先,需要读取加速度计的数值,这些数值反映了物体在X轴和Y轴方向上的加速度。
然后,可以使用数学公式计算出倾角角度。
一种常用的方法是使用反正切函数将加速度计的数值转换为角度值。
4.角度滤波:由于受到噪声和干扰的影响,从传感器中读取到的数据可能会有一些误差。
因此,为了提高测量精度,需要对角度数据进行滤波处理。
常用的滤波算法包括均值滤波、中值滤波和卡尔曼滤波等。
5.显示结果:最后,将测量的倾角角度显示出来。
可以使用图形界面或命令行界面来展示倾角数据。
在实现界面时,可以设置一个刷新频率,将采集到的倾角数据周期性地显示在界面上。
在编写倾角传感器程序时,还需要考虑一些其他因素:1.精度和范围:不同的倾角传感器在精度和量程上可能有所不同。
要根据具体的应用需求来选择合适的传感器,并在程序中进行相应的设置和处理。
2.稳定性和响应时间:倾角传感器的稳定性和响应时间也是需要注意的因素。
在选择传感器和进行数据处理时,要权衡稳定性和响应时间的关系,并做出合适的调整。
3.错误处理:在程序编写过程中,需要考虑到可能的错误情况,并设置相应的错误处理机制。
例如,如果读取到的传感器数据超出了范围,可以给出警告或进行修正。
4.跨平台兼容:如果希望倾角传感器程序能在不同的平台上运行,还需要考虑跨平台兼容性。
这涉及到对不同操作系统和硬件的兼容性测试和适配。
总结起来,编写倾角传感器程序需要对传感器进行硬件设置,实时采集数据,处理数据并进行滤波,最后展示测量结果。
智能倾角测量系统的C51编程实现
本文 智能倾 角测 最系统采 用模 块化 设计 思 想, 为确保 倾 角数据 采集 的稳 定性 和准 确
性 , 采用 HMC1 0 2 2传 感 器 集 成 芯 片 , 通 过
j - 数宁信 号 数 宁 信 号 送 入 A T 8 9 S 5 2 片机 ,
。
s b i t A TP 4 4 = P I 4 : s b i t A T P I = P I 5 ; s b i t A T P 2 = P I 6 : s b i t A T P 5 = P 3 0 ;
器 、CS 5 5 5 0模 数 转 换 器 、 A T 8 9 S 5 2 片 机 以
常 生 活 中应 抖 j 越 来越 广泛 ' 并 呈 现 出 向 深 度 钳
能 化 和 三 维 方 向 发 展 的趋 势 。 这 就 需 要 大 量 高
2 . 2 主 要 程 序 设 计 2 . 2 . I孛 J J 始 化 定 义程 序 # i n c l u d e < r e g 5 2 . h > # i n c l u d e < s t d i o . h >
s b i t A T P 7 = P 3 l :
# d e in f e c l r c l k AT P 4 2 = 0
利用 软件编程进 行分析 处理
,
t : 这 数 信 u T 以 往 汁算 机 或
通 过 口连 接 通 信 至计 算 机
,
模 数 转 换 后 , 由 单 片 机 进 行 控 制 和 分 析 , 实 现 倾 角 数据 采 集 , 倾 角 数 据 数 字 化 的 显 示 等 功 能 。 整 个 数据 采 集 模 块 采 用 集 成 ’ 『 , 测 量 倾 角 传 感 器的 H MC1 0 2 2芯 片 ,它 是 霍 尼 维 尔 公 司的
倾斜角测量仪C语言程序
#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include<math.h>#include<stdio.h>#include<absacc.h>#include<ctype.h>#include<stdlib.h>#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0#define MEAS 0x00 //测量模式#define RWTR 0x08 //读写温度数据寄存器#define STX 0x0E //x通道自检#define STY 0x0F //Y通道自检#define RDAX 0x10 //读X通道加速度值#define RDAY 0x11 //读Y通道加速度值sbit RS = P2^4; //定义端口sbit RW = P2^5;sbit EN = P2^6;sbit SPK=P2^0;sbit SCK=P1^7;sbit MISO=P1^6;sbit MOSI=P1^5;sbit CSB=P1^4;unsigned char frq;sbit P0_0 = P0^0;sbit P0_1 = P0^1;sbit P0_2 = P0^2;sbit P0_3 = P0^3;sbit P0_4 = P0^4;sbit P0_5 = P0^5;sbit P0_6 = P0^6;sbit P0_7 = P0^7;sbit P1_0 = P1^0;sbit P1_1 = P1^1;sbit P1_2 = P1^2;sbit P1_3 = P1^3;sbit P1_4 = P1^4;sbit P1_5 = P1^5;sbit P1_6 = P1^6;sbit P1_7 = P1^7;sbit P2_0 = P2^0;sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4;sbit P2_5 = P2^5;sbit P2_6 = P2^6;sbit P2_7 = P2^7;sbit P3_0 = P3^0;sbit P3_1 = P3^1;sbit P3_2 = P3^2;sbit P3_3 = P3^3;sbit P3_4 = P3^4;sbit P3_5 = P3^5;sbit P3_6 = P3^6;sbit P3_7 = P3^7;unsigned int SPI_ReadBits(unsigned char n ); void SPI_WriteByte( unsigned char wdata ); void SPI_Start(void);void SPI_Stop(void);void SPI_Reset(void);void SPI_Delay(unsigned char);unsigned int SPI_GetX( void );unsigned int SPI_GetY( void );void SPI_Init( void );void SPI_Stop( void ){SCK = 0;CSB = 1;SPI_Delay(10);}void SPI_Reset(void){SPI_Stop();}void SPI_Delay(unsigned char n){while(n--);}void SPI_Start(void){SCK = 0;CSB = 0;SPI_Delay(10);}//主机写一个BYTE到器件//最终状态:CLK=LOWvoid SPI_WriteByte( unsigned char wdata ) {unsigned char i;for( i = 0 ; i < 8 ; ++i ){SCK = 0;SPI_Delay(10);MOSI = wdata & 0x80;wdata = wdata << 1;SPI_Delay(10);SCK = 1;SPI_Delay(10);}SCK = 0;}//主机读入N个比特//n 限制为16及其以下//结束状态CLK=0unsigned int SPI_ReadBits( unsigned char n ) {unsigned int rtemp,i;MISO = 1;for( i = 0 ; i < n ; ++i ){rtemp <<= 1 ;SPI_Delay(10);if( MISO == 1 ){rtemp |= 0x0001;}else{rtemp &= 0xFFFE;}SCK = 1;SPI_Delay(10);SCK = 0;SPI_Delay(10);}return rtemp;}//读X方向角度unsigned int SPI_GetX( void ){unsigned int result;SPI_Start();SPI_WriteByte( RDAX );result = SPI_ReadBits(11);SPI_Stop();return result;}//读Y方向角度unsigned int SPI_GetY( void ){unsigned int result;SPI_Start();SPI_WriteByte( RDAY );result = SPI_ReadBits(11);SPI_Stop();return result;}//SPI测量模式void SPI_Init( void ){SPI_Start();SPI_WriteByte( MEAS );SPI_Stop();}unsigned char code C[]={'0','1','2','3','4','5','6','7','8','9'};/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/ void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------角度转化函数------------------------------------------------*/float angle_transfer( double result){ double angle,f;f=asin((result-1024)/1638);angle=f*180/3.14;return(angle);}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/ }/*------------------------------------------------LCD显示函数------------------------------------------------*/void LCD_Display(unsigned int i,double angle){ int m,n,c,d,e,an;an=(int)(angle*1000);m=an%10;LCD_Write_Char(8,i,C[m]);DelayMs(245);DelayMs(245);an=an/10;n=an%10;LCD_Write_Char(7,i,C[n]);DelayMs(245);DelayMs(245);an=an/10;c=an%10;LCD_Write_Char(6,i,C[c]);DelayMs(245);DelayMs(245);an=an/10;d=an%10;LCD_Write_Char(4,i,C[d]);DelayMs(245);DelayMs(245);e=an/10;LCD_Write_Char(3,i,C[e]);DelayMs(245);DelayMs(245);LCD_Write_Char(5,i,'.');}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{TH0=0xfe; //重新赋值TL0=frq; //低8位值在主程序中不断累加SPK=!SPK; //端口电平取反}/*------------------------------------------------报警函数------------------------------------------------*/bit Warning(double angle,unsigned char x,unsigned char y){int g;angle=fabs(angle);if(angle>20){g=0;LCD_Write_String(x,y,"DANGER!");while(!P2_0){Init_Timer0(); //初始化定时器DelayMs(1); //延时1ms,累加频率值frq++;}}else{LCD_Write_String(x,y," ");EA=0;g=1;}return(g);}/*------------------------------------------------发送函数------------------------------------------------*/void Send(float a ){TMOD=0x20;TL1=0xE6;TH1=0xE6;PCON=0x00;TR1=1;SCON=0x50; /*串口8位异步收发,波特率可变*/if(RI=1){RI=0;SBUF=a;while(TI!=1);TI=0;}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){unsigned int result;double angle,a,b;LCD_Init();LCD_Clear();//清屏SPI_Reset();SPI_Delay(1000);SPI_Init();SPI_Delay(1000);while (1){result = SPI_GetX();angle=angle_transfer(result);a=angle;Send(a);P2_0=Warning(angle,9,0);P2_1=Warning(angle,9,0);if(a<0){a=fabs(a);LCD_Write_String(0,0,"X:-");LCD_Display(0,a);}else{LCD_Write_String(0,0,"X:+");LCD_Display(0,a);}result = SPI_GetY();angle=angle_transfer(result);b=angle;Send(b);P2_0=Warning(angle,9,1);P2_2=Warning(angle,9,1);if(b<0){b=fabs(b);LCD_Write_String(0,1,"Y:-");LCD_Display(1,b);}else{LCD_Write_String(0,1,"Y:+");LCD_Display(1,b);}}}。
51单片机搭建简单的倾斜开关检测系统代码
51单片机搭建简单的倾斜开关检测系统代码近年来,随着科技的不断发展,单片机技术也得到了广泛的应用和发展。
在生产和生活中,倾斜开关检测系统已经成为一种普遍的检测手段,用来检测物体在倾斜或倾倒时的状态。
下面我们就来介绍一下如何搭建一个简单的倾斜开关检测系统。
1. 硬件设备准备首先需要准备的是硬件设备,我们需要一个51单片机芯片、一个倾斜开关、和一些杜邦线等辅助设备。
2. 硬件连接将倾斜开关的引脚通过杜邦线连接到单片机芯片的IO口上,其中两个引脚分别连接到单片机的P3.0和GND口上。
3. 软件编程接下来就是软件编程的环节了,我们需要借助Keil μVision和STC-ISP软件等开发环境进行编程。
代码如下:include "reg51.h"define uchar unsigned chardefine uint unsigned intsbit TiltSwitch = P3^0; // 定义倾斜开关引脚为P3.0口void main(){while(1){if(TiltSwitch == 0) // 检测倾斜开关状态{P1 = 0x00; // P1口输出低电平}else{P1 = 0xff; // P1口输出高电平}}}以上代码通过定义倾斜开关引脚为P3.0口,并通过判断倾斜开关状态,控制单片机的P1口输出高低电平,实现了倾斜开关检测系统的功能。
4. 系统应用搭建好倾斜开关检测系统后,我们可以将其应用在实际生活中。
例如,可以放置在水杯下面,若水杯倾斜,倾斜开关便会检测到状态变化,从而发出警报提醒使用者水杯正在倾斜,避免水杯翻倒将水洒出来,并可能烫伤使用者。
总结:通过以上介绍,相信大家对如何搭建一个简单的倾斜开关检测系统有了更深的了解,同时也能够发现单片机技术在实际生活中的广泛应用。
希望大家能够根据这个简单的系统,不断开发更多实用的功能,为我们的生活带来更多便利和安全。
单片机倾角测试系统设计
数据存储和传输步骤应将处理后 的数据存储到存储器中,并通过 串口或其他通信方式发送出去。
数据采集与处理
01
02
03
04
数据采集应使用合适的传感器 ,如加速度计或陀螺仪,来获
取物体的倾角信息。
数据处理应对采集到的原始数 据进行滤波、去噪等处理,以
获得更准确的数据。
滤波算法可根据实际情况选择 ,如滑动平均滤波、中值滤波
系统优化建议
硬件优化
根据测试结果,优化传感器的设计,提高其精度和稳定性。
软件优化
改进数据处理算法,减少误差和提高计算速度。
系统集成优化
优化系统整体结构,提高测试效率。
06
应用前景与发展趋势
应用领域与优势
工业控制
单片机倾角测试系统在工业控制领域具有广泛应用,如自动化生产线 、机器人等,能够实时监测设备的倾斜角度,保证稳定运行。
系统测试与优化
测试环境与设备
测试环境
为保证测试结果的准确性,测试环境 应保持稳定,避免外界干扰。
测试设备
需要使用高精度的传感器、数据采集 器和单片机开发板等设备。
测试步骤与方法
校准
在开始测试前,需要对 传感器进行校准,以确 保测试结果的准确性。
数据采集
通过单片机开发板采集 传感器数据,并记录下
精度
根据测试需求选择具有合适精度的传感器,以确 保测试结果的准确性。
尺寸与重量
考虑传感器尺寸和重量,以便于安装和集成到测 试系统中。
传感器工作原理
陀螺仪传感器
通过测量旋转轴的角速度来测量 角度变化,常用于测量物体的倾 斜角度和方向。
加速度传感器
通过测量重力加速度在特定轴上 的分量来计算物体的倾斜角度。
51单片机的角度测量系统设计仿真图源码
---------------------------------------------------------------范文最新推荐------------------------------------------------------ 51单片机的角度测量系统设计+仿真图+源码摘要:本文通过对工业中平台的倾角进行测量,来帮助工作人员顺利地完成任务。
提高了整个工程的准确度。
论文首先利用角度传感器读取模拟角度信号,再将模拟信号通过ADC0808转换成数字信号,然后通过单片机实现角度值的数码显示。
如果角度值大于规定值,则电机转动对平台进行调平。
本论文实现了工业领域中的角度测量,保证了整个工程的顺利进行,因此该设计能够广泛地应用在工业控制等领域。
4591关键字:角度传感器;单片机;ADC0808;LEDThe Design of Angle Measuring System Based on MCU Abstract: This paper helps staff to complete successfully1 / 14the task by measuring the inclination of the platform in the industry. It improves the accuracy of the whole project. First of all, this paper uses the Angle sensor to read the simulation signals. Then the simulation signals will be converted to digital signals by ADC0808. At last, the angle will be displayed on the screen by MCU. If the angle value is higher than the specified value, the motor will move to adjust the platform. the paper realizes the angle measurement in the field of the industry. And it ensures the whole project can run smoothly. So the design can be widely used in the industrial control and other fields.Key Words: Angle sensor;MCU; ADC0808; LED目录摘要1引言1---------------------------------------------------------------范文最新推荐------------------------------------------------------ 1. 绪论21.1 选题背景21.2 国内外的研究现状21.3 设计研究的要求及主要内容32.整体设计方案32.1 各设计方案论证与比较32.2 系统总体概述32.3 系统结构框图43. 硬件系统设计41. 绪论3 / 14本章介绍了本研究课题的背景及意义,阐述了角度测量系统的发展状况。
基于C51的智能健康称重系统设计
摘要本文介绍了一种基于微处理器与传感器等技术基础上设计的智能健康称重的电子秤。
现代信息技术的三大基础是信息的采集、传输和处理技术,即传感技术、通信技术和计算机技术,它们分别构成了信息技术系统的“感官”、“神经”和“大脑”。
信息采集系统的首要部件是传感器,且置于系统的最前端。
在一个现代自动检测系统中,如果没有传感器.就无法监测与控制表征生产过程中各个环节的各种参量,也就无法实现自动控制。
在现代技术中,传感器实际上是现代测试技术和自动化技术的基础科学技术的飞速发展,由称重传感器制作的电子衡器也已广泛地应用到各行各业。
特别是随着微处理机的出现,工业生产过程自动化程度化的不断提高,称重传感器已成为过程控制中的一种必需的装置。
为了提高我们对数据采集及数据处理方面知识的处理能力,并且考虑到作品的实用性和个人兴趣等因数,我们设计了一台基于51单片机的智能电子秤。
本系统通过称重传感器采样,A/D转换后输入单片机,通过按键设置单价后,经过单片机主控制器件的处理后,液晶上就会显示:体重和距离健康的标准。
关键词:智能称重;传感器;微处理器;测试技术摘要 (III)第1章引言 (1)第2章系统方案设计 (1)2.1 设计任务及要求 (1)2.1.1 任务 (1)2.1.2 设计说明 (2)2.1.3 智能秤的工作原理 (2)2.2 智能秤设计的要求及思路 (2)2.2.1 智能秤设计的基本要求 (2)2.2.2 智能秤设计的基本思路 (2)第3章智能秤的设计与制作 (4)3.1 智能秤的各个模块 (4)3.1.1 传感器 (4)3.1.2 测身高部分 (6)3.1.3 A/D转换模块——ADC0808 (8)3.1.4 微处理器模块——AT89C51 (9)3.1.5 输出显示模块——LCD (10)3.1.6 电源模块 (11)第4章智能秤的软件设计 (12)4.1 总体方案设计 (12)4.2 称重部分软件设计 (13)4.3 测量身高部分软件设计 (14)4.4 A/D转换部分程序流图 (16)4.5 LCD显示部分程序 (16)第五章总结 (18)第1章引言目前,随着社会的发展、生活水平不断提高,人们越来越关注自己的身体健康。
基于c51的转速测量课程设计论文
基于单片机的转速测量显示装置设计目录课程设计任务书 (1)一概述 (2)1.1背景概述和应用介绍: (2)1.2 总体设计方案 (3)1.2.1硬件电路设计思路 (3)1.2.2软件设计思路 (3)二硬件电路的设计 (4)2.1传感器的选型 (4)2.1.1霍尔元件的应用 (4)2.1.2UGN3144霍尔开关元件 (4)2.2.传感器接口电路设计 (6)2.3单片机最小系统的设计 (7)2.3.1AT89C51单片机的简介 (7)2.3.2复位电路 (10)2.3.3时钟电路 (10)2.4显示电路的设计 (11)三系统软件设计 (15)3.1主程序初始化 (15)3.2主程序流程图程序流程图 (17)四仿真及结果 (19)4.1软件调试 (19)4.2仿真结果 (20)设计总结 (22)参考文献 (23)附录一:原理图 (24)附录二:单片机程序 (25)致谢 (27)一 概 述1.1背景概述和应用介绍:智能化转速测量可以对转速进行测量,电机在运行的过程中,需要对其平稳性进行监测,适时对转速的测量有效地可以反映电机的状况。
本系统主要由传感器,单片机AT89C51构成。
可以对大范围转速进行测量,测量的转速精度高,实现对电机转速的测量。
单片机的英文名称是Micro Controller unit,缩写为MCU ,又称为微控制器,它是一种面向控制的大规模集成电路芯片。
它具有功能强、体积小、可靠性高、应用简单灵活,因而使用非常广泛,有力地推动各行业的技术发展和更新换代。
本文首先在第二章绪论介绍了此系统的功能、技术指标以及主要内容等;在第三章论述了总体设计过程,确定了技术指标及器件的选择;第四章着重描述了系统硬件电路设计、硬件设计框图及所使用的各种芯片功能与特性;在第五章中重点剖析了软件设计的过程;最后在第六章中具体论述单片机、电平转换电路、通信的处理及调试。
系统主要实现功能是:AT89C51单片机接收传感器传来的脉冲信号,单片机根据中断,以及内部定时器进行记数计算出电机转速送到LED 显示。
基于C51单片机的智能仪器综合设计实验
基于单片机的智能仪器综合设计实验一、实验目的在实验一~实验三的基础上,完成综合设计实验,学会信号采集、数据处理、键盘控制、LCD或LED显示等功能的智能仪器设计。
二、复习与参考实验一~实验三三、设计指标利用K分度号热电偶进行温度检测,测温范围为500-1200ºC,室温为20ºC,用LCD或LED显示室温和测量温度。
具有4路温度信号循环检测功能,通道切换时间可调;具有任意指定通道显示功能。
四、实验要求1.选择传感器,设计硬件电路,包括检测电路、信号调理电路、AD转换电路、单片机最小系统、LED显示(单号)、LCD显示(双号)、独立式按键,画出电路原理图。
2.画出软件流程图。
3.用Keil C51编写程序。
3.实验结果在LCD或LED上显示出来。
4.实验前完成第1、2项备查。
五、实验仪器设备和材料清单PC机;单片机实验板、连接导线、ST7920图形液晶模块Keil c51软件六、实验成绩评定方法实验成绩包括预习、实验完成质量、实验报告质量3部分组成,各部分所占比例分别为30%、40%、30%。
八、实验报告要求实验报告格式:●实验名称●实验目的●实验内容●硬件设计●软件设计●调试过程●参考文献●附1:电路原理图●附2:程序清单附录:实验程序源代码如下:(陈寅)#include "reg51.h"#define THC0 0xee //5ms时间常数设置#define TLC0 0x00sbit ADWR=P3^6; /***WR*****/sbit ADRD=P3^7; /***RD*****/sbit ADCS=P2^7; /***CS*****/sbit EOC=P3^3; /***EOC****/sbit ADA=P1^3; //通道选择引脚sbit ADB=P1^4;sbit ADC=P1^5;sbit CS =P1^0; /****************/sbit SID=P1^1; /**液晶引脚定义**/sbit SCLK=P1^2; /****************/sbit MODE=P2^0; /*************************/sbit UP=P2^1; /*四个按键接口,0表示按下*/sbit DOWN=P2^2; /*************************/sbit LED1=P2^3; /**4个LED灯引脚定义**/sbit LED2=P2^4; /********************/sbit LED3=P2^5; /********************/sbit LED4=P2^6; /********************//***************500~1200°C范围的K分度表,间隔10*******************/ unsigned int code K_TABLE[71]={20644,21066,21493,21919,22346,22772,23198,23624,24050,24476,24902,25327,25751,26176,26599,27022,27445,27867,28288,28709,29128,29547,29965,30383,30799,31214,31629,32042,32455,32866,33277,33686,34095,34502,34909,35314,35718,36121,36524,36925,37325,37725,38122,38519,38915,39310,39703,40096,40488,40897,41296,41657,42045,42432,42817,43202,43585,43968,44349,44729,45108,45486,45863,46238,46612,46985,47356,47726,48095,48462,48828}; unsigned char GetAdData[10]={0}; //存放获得AD值的数组变量unsigned char ViewTemperature[4]={"0000"}; //显示温度缓冲数组变量unsigned MODESelect=1;int ChangeTime=2; //通道切换时间,单位Sint TongDao=1;void delay(unsigned int j){unsigned char i;do{for(i=0;i<100;i++);}while(j--);}void send_command(unsigned char command_data) //发送命令{unsigned char i;unsigned char i_data;i_data=0xf8; //操作命令,可以查看资料delay(10);CS=1;SCLK=0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data=i_data&0x0f;i_data<<=4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void send_data(unsigned char command_data) //发送数据{unsigned char i;unsigned char i_data;i_data=0xfa; //操作命令,可以查看资料delay(10);CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data=i_data&0x0f; //取低四位i_data<<=4; //左移四位,从而变成高四位for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void InitLCD() //液晶初始化{send_command(0x30); //功能设置:一次送8位数据,基本指令集send_command(0x06); //点设定:显示字符/光标从左到右移位,DDRAM地址加1send_command(0x0c); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x04); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x01); //清DDRAMsend_command(0x02); //DDRAM地址归位send_command(0x80); //把显示地址设为0X80,即为第一行的首位}/* x,y为起始座标x(0<=x<=3),y(0<=y<=7),x为行座标,y为列座标;how为要显示汉字的个数;style为显示字符的类型,0表汉字,1表字母;str是要显示汉字的地址*/void Display(unsigned char x,unsigned char y,unsigned char how,bit style,unsigned char *stri) //液晶显示{unsigned char hi=0;if(x==0) send_command(0x80+y);else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);if(style==0){for(hi=0;hi<how;hi++){send_data(*(stri+hi*2));send_data(*(stri+hi*2+1));}}elsefor(hi=0;hi<how;hi++) send_data(*(stri+hi));}float LvBo(void)//复合滤波{unsigned char max,min,i;unsigned int sum=0;float U1;max=GetAdData[0];min=GetAdData[0];for(i=0;i<10;i++){sum=sum+GetAdData[i];if(max<GetAdData[i]) max=GetAdData[i];if(min>GetAdData[i]) min=GetAdData[i];}sum=sum-max-min;U1=(float)sum/8;U1=10.0*((U1*5.0)/255); //换成mvreturn U1;}void search (void)//查表子函数{unsigned int da=0,max,min,mid,j;unsigned int var;da=LvBo()*1000; //u1扩大1000倍da=da+798; //20度max=71;min=0;var=0;while(1){mid=(max+min)/2; //中心元素位置if(K_TABLE[mid]==da) {var=mid*10;break;} //中心元素等于查表元素,计算相应温度else if(K_TABLE[mid]>da) max=mid-1;else min=mid+1;if(max-min==1) /*线性插值计算温度值*/{j=(K_TABLE[max]-K_TABLE[min])/10; /*表中相邻两值对应温度相差10°C*/j=(da-K_TABLE[min])/j;var=10*min+j;break;}if(max==min){if(da>=K_TABLE[min]){j=(K_TABLE[min+1]-K_TABLE[min])/10;j=(da-K_TABLE[min])/j;}else if(da<K_TABLE[min]){j=(K_TABLE[min]-K_TABLE[min-1])/10;j=(da-K_TABLE[min-1])/j;min=min-1;}var=10*min+j;break;}}var=var+500;ViewTemperature[0]=var/1000+0x30;ViewTemperature[1]=var/100%10+0x30;ViewTemperature[2]=var/10%10+0x30;ViewTemperature[3]=var%10+0x30;}void LcdDisplay(void){unsigned char ViewMODESelect,ViewTongDao[5]={"0 "},ViewChangeTime[5]={"00(S)"};ViewMODESelect=MODESelect+0x30;ViewTongDao[0]=TongDao+0x30;if(MODESelect==1||MODESelect==2){if(MODESelect==1) Display(0,3,5,0,":自动切换");else if(MODESelect==2) Display(0,3,5,0,":手动切换");Display(0,0,2,0,"模式"); //液晶显示Display(0,2,1,1,&V iewMODESelect);Display(1,0,5,0,"温度通道:");Display(1,5,5,1,V iewTongDao);Display(2,0,4,0,"温度值:");Display(2,4,4,1,V iewTemperature);Display(2,6,2,1,"℃");}else if(MODESelect==3){ViewChangeTime[0]=ChangeTime/10+0x30;ViewChangeTime[1]=ChangeTime%10+0x30;Display(0,0,2,0,"模式");Display(0,2,1,1,&V iewMODESelect);Display(0,3,5,0,":设置时间");Display(1,0,5,0,"切换时间:");Display(1,5,5,1,V iewChangeTime);Display(2,0,14,1," "); //本行清屏}}void TDSelect(void) //AD通道设置{if(TongDao>=5) TongDao=1;if(TongDao<=0) TongDao=4;if(TongDao==1) {ADC=0;ADB=0;ADA=0;}else if(TongDao==2) {ADC=0;ADB=0;ADA=1;}else if(TongDao==3) {ADC=0;ADB=1;ADA=0;}else if(TongDao==4) {ADC=0;ADB=1;ADA=1;}}main(){unsigned char AdCount=0; //用来存放AD采集次数InitLCD();TMOD=0x11; //定时器0初始化TH0=THC0;TL0=TLC0;TR0=1;ET0=1;EA=1;P2|=0x07; //按键初始为高while(1){ADWR=1; /************/ADCS=0; /************/ADWR=0; /**AD初始化**/ADWR=1; /************/while(!EOC); //等待转换结束ADRD=0;GetAdData[AdCount]=P0; //读取转换结果AdCount++;if(AdCount>=10) //连续采集10次值{AdCount=0;search(); //查表LED1=!LED1;LcdDisplay(); //显示}}}void Timer0() interrupt 1{static unsigned char count=0,UPFlag=1,DOWNFlag=1; //按键标志位static unsigned int TimeCount=0;TH0=THC0;TL0=TLC0;if(MODE==0||UP==0||DOWN==0){count++;if(count>=30) //消抖处理{count=0;if(MODE==0) //按键按下{MODESelect++;if(MODESelect>=4) MODESelect=1;}else if(UP==0){UPFlag=0;if(MODESelect==2){TongDao++;TDSelect();}}else if(DOWN==0){DOWNFlag=0;if(MODESelect==2){TongDao--;TDSelect();}}}}else count=0;if(MODESelect==1){TimeCount++;if(TimeCount>=(ChangeTime*1000/5)){TimeCount=0;TongDao++;TDSelect();}}else if(MODESelect==3){if(UPFlag==0) {UPFlag=1;ChangeTime++;}else if(DOWNFlag==0){DOWNFlag=1;ChangeTime--;if(ChangeTime<=0) ChangeTime=1;}}}。
智能测温仪表系统程序代码和系统流程图
智能测温仪表系统程序代码和系统流程图基于STC89C51单片机的智能测温仪表程序框架如下。
#include <AT89X51.H> //51单片机头文件定义数码管译码数组;定义数码管位选数组;定义保存在24C02中数据的数组;定义时间标记变量;//display_time,sample_time,control_time,DAC_time等定义其他全局数组与变量;声明函数原型;(TLC1549,TLC5615、24C02等函数)void main(void){定时器初始化;引脚初始化;//按钮、LED灯、ADC、DAC、E2PROM和软件SPI用引脚初始化其他初始化语句;从24C02读数组语句;//将保存的数据读到数组,每次单片机上电后,就使用该数组中的数据while(1){按键处理语句;{功能选择,控制周期、设定值、回差值、报警值等输入;将数组写入24C02语句;//将按键输入的数据保存到数组}//数码管显示语句:if(display_time= =1) //如果显示标记display_time=1,则执行显示任务,完成一位数码管显示{数码管扫描显示语句;//采用两片74HC595扫描数码管display_time= =0;}//ADC转换与数字滤波语句:if(sample_time= =1) //如果数据采样标记sample_time=1,执行ADC转换任务1{TLC1549转换、数字滤波与非线性校正程序;sample_time= =0;}//ADC输出数值判断、报警、比例算法运算与控制量输出:if (control_time= =1) //如果控制周期标记control_time=1,则实现控制算法{温度值判断与报警语句;比例算法运算语句;控制量输出语句;(引脚赋值语句)control_time=0;}//DAC转换语句:if (DAC_time= =1) //如果DAC转换标记DAC_time=1,将数据写入DAC{TLC5615数据输出语句;DAC_time=0;}}//定时器0中断服务程序,用于产生显示、ADC转换与控制周期标记void Timer0() interrupt 1{static unsigned char n,m,k,h;n++; m++,k++;h++;if(n= = display_time0) //display_time0为显示周期{n=0; display_time=1;}if(m= = sample_time0) //sample_time0为ADC转换周期{m=0; sample_time=1;}if(k= = control_time0) //control_time0为控制周期{k=0; control_time=1;}if(h= = DAC_time0) //DAC_time0为DAC转换周期{h=0; DAC_time=1;}}系统流程图。
基于单片机的倾角测量系统设计
基于单片机的倾角测量系统设计
唐原广;赵曙东
【期刊名称】《微计算机信息》
【年(卷),期】2007(000)03Z
【摘要】本文详细介绍了一种利用加速度传感器、AD转换器、单片机实现高精度倾角测量的方法。
给出了利用加速度传感器测量倾角的原理,提出了整体设计方案。
实验证明,该系统工作稳定可靠。
【总页数】3页(P96-97,95)
【作者】唐原广;赵曙东
【作者单位】中国海洋大学,山东青岛266003
【正文语种】中文
【中图分类】TP368
【相关文献】
1.基于CC1101的无线倾角测量系统设计 [J], 徐永;李昆;何小妹;王一璋
2.基于4G模块的高精度倾角测量系统设计 [J], 王涛;刘军;曾国强;卿松;胡天宇;郭生良
3.基于STC12C5410AD单片机的倾角监控系统设计 [J], 何小虎;李现明
4.基于单片机的倾角测量系统设计 [J], 唐原广;赵曙东
5.基于单片机的微型嵌入式温度测量仪的设计与实现分析基于PIN光电二极管的毫米级物体速度测量系统设计 [J], 何滔;雷富坤
因版权原因,仅展示原文概要,查看原文内容请购买。
基于单片机的数字倾角检测系统的设计
基于单片机的数字倾角检测系统的设计林建华【期刊名称】《电子测试》【年(卷),期】2013(000)009【摘要】Introduce the working principle of SCA103T Angle sensor,it is based on MEMS technology. Through the hardware circuit design by using the MSC1214 microcontroller,combined with software compensation method to achieve digital Angle sensor can be applied to ±30° Angle measurement. Experiments show that the nonlinearity<1FS%,Zero output < 0.05°;Zero voltage < 5 mv;Zero drift < 0.02 °/ h.%介绍一种基于MEMS技术的倾角传感器SCA103T的基本工作原理,利用MSC1214单片机通过硬件电路设计,结合软件补偿的办法实现的数字式倾角传感器可适用于±30°的大角度测量。
实验表明其非线性度<1FS%,零点输出<0.05°;零位电压<5mv;零点漂移<0.02°/h。
【总页数】3页(P3-4,9)【作者】林建华【作者单位】北京信息科技大学理学院,北京 100101【正文语种】中文【相关文献】1.基于MSP430单片机的便携式数字倾角仪的研制 [J], 张伟;梁华为;杨新钢;杨先军2.基于STC15单片机的数字式倾角仪应用设计 [J], 马月红;李昆仑3.基于AVR单片机的多点数字温度检测系统设计 [J], 葛治军4.基于单片机的数字倾角检测系统的设计 [J], 林建华5.基于STC15单片机的数字式倾角仪应用设计 [J], 马月红;李昆仑因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
智能倾角测量系统的C51编程实现
作者:王子卿
来源:《电子技术与软件工程》2017年第12期
摘要科学探测呈现出向深度智能化和三维方向发展的趋势,智能倾角测量系统成为发展的关键。
本文采用模块化设计思想,以HMC1022传感器、CS5550模数转换器、AT89S52单片机以及显示模块等为基础,设计实现了智能倾角测量系统,并基于uVision开发环境,采用C51语言编程实现了智能倾角测量系统的单片机软件程序设计。
【关键词】C51语言智能倾角电子罗盘科学探测
随着社会经济的高速发展,数字式电子罗盘在现代科学探测,以及工、农业生产和日常生活中应用越来越广泛,并呈现出向深度智能化和三维方向发展的趋势。
这就需要大量高精度的方位及倾角的测量及处理,而要保证方向测量的高精度,需研制高精度电子罗盘。
同时,随着电子罗盘应用的广泛性,其系统本身的要求体现在抗干扰性好、设计灵活、方便、成本低,适合于比较恶劣的环境等方面。
本文给出了智能倾角测量系统的设计方案,并给出了C51语言的实现方法。
1 智能倾角测量系统设计
本文智能倾角测量系统采用模块化设计思想,为确保倾角数据采集的稳定性和准确性,采用HMC1022传感器集成芯片,并通过模数转换后,由单片机进行控制和分析,实现倾角数据采集,倾角数据数字化的显示等功能。
整个数据采集模块采用集成了测量倾角传感器的
HMC1022芯片,它是霍尼维尔公司的新产品之一,是一款高精度低成本型的磁通传感器。
模数转换采用高精度低成本低功耗的CS5550芯片,它是一个包含两个Δ-Σ模数转换器(ADC)和一个串行接口的高度集成的Δ-Σ双通道低成本模数转换器。
CS5550具有方便的片上AC/DC 偏移和增益校准功能,包含一个可与控制器双向通讯的串行接口、一个可用于增益补偿的片上温度传感器。
而控制处理的单片机采用的是AT89S52单片机,是一种低功耗、高性价比的8位微控制器,具有8K在系统可编程Flash存储器,具有成本低、稳定性好的优点。
整个系统的硬件部分由HMC1022传感器、CS5550模数转换器、AT89S52单片机以及显示模块构成。
系统整体结构图如图1所示。
HMC1022处于工作状态之下的时候,当其检测到外部有倾角信号的时候,便进行数据采集工作,并存储在寄存器之中。
HMC1022采集的信号是模拟信号,须经过模数转换后才能进入单片机进行处理及数字化显示,CS5550是一款高精度低成本的模数转换芯片,配合CS5550的软件编程,对HMC1022所采集的模拟信号进行模数转换后,模拟信号变成了数字信号。
数字信号送入AT89S52单片机,利用软件编程进行分析处理,让这些数字信号通过串口连接通
信至计算机,可以在计算机或是液晶显示屏上把HMC1022所测得的倾角信号以数字化的形式显示出来,给科学探测提供准确有效的数据。
2 C51语言编程实现
本文给出了主程序方案,进一步使用软件编程C51语言在uVision编辑器中实现了主程序设计。
2.1 主程序方案
主程序先初始化各IO端口及各分立器件,如AT89S52单片机的管脚选用及定义,开外部中断等。
主程序主要调用了3个主要子程序,分别是HMC1022工作驱动程序,CS5550模数转换程序、数据分析处理及显示程序。
主程序流程如图2所示。
2.2 主要程序设计
2.2.1 初始化定义程序
#include
#include
#include
#include
sbit AT P42=P1^0;//管脚端口位定义
sbit AT P41=P1^1;
sbit AT P40=P1^2;
sbit AT P43=P1^3;
sbit AT P44=P1^4;
sbit AT P1=P1^5;
sbit AT P2=P1^6;
sbit AT P7=P3^1;
#define clrclk AT P42=0
#define setclk AT P42=1
#define clrout AT P41=0
#define setout AT P41=1
#define setcs AT P40=1
#define clrcs AT P40=0
#define setled1 AT P44=1
#define clrled1 AT P44=0
#define setled2 AT P5=1
#define clrled2 AT P5=0
#define setAcgnd AT P7=1
#define clrAcgnd AT P7=0
#define uchar unsigned char #define uint unsigned int
#define ulint unsigned long int #define TR 1
unchar idata buf[16];
unchar pf;
uint min=11;
uint max=22;
void cttx();
2.2.2 写命令函数
void spiwrite_com(uchar Input) //写命令函数 {
uchar i,j;
setcs;
clrclk;
shortdelay();
clrcs;
for (i=0;i
{
clrclk;
if (0x80 == (Input & 0x80)){setout;}
else clrout;
for(j=0;j
setclk;
for(j=0;j
Input = Input
}
clrclk;
for(j=0;j
setcs;
clrout;
clrcs;
}
2.2.3 CS5550转换部分程序
void cs5550initial() //初始化
{
uchar i,data0=0;
spiwrite_com(0x80);
for(i=0;i
for(i=0;i
spiwrite_com(0xfe);
spiwrite_com(0x80);
}
void cs5550adjust(void) //校准函数
{ uchar i,j,k;
setAcgnd;
spiwrite_com(0x0dd); //AIN1,AIN2通道AC偏移校准 spiwrite_dat(0xffffff);
spiwrite_com(0x0CD);
for(i=0;i
{for(k=0;k
{for(j=0;j
}
spiwrite_dat(0xffffff);
spiwrite_com(0x0d9); //DC偏移校准
for(i=0;i
{for(k=0;k
{for(j=0;j
}
clrAcgnd;
}
void cs5550start(void)
{
spiwrite_com(0x40); //写配置寄存器,增益10,下降沿有效采样率1KHz; spiwrite_dat(0x1074);
spiwrite_com(0x5e); //写状态寄存器
spiwrite_dat(0xffffff);
spiwrite_com(0x74);
spiwrite_dat(0x836019); //写中断屏蔽寄存器
spiwrite_com(0x4A); //写转换次数计数器,更新频率100hz;
spiwrite_dat(0x10);
spiwrite_com(0xE8); //开启转换
3 结论
本文采用模块化设计思想设计了智能倾角测量系统,整个系统的硬件部分由HMC1022传感器、CS5550模数转换器、AT89S52单片机以及显示模块构成。
本文给出了主程序方案,进一步使用软件编程C51语言实现了包含HMC1022工作驱动程序,CS5550模数转换程序、数据分析处理及显示程序3个子程序的设计。
本文为科学探测工程中对方位倾角数据采集模块的实现提供了一种可以应用的解决方案。
参考文献
[1]Honeywell HMC1022 Data Book.2000.
[2]CirrusLogic,Inc.CS5550 Datasheet [EB/OL].2008.http:
///en/pubs/proDatasheet/CS5550_F1.pdf.
[3]ATMEL公司.AT89S52芯片资料[S].http://,2007.
[4]Keil uVision2入门教程(英文版)[DB/OL].2001.
作者单位
华北电力大学国际教育学院北京市 102206。