基于51单片机的频率温度测量系统报告_第1页
基于51单片机的频率温度测量系统报告_第2页
基于51单片机的频率温度测量系统报告_第3页
基于51单片机的频率温度测量系统报告_第4页
基于51单片机的频率温度测量系统报告_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实训任务实训目的掌握从事电子类高级专业人才必须具备的单片机基本理论、基础技能,接口及应用技术。同时通过实训,使学生对于单片机的组成原理和结构有比较深刻的理解,掌握单片机应用系统的设计方法,可比较灵活地使用单片机构成系统的外围芯片,具备单片机软件设计和编程能力。培养学生分析、解决电子电路应用问题的能力。为以后从事自动化类工作打下深厚基础。实训要求用PROTEL99画出原理图;用实验板搭建该单片机系统;用C语言编写程序(keil);改变电容频率显示发生变化;可测温度范围0℃~100℃通过按键实现频率与温度的切换显示。可测得占空比;(发挥部分)增加一个按键,可以设定上下限值(发挥部分)实训方案该单片机系统用台湾宏晶STC单片机系列为核心,用NEC555产生可调的振荡频率,输送给单片机外部中断口,单片机启动定时器定时,将每秒中的脉冲个数记下,即可得到频率;给铂电阻一个恒压,将铂电阻产生的电压信号经运算放大器放大后,送到单片机内部A/D,再经过标度变换即可求得温度。这两个功能可以通过两个按键相互转换。显示采用数码管显示,静态方式。用单片机的串行口转成并行来控制数码管的显示。图1.1系统原理框图电源模块原理图设计图2.1电源模块将220V交流电经保险丝接入开关电源模块,输出5V直流电压经开关后用一大一小两电容进行再滤波,用一个红色的led来显示开关的状态,当然需要加一个限流电阻,由该led的额定电压为2.4v额定电流为24ma故限流电阻R2=(5V-2.4V)/24ma单片机模块及其下载模块原理图设计图3.1单片机模块设计、单片机采用STC12C5A08AD也是51系列单片机,右边是51单片机的典型时钟电路和复位电路,左边的两个上拉电阻是用来切换频率温度显示。图3.2单片机下载模块这是RS232电平(串口电平)转TTL电平电路,构成单片机和电脑的通路,再采用STC_ISP软件进行下载。显示模块原理图设计图4.1显示模块原理图采用八段共阳数码管显示频率和温度,由于他们的额定电压时3,8v,每段静态额定电流为10ma,故限流电阻R1=(5-3.8)V/(10*24)ma。用移位寄存器74LS164把单片机输出的串行数据转成并行输出给数码管。程序设计#include<reg51.h>//包含单片机寄存器的头文件 sbitsclk=P2^1;sbitsda=P2^2;inttab[10]={0x03,0xf3,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//共阳数码管0~9编码voiddelay(xms)//延时程序{ inti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);}voidbit_out(biti)//给74ls164写入一位数{sclk=0;sda=i;sclk=1;//上跳沿时写入数据}voidleddisp(intnum)//把一个三位数显示到数码管上{ chari,j; intge,bai,shi;//把三位数变成3个一位数 bai=num/100; shi=(num%100)/10; ge=num%10; for(i=0;i<3;i++)//每次写一个数 { switch(i)//由于是移位寄存器是故先写个位数,再写十位数,最后写百位数 { case0: j=ge;break; case1: j=shi;break; case2: j=bai;break; } //把每个数对应的八位编码从低位到高位写入到74ls164 bit_out((bit)(tab[j]&0x01));/*段码二进制的最低位*/ bit_out((bit)(tab[j]&0x02)); bit_out((bit)(tab[j]&0x04)); bit_out((bit)(tab[j]&0x08)); bit_out((bit)(tab[j]&0x10)); bit_out((bit)(tab[j]&0x20)); bit_out((bit)(tab[j]&0x40)); bit_out((bit)(tab[j]&0x80));/*段码二进制的最高位*/ } /*输出段码,显示数字*/}voidmain(){ while(1) { leddisp(789); delay(100); } }频率模块原理图设计图5.1555频率模块原理图这是555构成的多谐振荡器用来产生方波信号,产生的频率为f=1/(ln2*C11*(R4+2R3))程序设计#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharflag=0;uintcount=0;intnum1=0;///////ledisp同上///////frequencyvoidinit_t0t1()//初始化计数器和定时器{ TMOD=0X51;//0101,0001计数器1方式1,定时器0方式1 TH1=0; TL1=0;//计数器清零 TH0=(65536-5000)/256; TL0=(65536-5000)%256;//计时器置初值使50ms溢出 EA=1; ET0=1; TR0=1; TR1=1;}intread()//读出计数器对15号引脚的计数值{ uchartl,th; intval; th=TH1; tl=TL1; val=th*256+tl; returnval; }voidt0()interrupt1//T0的中断服务程序,每50ms执行一次,目的是定时1s{ TH0=(65536-5000)/256;//重置初值 TL0=(65536-5000)%256; count++; //每过50ms加1 if(count>=20) //20个50ms即是一秒 { count=0; flag=1; }}voidmain(){ init_t0t1();//调用T0,T1初始化程序 while(1) { if(flag==1)//一秒时间到 { TR0=0; //关掉定时器计数器,防止中断 TR1=0; num1=read();//1s时间到就把读出计数器的值,此值就是频率 leddisp(num1);//显示频率 delay(100); TH1=0; TL1=0;//计数器清零 TH0=(65536-5000)/256; TL0=(65536-5000)%256;//重置初值 flag=0;//flag清零 TR0=1;//重新打开定时器计数器 TR1=1; } }}温度采集模块原理图设计图6.1温度测量模块左下角是利用TL431构成的稳压电源,输出电压为V5=Vref/R16*(R15+R16)=3.3v其中Vref=2.5v由运放的虚短性质知V6=3.3V,故流过R11的电流为1ma,由运放的虚断性质知流过PT100的电流也为1ma恒流。再由PT100的温度电阻特性如下图可知温度T=(Vpt(mv)-100*1)/0.385T>0右边是一个差分放大电路放大倍数op=(1+R8/R6),故Vout=op*Vpt程序设计#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint #defineADC_FLAG0X10;constdoublevin=5000;//电源电压,需要实测constdoubleiin=3.3/3.3;//流过PT的电流3.3v/3.3k,需要实测constdoubleop=(1080/108);//lm358的1号管脚(1v左右)除以67号管脚电压100mv左右,需要实测constucharc=18;inta[18];constdoubled=2;ucharcount2=0;ucharflag2;intnum1=0;//数码管显示温度//inttemp3; sfr ADC_CONTR=0XBC;//控制寄存器sfrADC_RES=0XBD;//转换结果的高八位寄存器sfr ADC_RESL=0XBE;//转换结果的低八位寄存器sfrP1ASF=0X9D;//P1第二功能控制寄存器/////////////leddispsbitsclk=P2^1;sbitsda=P2^2;inttab[10]={0x03,0xf3,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};voiddelay(xms);////////////////////////////////////////lvbovoidgetdata(intnum3)//把转换结果存进数组a[]{ if(count2<=(c-1)) { a[count2]=num3; count2++; } else { count2=0; flag2=1; } }intlvbo(int*p)//滤波程序,去掉最大和最小,剩下的取平均{intsum,val; chari,j; inttemp; for(i=0;i<=(c-2);i++) { for(j=i+1;j<=(c-1);j++) { if((p[i])<(p[j])) { temp=p[i]; p[i]=p[j]; p[j]=temp; } } } for(i=d;i<=(c-d-1);i++) {sum+=p[i]; } val=sum/(c-2*d); returnval; //returnp[(c+1)/2];}////////////////////////////////wenduvoidinit_ad() //初始化ad{ P1ASF=0X01;//只把P1.0作为ad用 ADC_RES=0X00; ADC_RESL=0X00;//转换结果寄存器清零 ADC_CONTR=0x88;//1010,100;打开ad转换电源,设定转换速度,选择p1.0作为ad通道 delay(2); IE=0XA0;//允许ad中断}voidadc()interrupt5//把转换完成,就把10位结果放入temp3,并开始下一次转换{ inttemp3,temp4;///////////////////////////////////////////////////////// ADC_CONTR&=!ADC_FLAG;//把flag位清零 temp3=ADC_RES; temp4=ADC_RESL&0x03;////////////////////////////////////////////////////////////////// temp3=temp3*4+temp4; getdata(temp3); ADC_CONTR=0x88; }//////////////// leddisp同上voidmain(){ doubletemp1,temp2,temp3,temp4,temp5; intnum3;init_ad(); while(1) { if(flag2==1)//计满18个数,开始滤波,然后计算温度 { flag2=0; EA=0;//不允许中断 num3=lvbo(a);//开始滤波 temp1=(vin*num3/1024); //测得的1号管脚电压值 temp2=temp1/op/iin-100;//测得的增加的电阻 num1=(int)((temp2/0.3851+0.5)); //温度 num1=(num1+temp3+temp4+temp5)/4;//取前三次和本次测得温度的平均值 temp3=temp4; temp4=temp5; temp5=num1; EA=1; } leddisp(num1); //显示温度 delay(1000); }}总电路图图7.1总原理图总程序图#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint #defineADC_FLAG0X10;constdoublevin=5000;//电源电压,需要实测constdoubleiin=3.3/3.3;//流过PT的电流3.3v/3.3k,需要实测constdoubleop=(1080/108);//lm358的1号管脚(1v左右)除以67号管脚电压100mv左右,需要实测constucharc=18;inta[18];constdoubled=2;ucharcount2=0;ucharflag2;////////////frequcharflag=0;uintcount=0;///////////////////intnum1=0;//数码管显示温度//inttemp3;///////////////////////////////////////////////////////////////////////////////////////// sfr ADC_CONTR=0XBC;//控制寄存器sfrADC_RES=0XBD;//转换结果高八位寄存器sfr ADC_RESL=0XBE;//转换结果的低八位寄存器sfrP1ASF=0X9D;//P1第二功能控制寄存器//sfrAUXR1=0XA2;/////////////leddispsbitsclk=P2^1;sbitsda=P2^2;inttab[10]={0x03,0xf3,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};////////sbitfreq=P2^7;sbitwendu=P0^4;/////////////// leddispvoiddelay(xms){ inti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);}voidbit_out(biti){sclk=0;sda=i;sclk=1;}voidleddisp(intnum2){ chari,j; intge,bai,shi; bai=num2/100; shi=(num2%100)/10; ge=num2%10; for(i=0;i<3;i++) { switch(i) { case0: j=ge;break; case1: j=shi;break; case2: j=bai;break; } bit_out((bit)(tab[j]&0x01));/*段码二进制的最低位*/ bit_out((bit)(tab[j]&0x02)); bit_out((bit)(tab[j]&0x04)); bit_out((bit)(tab[j]&0x08)); bit_out((bit)(tab[j]&0x10)); bit_out((bit)(tab[j]&0x20)); bit_out((bit)(tab[j]&0x40)); bit_out((bit)(tab[j]&0x80));/*段码二进制的最高位*/ } /*输出段码,显示数字*/}////////////////////frequencyvoidinit_t0t1(){ TMOD=0X51;//0101,0001计数器1方式1,定时器0方式1 TH1=0; TL1=0;//计数器清零 TH0=(65536-5000)/256; TL0=(65536-5000)%256;//计时50ms溢出 EA=1; ET0=1; TR0=1; TR1=1;}intread(){ uchartl,th; intval; th=TH1; tl=TL1; val=th*256+tl; returnval; }voidt0()interrupt1//定时1s,就把flag变为1{ TH0=(65536-5000)/256; TL0=(65536-5000)%256; count++; if(count>=20) { count=0; flag=1; }}////////////////////////////////////////lvbovoidgetdata(intnum3){ if(count2<=(c-1)) { a[count2]=num3; count2++; } else { count2=0; flag2=1; } }intlvbo(int*p){intsum,val; chari,j; inttemp; for(i=0;i<=(c-2);i++) { for(j=i+1;j<=(c-1);j++) { if((p[i])<(p[j])) { temp=p[i]; p[i]=p[j]; p[j]=temp; } } } for(i=d;i<=(c-d-1);i++) {sum+=p[i]; } val=sum/(c-2*d); returnval; //returnp[(c+1)/2];}////////////////////////////////wenduvoidinit_ad(){ P1ASF=0X01;//只把P1.0作为ad用 ADC_RES=0X00; ADC_RESL=0X00;//转换结果寄存器清零 ADC_CONTR=0x88;//1010,100;打开ad转换电源,设定转换速度,选择p1.0作为ad通道 //AUXR1|=0x04; delay(2); IE=0XA0;//允许ad中断}voidadc()interrupt5{ inttemp3,temp4;///////////////////////////////////////////////////////// ADC_CONTR&=!ADC_FLAG;//把flag位清零 temp3=ADC_RES; temp4=ADC_RESL&0x03;////////////////////////////////////////////////////////////////// temp3=temp3*4+temp4; getdata(temp3); ADC_CONTR=0x88; }//////////////////////////////voidmai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论