相关范文:基于单片机监控系统的研究【摘要】文章所设计的基于单片机监控系统汽车行驶记录仪所实现的主要功能:记录汽车停车前2秒内的行驶速度,并能实时地显示汽车行驶的状态信息,同时还对汽车的超速行驶进行报警并记录一天之内的超速次数。【关键词】单片机;模块;监控本文所设计的汽车行驶记录仪是基于两片8051单片机作为控制系统的核心来进行设计的,整个系统分为六大模块分别是:电源模块、速度信号采集模块、时钟模块、单片机模块、存储器模块、显示模块。一、电源模块的设计记录仪作为车载设备,使用汽车电源。汽车上的电源有两个:汽车发电机和蓄电池。记录仪的电源直接取自蓄电池,在发电机转速和用电负载发生较大变化时,可保持汽车电网电压的相对稳定,同时,还可吸收电路中随时出现的瞬时过电压,以保护电子元件不受损害。车辆使用的车载蓄电池标称值有两种 12V的和 24V的,因此为了得到需要的 5V的电压,我选用了 DC-DC 电源转换芯片。二、速度信号采集模块的设计速度信号检测模块的原理是:汽车行驶过程中,车轮经过传感器,单位时间内输出一定的脉冲,传感器输出的脉冲通过差动放大电路的放大与整形,然后送到单片机 8051 的 T0端口进行脉冲计数,与此同时 8051 的 T1 进行计时开始待到定时器产生中断请求后,由计数器得到的脉冲数经过速度计算的公式和里程的计算后得到汽车行驶的速度和里程。从而得到汽车的行驶速度和里程,存储与 8051 的 RAM数据存储区。本系统采用霍尔传感器将速度信号转换为脉冲信号,考虑到传感器的体积要小,便于安装,误差要尽量减小等要求,设计采用车轮旋转一周速度传感器要输出若干个脉冲的方法。本系统采用的是在变速器上安装 3个小磁钢,霍尔传感器可相应的输出 3 个脉冲用于速度信号的采集。速度信号采集模块采用 THS118 型霍尔元件作为速度信号采集部分的速度传感器。三、时钟模块的设计时钟模块主要是用于对时、分、秒、年、月、日和星期的计时。该模块采用的芯片为DS12C887 时钟芯片。此芯片集成度高,其外围的电路设计非常的简单,且其性能非常好,计时的准确性高。DS12C887为双列直插式封装。其具体与单片机的连接如下所述:AD0~AD7双向地址/数据复用线与单片机的P0口相联,用于向单片机交换数据;AS 地址选通输入脚与单片机的 ALE 相联用于对地址锁存,实现地址数据的复用;CS 片选线与单片机的 相联,用于选通时钟芯片;DS 数据选通读输入引脚与单片机的读选通引脚相联,用于实现对芯片数据的读控制;R/W 读/写输入与单片机的写选通引脚相联,用于实现对时钟芯片的写控制;MOT 直接接地,选用 INTEL 时序。IRQ引脚与 8051 的 INT1 相连,用于为时间的采集提供时间基准。四、单片机模块的设计本系统采用两片单片机,两个单片机之间采用串行通讯,用于两者之间的数据交换。其工作时序是由外部晶振电路提供的,本系统采用的晶振频率是 12 兆 HZ。其复位电路为自动上电复位。设计中所采用的单片机为 8051。单片机在系统中主要是用来对其他模块进行控制,是整个系统的核心部件。主单片机主要是用于对速度信号采集模块、时钟模块和存储模块进行控制,同时还要与从单片机进行数据的交换。其外围的 I/O口主要与这些模块的中心芯片的数据总线或地址总线相连,其控制总线与这些模块的控制线相连。从单片机主要是用于对显示和校时的控制,因此其 I/O口主要与 LCD显示器的 I/O口相连,其控制线与 LCD显示器的控制线相连。由于从单片机的外部中断源只有两个,而我所设计的对时钟的校时主要是通过外部中断完成的,所以要对从单片机的外部中断源进行扩展。本系统采用了 8259A 进行中断源的扩展,从而实现对时钟的校时。五、储模块的设计汽车行驶记录仪对系统存储数据的实时性及长久性要求很高,因此本系统我采用了ATMEL 生产的 AT29C010A Flash 性存储器。其存储空间为 16K,能够满足设计的要求。AT29C010A是一种 5V在线闪速可电擦除的存储器,具有掉电保护功能;方便的在线编程能力不需要高的输入电压,指令系统在 5V 电压下即可控制对 AT29C010A 的读取数据,这与对 EEPROM 的操作相似。再编程能力是以每一分区为单位的,128 字节的数据装入AT29C010A 的同时完成编程。在一个再编程周期里,存储单元的寻址和 128 字节的数据通过内部锁存器可释放地址和数据总线,这样可为其它操作提供地址和数据总线。编程周期开始后,AT29C010A会自动擦除分区的内容,然后对锁存的数据在定时器作用下进行编程。六、示模块的设计显示器主要是为人机交互提供即时的信息,能让人们与机器进行很好的交流。在众多种类的显示器中,越来越多的仪器仪表及人机交互界面采用液晶显示器。LCD 可分为段位式LCD、字符式 LCD和点阵式 LCD。其中段位式和字符式只能用于数字和字符的简单的显示,不能满足图形曲线和汉字显示的要求;而点阵式不仅能够显示字符和数字,还可以显示各种图形、曲线及汉字,可以实现屏幕的上下左右滚动等功能。七、键的设计本系统的按键主要是用于对时钟的校对,现对按键的功能简述如下:按键 1~7是用于对秒分时日月年星期校时的中断申请;按键 8 是用于对校时进行加一的操作,键 9 是用于对校时进行减一的操作;按键 10 是用于实现对超速报警监控功能的复位。八、系统软件流程图的设计由于本设计主要是完成系统的硬件电路设计,因此我对系统的软件设计只进行了系统部分软件流程图的绘制。设计的流程图有:记录仪总体软件设计流程图、速度信号采集模块软件设计流程图、时钟模块软件设计流程图、外部中断软件设计流程图和 LCD 显示实现的软件设计流程图。【参考文献】[1]戴佳,苗龙,陈斌.51单片机应用系统开发典型实例[M].中国电力出版社.[2]周航慈.单片机应用程序设计技术[M].北京航空航天大学出版社.[3]胡汉才.单片机原理及其接口技术[M].清华大学出版社.[4]余发山.单片机原理及应用技术[M].中国矿业大学出版社.仅供参考,请自借鉴希望对您有帮助
1硬件电路描述本系统采用总线结构,CPU为8031,外挂1个2718RAM,键盘为4×4矩阵键盘,通过244缓冲器与8031接上,138译码器负责给各个终端提供地址,其输出端与个芯片片选端相连。4个发光二极管分别表示电源、正弦波、余弦波、斜波,通过373锁存器挂在总线上。ICM7212AM为LED显示译码驱动芯片,有译码驱动与保持功能。可驱动4个共阳极7段数码管,且亮度可以调节。DAC0832为8位D/A转换器,有两级锁存功能,能实现各种缓冲方式,便于实行双路同时输出。滤波电路采用双极性二级放大滤波,可无级调剂输出波形幅值以及平均值。硬件示意图如图1所示。2软件流程图及功能演示2.1软件流程图软件编程力图模块化设计,分主程序以及几个子程序。考虑到汇编语言执行效率较高,故全部程序均采用汇编语言编写。主程序主要负责接受键盘的输入控制并对其进行存储与显示。正弦波、方波、斜波子程序主要用于对各种波形的给定频率从小相位进行解算,得出定时器的初值。采用定时中断控制输出频率与相位差。中断子程序主要用来查表输出各电压点。输出各种波形各点的电压。各部分的流程图如图2所示(方波与斜波流程图与正弦波的相似)。2.2功能演示功能演示情况如图3所示。 3性能简介本智能双路数字信号源可产生方波、斜波、正弦波3种信号。每种信号的频率范围为0.1~2 kHz,最小刻度0.1 Hz,频率由数码管显示,明了美观。可同时输出两路同频率有相差的信号,也可以输出一路信号。两路输出的相位差可人为设定,移相范围0°~360°。所有设定均通过键盘完成,操作简单方便。输出信号均可任意调节,平均值在-12~+12 V之间,峰峰值在0~10 V之间,所有调节均为无级调节。功能齐全,价格便宜,批量生产成本价在80元左右,适合实验室以及工厂使用,市场前景好。
用DS18B20做的电子温度计,非常简单。#include <> #include\"\"#include <>#include <>//********************************************************#define Seck (500/TK) //1秒中的主程序的系数#define OffLed (Seck*5*60) //自动关机的时间5分钟!//********************************************************#if (FHz==0) #define NOP_2uS_nop_()#else #define NOP_2uS_nop_();_nop_()#endif//**************************************#define SkipK 0xcc //跳过命令#define ConvertK 0x44 //转化命令#define RdDs18b20K 0xbe //读温度命令//*******************************************extern LedOut(void);//*************************************************sbit PNP1=P3^4;sbit PNP2=P3^5;sbit BEEP=P3^2;//***********************************#defineDQ PNP2 //原来的PNP2 BEEP//***********************************static unsigned char Power=0;//************************************union{ unsigned char Temp[2]; //单字节温度 unsigned int Tt; //2字节温度}T;//***********************************************typedef struct{ unsigned char Flag; //正数标志 0;1==》负数 unsigned char WenDu; //温度整数 unsigned int WenDuDot; //温度小数放大了10000}WENDU; //***********************************************WENDU WenDu;unsigned char LedBuf[3];//----------------------------------//功能:10us 级别延时// n=1===> 6Mhz=14uS 12MHz=7uS//----------------------------------void Delay10us(unsigned char n){ do{ #if (FHz==1) NOP_2uS;NOP_2uS; #endif }while(--n);}//-----------------------------------//功能:写18B20//-----------------------------------void Write_18B20(unsigned char n){ unsigned char i; for(i=0;i<8;i++){ DQ=0; Delay10us(1);//延时13us 左右 DQ=n & 0x01; n=n>>1; Delay10us(5);//延时50us 以上 DQ=1; }}//------------------------------------//功能:读取18B20//------------------------------------unsigned char Read_18B20(void){ unsigned char i; unsigned char temp; for(i=0;i<8;i++){ temp=temp>>1; DQ=0; NOP_2uS;//延时1us DQ=1; NOP_2uS;NOP_2uS;//延时5us if(DQ==0){ temp=temp&0x7F; }else{ temp=temp|0x80; } Delay10us(5);//延时40us DQ=1; } return temp;}//-----------------------------------void Init (void){ DQ=0; Delay10us(45);//延时500us DQ=1; Delay10us(9);//延时90us if(DQ){ //0001 1111b=1f Power =0; //失败0 }else{ Power++; DQ=1; }}//----------------------------------void Skip(void){ Write_18B20(SkipK); Power++;}//----------------------------------void Convert (void){ Write_18B20(ConvertK); Power++;}//______________________________________void Get_Ds18b20L (void){ [1]=Read_18B20(); //读低位 Power++;}//______________________________________void Get_Ds18b20H (void){ [0]=Read_18B20(); //读高位 Power++;}//------------------------------------//规范化成浮点数// sssss111;11110000// sssss111;1111()//------------------------------------void ReadTemp (void){ unsigned char i; unsigned intF1=0; char j=1; code int Code_F[]={6250,1250,2500,5000}; ; if ([0] >0x80){ //负温度 =~; //取反+1=源吗 +符号S ; } <<= 4; //左移4位 [0]; // 温度整数 //************************************************** [1]>>=4; //--------------------------- for (i=0;i<4;i++){ //计算小数位 F1 +=([1] & 0x01)*Code_F; [1]>>=1; } ; //温度的小数 Power=0;}//----------------------------------void Delay1S (void){ static unsigned int i=0; if (++i==Seck) {i=0ower++;}}//----------------------------------void ReadDo (void){ Write_18B20(RdDs18b20K); Power++;}/**********************************函数指针定义***********************************/code void (code *SubTemp[])()={ Init,Skip,Convert,Delay1S,Init,Skip,ReadDo,Get_Ds18b20L, Get_Ds18b20H,ReadTemp};//**************************************void GetTemp(void){ (*SubTemp[Power])();}//---------------------------------------------------//将温度显示,小数点放大了 GetBcd(void){ LedBuf[0]= / 10; LedBuf[1]= % 10 +DotK; LedBuf[2]=()%10; if(LedBuf[0]==0)LedBuf[0]=Black; if() return; if(LedBuf[0] !=Black){ LedBuf[2]=LedBuf[1]; LedBuf[1]=LedBuf[0]; LedBuf[0]=Led_Pol; //'-' }else{ LedBuf[0]=Led_Pol; //'-' }}/*//---------------------------------------------------void JbDelay (void){ static long i; if (++i>=OffLed){ P1=0xff; P2=0xff; PCON=0x02; }}*//*****************************************************主程序开始1:2002_10_1 设计,采用DS18B20测量2:采用函数数组读取数码管显示正常!3:改变FHz可以用6,12MHz工作!******************************************************/code unsigned char Stop[3] _at_ 0x3b;void main (void){ P1=0xff; ; while (1){ GetTemp(); GetBcd(); // JbDelay(); LedOut(); }}复制代码 20091012_8b1ef92155560c13b5807ZmoDVSacjwD[1].jpg (12 KB) 2009-10-21 23:21 上传下载次数:0
二.系统软件设计图4 系统程序流程图 系统程序流程图系统程序流程图如图4所示。 温度部分软件设计DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输。其工作时序包括初始化时序、写时序和读时序。故主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。程序主要函数部分如下:(1)初始化函数//读一个字节函数ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(4);}return(dat);}//写一个字节函数WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}}(2)读取温度并计算函数ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t<<=8;t=t|a;tt=t*;t= tt*10+; //放大10倍输出并四舍五入---此行没用(3)主程序部分见前return(t);}三. 结束语AT89C2051单片机体积小、重量轻、抗干扰能力强、对环境要求不高、价格低廉、可靠性高、灵活性好。即使是非电子计算机专业人员,通过学习一些专业基础知识以后也能依靠自己的技术力量来开发所希望的单片机应用系统。本文的温度控制系统只是单片机广泛应用于各行各业中的一例,相信读者会依靠自己的聪明才智使单片机的应用更加广泛化。另外对本例子可以作一些扩展,单片机的应用越来越广泛,由于单片机的运算功能较差,往往需要借助计算机系统,因此单片机和PC机进行远程通信更具有实际意义。目前此设计已成功应用于钻井模拟器实验室室温控制。本文作者创新观点:采用的单片机AT89C2051性价比高,而且温度传感器DS18B20转化温度的方法非常简洁且精度高、测试范围较广。参考文献[1]林伸茂.8051单片机彻底研究基础篇 北京:人民邮电出版社 2004[2]范风强等.单片机语言C51应用实战集锦 北京:电子工业出版社 2005[3]谭浩强.C语言程序设计(第二版) 北京:清华大学出版社 1999[4]夏路易等.电路原理图与电路板设计教程 北京:北京希望电子出版社 2002[5]赵晶.Protel99高级应用 北京:人民邮电出版社 2000[6]聂毅.单片机定时器中断时间误差的分析及补偿[J] 微计算机信息 2002,18(4):37~38
智能化多路串行数据采集/传输模块的设计广州市光机电工程研究中心 行联合 广州市方统生物科技有限公司 关 强引言 随着电子技术的不断发展,目前对各种物理量的检测和控制都可得以实现。微机检测控制系统不仅运用到航天航空、机器人技术、纺织机械、食品加工等工业过程控制,而且已经成为日常各种家用电器当中的主要组成部分。其中,A/D(模拟数字转换)设备起着十分重要的作用。这样,一个系统中就会需要更多的A/D设备。一般是用扩展一块或多块A/D采集卡的方法去实现。当模拟量较少或是温度、压力等缓变信号场合,采用总线型A/D卡并不是最合适、最经济的方案。这里介绍一种以AT89C2051单片机为核心,采用TLC2543L 12位串行A/D转换器构成的采样模块,该模块的采样数据由单片机串口经电平转换后送到上位机(PC机)的串口COM1或COM2,形成一种串行数据采集串行数据传输的方式。主要元件功能介绍AT89C2051单片机AT89C2051是ATMEL公司推出的一种性能价格比极高的 8位单片机,其指令系统与MCS-51系列完全兼容。引脚排列如图1所示。TLC2543L串行A/D转换器 TLC2543L 采用SPI串行接口总线,SPI串行接口总线由Motorola公司提出,它是一种三线同步接口,分别为同步信号、输入信号和输出信号。另外芯片还有一根片选线,单片机通过片选线选通TLC2543L。其中,CLK为同步时钟脉冲,CS为片选线,DIN为单片机的数据输出和TLC2543L的数据输入线,DOUT为单片机的数据输入线和TLC2543L的数据输出线。图2为TLC2543L时序图。TLC2543L 是全双工的,即数据的发送和接收可同时进行。如果只是对TLC2543L写数据,单片机可以丢弃同时读入的数据;反之,如果只读数据,可以在命令字节后,写入任意数据。数据传送以字节为单位,并采用高位在前的格式。模块采用TI公司的TLC2543L 12位串行A/D转换器,使用开关电容逐次逼近法完成A/D转换过程。串行输入结构,能够大大节省51系列单片机I/O资源,且价格适中。其特点有: (1) 11个模拟输入通道; (2) 转换时间10 s;(3) 12位分辨率A/D转换器;(4) 3路内置自测试方式;(5) 采样率为66kbps;(6) 线性误差+1LSB(max)(7) 有转换结束(EOC)输出;(8) 具有单、双极性输出;(9) 可编程的MSB或LSB前导;(10)可编程的输出数据长度。 TLC2543L的引脚排列如图3所示。图3中AIN0~AIN10为模拟输入端; 为片选端;DIN 为串行数据输入端;DOUT为A/D转换结果的三态串行输出端;EOC为转换结束端;CLK为I/O时钟;REF+为正基准电压端;REF-为负基准电压端;VCC为电源;GND为地。电平转换器MAX232C MAX232C为RS-232收发器,简单易用,单+5V电源供电,仅需外接几个电容即可完成从TTL电平到RS-232电平的转换,引脚排列如图4所示。硬件设计 硬件电路如图5所示。单片机AT89C2051是整个系统的核心,TLC2543L对输入的模拟信号进行采集,转换结果由单片机通过(9脚)接收,AD芯片的通道选择和方式数据通过(8脚)输入到其内部的一个8位地址和控制寄存器,单片机采集的数据通过串口(3、2脚)经MAX232C转换成RS232电平向上位机传输。 单片机软件设计单片机程序主要包括串行数据采集/传输模块的系统信息、通道数、采集周期和通讯协议定义,以及数据采集和传输的标准子程序。TLC2543L的通道选择和方式数据为8位,其功能为:D7、D6、D5和D4用来选择要求转换的通道,D7D6D5D4=0000时选择0通道,D7D6D5D4=0001时选择1通道,依次类推;D3和D2用来选择输出数据长度,本程序选择输出数据长度为12位,即D3D2=00或D3D2=10;D1,D0选择输入数据的导前位,D1D0=00选择高位导前。TLC2543L在每次I/O周期读取的数据都是上次转换的结果,当前的转换结果在下一个I/O周期中被串行移出。第一次读数由于内部调整,读取的转换结果可能不准确,应丢弃。数据采集程序如下:sbit DATAIN=P1^1;sbit CLOCK=P1^0;sbit DATAOUT=P1^2;sbit CS=P1^3;bit datain_a_bit0(){ bit m=0;DATAOUT=1;m=DATAOUT;DATAIN=0;Nop();CLOCK=1;Nop();CLOCK=0;Return(m); }bit datain_a_bit1(){ bit m=0;DATAOUT=1;m=DATAOUT;DATAIN=1;Nop();CLOCK=1;Nop();CLOCK=0;Return(m); }单片机通过编程产生串行时钟,并按时序发送与接收数据位,完成通道方式/通道数据的写入和转换结果的读出,程序如下:unsigned int Tlc2543L(unsigned char ch){unsigned char i,chch=0;
unsigned int xdata xxx=0;
unsigned int xdata y=0;
CS=0;
Chch=ch<<4;
Y=chch;
Y<<=8;
I=0;
While(I<12)
{if((y&0x8000)==0)
{if(datain_a_bit0()==0) xxx&=0xfffe;
else xxx|=0x0001;
if(I!=11) xxx<<=1;
}else{if(datain_a_bit1()==0) xxx&=0xfffe;
else xxx|=0x0001;
if(I!=11) xxx<<=1;
}y<<=1;I+=1;}CS=1;Return(xxx);}串行数据传输模块包括串行口初始化子程序和数据传输子程序,各子程序分别如下。其中数据传输采用查询方式,也可以方便地改为中断方式。Void rs232init(){TMOD=0x20;
TH1=0xfd;
TR1=1;
SCON=0x50;
}void receandtran(){unsigned char da;
while(!RI)
RI=0;
Da=SBUF;
SBUF==da;
While(!TI);
TI=0;
}上位机接收数据所用C语言程序包括初始化子程序和接收子程序。各子程序分别如下:void cominit(void) {outportb(0x3fb,0x80); outportb(0x3f8,0x18); /与单片机波特率一致为9600bps*/outportb(0x3f9,0x00); outportb(0x3fb,0x03); /8位数据位,1位停止位,无奇偶校验*/outportb(0x3fc,0x03); /*Modem控制寄存器设置,使DTR和RTS输出有效*/outportb(0x3f9,0x00); /*设置中断允许寄存器,禁止一切中断*/}void data_rece(void) /*查询方式接收数据子程序*/{while(!kbhit()){while(!(inportb(0x3fd)&0x01));/*若接收寄存器为空,则等待*/printf("%x ",inportb(0x3f8)); /*读取结果并显示*/}getch();}智能化串行采集/传输模块在PCR仪中的应用在PCR仪的电路设计中,因需要检测的信号很多,包括热盖的温度检测,散热器的温度检测,腔体内部的温度检测,气流的温度检测,光信号的检测等等,为了简化电路,节约成本,减小体积,在选择A/D转换电路时选用了SPI总线的TLC2543,该芯片有多达11路的模拟信号输入端,完全满足PCR仪电路设计的需要,一个芯片既能完成检测多个信号的功能,又能节约单片机的资源,图6是其硬件原理图。结论 本文所述的智能化串行数据模块,可直接用于任何微机控制和检测系统中以取代原来的模数转换设计。经过实践检验,该模块功耗低、采样精度高、可靠性好、接口简便,有很高的实用价值。该智能模块的软件和硬件成功应用于生命科学仪器“热循环仪”的设计和实践中,使用方便,简单可行,节约成本,能够满足大多数数据采样的应用场合。资料来源:
251 浏览 5 回答
189 浏览 3 回答
190 浏览 5 回答
148 浏览 5 回答
84 浏览 6 回答
344 浏览 5 回答
282 浏览 3 回答
121 浏览 6 回答
144 浏览 3 回答
185 浏览 6 回答
294 浏览 4 回答
229 浏览 5 回答
98 浏览 5 回答
84 浏览 6 回答
336 浏览 5 回答