基于单片机的数字时钟频率计温度计.docx
《基于单片机的数字时钟频率计温度计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字时钟频率计温度计.docx(34页珍藏版)》请在冰豆网上搜索。
基于单片机的数字时钟频率计温度计
目录
摘要I
AbstractII
1、基本原理1
1.1单片机的基本原理1
1.2、Protel的基本原理1
1.3keil的基本原理1
1.4Protues的基本原理2
1.5STC-ISP的基本原理2
2、方案论证2
2.1键盘、显示电路2
2.2数字时钟3
2.3数字温度计3
2.4数字频率计4
3、硬件设计5
3.1、最小系统5
3.2、下载电路5
3.3、键盘、显示电路6
3.4、数字温度计7
4、软件设计7
4.1、数字时钟7
4.2、数字温度计10
4.3、数字频率计14
5、仿真结果16
5.1数字时钟仿真结果16
5.2数字温度计仿真结果17
5.3数字频率计仿真结果18
6、实物运行结果照片20
6.1数字时钟实物结果照20
6.2数字温度计实物结果照20
6.3数字频率计实物结果照21
7、小结22
8、参考文献23
摘要
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
为了设计单片机最小系统以及拓展部分,首先利用PROTEL软件进行硬件设计;再利用KeiluV3软件完成应用系统软件设计;然后利用PROTEUS软件进行仿真设计;接着完成单片机最小系统和应用系统电路板的焊接;最后对电路进行调试;利用stc-isp软件完成在系统编程、下载,并完成系统软件调试。
本次实习主要完成的功能有数字时钟、数字计数器、数字频率计。
关键词:
单片机、PROTEL、PROTEUS、数字时钟、数字计数器、数字频率计
Abstract
Atpresentsinglechipmicrocomputerpermeateeveryaspectofourlives,almosthardtofindnotraceofthesinglechipmicrocomputerwhichfield.Missilenavigationdevice,theplaneonvariouskindsofinstrumentcontrol,computernetworkcommunicationanddatatransmission,industrialautomationprocessreal-timecontrolanddataprocessing,theextensiveuseofallkindsofintelligentICcard,civilianluxurycarsecuritysystem,video,videocamera,automaticwashingmachinecontrol,andSPCtoys,electronicpets,allofthesecannotleavethemicrocontroller.Therefore,thestudyofsinglechip,thedevelopment,andtheapplicationwillcreateanumberofcomputerapplication,andintelligentcontrolofscientistsandengineers.
Inordertodesignsinglechipminimizesystemandexpandpart,thefirstuseofPROTELsoftwarehardwaredesign;ReuseKeiluV3softwareapplicationsystemsoftwaredesign;AndthenthePROTEUSsoftwaresimulationdesign;Thenfinishsingle-chipmicrocomputersystemandapplicationsystemminimumcircuitboardofwelding;Thecircuitcommissioning;UseSTC-ispsoftwareinthesystemprogramming,download,andcompletethesystemsoftwaredebugging.Theworkofthemainfunctioncompletedigitalclock,digitalcounter,digitalfrequencymeter.
Keywords:
microcontroller,PROTEUS,digitalclockPROTEL,,digitalcounters,digitalfrequencymeter
1、基本原理
1.1单片机的基本原理
单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。
从上世纪80年代,由当时的4位、8为单片机,发展到现在的32位300M的高速单片机。
1.2、Protel的基本原理
基于PCB的电路设计是EDA技术的重要内容,Protel软件是实现基于PCB设计的一个杰出工具。
Protel99se凭借其强大的功能大大提高了电子线路的设计效率,已经成为设计工作者首选的电子线路CAD软件。
1.3keil的基本原理
1.KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
2.与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
1.4Protues的基本原理
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译。
1.5STC-ISP的基本原理
STC-ISP是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052、系列和12C5410等系列的STC单片机,使用简便,现已被广泛使用。
2、方案论证
2.1键盘、显示电路
显示电路:
数码管采用共阴极接法,因此单片机的信号从P0送出后需借上拉电阻。
用两个74HC573锁存器分别作为位选和段选信号,它们的锁存端分别与单片机的P2^6和P2^7相连。
位选选通时为低电平,位选关闭时为高电平。
键盘:
本次实验中用到了7个键盘,因而不需全部扫描。
初始化后,进入时钟显示,令P3^7=0,矩阵键盘的最右四个用来调整时间和返回。
若没有键按下,再令P3^6=0,分别检测P2^1,P2^2,P^3,来实现进入温度,频率计,以及返回的功能。
2.2数字时钟
基本时钟显示如原理所述,控制部分,将P3^7置0后,通过判断P3^0-P3^3,可判断最右边4个键的按下,第一个键按下时,进入调整模式,停止计时,第一次调整秒的值,再按则调整分值,以此类推,第二个键按下则相应的值加一,第三个键按下则减一,第四个键按下返回正常时钟显示。
2.3数字温度计
通过第二行,第三列的键按下后,进入温度子程序。
2.3.1初始化
1.先将数据线置高电平1;
2.延时(该时间要求不是很严格,但是要尽可能短一点);
3.数据线拉到低电平0;
4.延时750us(该时间范围可在480~960us);
5.数据线拉到高电平1;
6.延时等待,如果初始化成功则在15~60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在。
但是应注意,不能无限地等待,不然会使程序进入死循环,所以要进行超时判;
7.若CPU读到数据线上的低电平0后,还要进行延时,其延时的时间从发出高电平算起最少要480us;;
8.将数据线再次拉到高电平1后结束。
2.3.2DS18B20写数据
1.数据线先置低电平0;
2.延时确定的时间为15us;
3.按从低位到高位的顺序发送数据(一次只发送一位);
4.延时时间为45us;
5.将数据线拉到高电平1;
6.重复1~5步骤,直到发送完整个字节;
7.最后将数据线拉高到1。
2.3.3DS18B20读数据
1.将数据线拉高到1;
2.延时2us;
3.将数据线拉低到0;
4.延时6us;
5.将数据线拉高到1;
6.延时4us;
7.读数据线的状态得到一个状态位,并进行数据处理;
8.延时30us;
9.重复1~7步骤,直到读取完一个字节。
先启用温度转换函数,然后获取温度并显示,再进行温度处理,将浮点型温度格式化为字符型,再显示温度,之后通过串口传送给另一个单片机(从机)。
2.4数字频率计
按下第三行,第三列的按键后进入频率计的程序。
将T1作为计数器,设置计数初值0,则计满65536个脉冲后进入T1中断,然后使count加一,同时T0定时器仍在计时,计到1s时,计算脉冲总数k=count*65536+TH1+TL1。
然后分别计算相应位
K0=k/100000;
K1=k/10000%10;
K2=k/1000%10;
K3=k/100%10;
K4=k/10%10;
K5=k%10;然后显示在数码管上。
3、硬件设计
3.1、最小系统
单片机最小系统由单片机STC89C52、复位电路、时钟电路组成如图3.1所示:
图3.1:
最小系统
3.2、下载电路
下载部分有MAX232和RS-232C串口电缆组成。
如图3.2所示:
图3.2:
下载电路
3.3、键盘、显示电路
利用单片机最小系统、6个7段LED数码管、12个按键,设计制作一个键盘、显示电路。
可以使用8279键盘显示接口电路,也可以使用单片机的并行接口作为键盘显示接口。
在这个实习中我选着使用单片机的并行接口作为键盘显示接口,这里用到的是4ⅹ3的矩阵键盘接到单片机的P2口。
如图3.3:
图3.3:
键盘电路
用到六个数码管,只需要控制段选和位选就可以控制那个数码显示什么数字。
因为段选和位选都P0口提供的数据控制,因此我用了两个寄存器分别用段选信号和位选信号来控制,分时传送段选信号和位选信号。
如图3.4:
图3.4:
显示电路
3.4、数字温度计
利用DS18B20可编程1-Wire数字温度传感器芯片来完成温度传感部分,如图3.5:
图3.5DS18B20温度传感电路
4、软件设计
4.1、数字时钟
4.1.1数字时钟软件设计要求
在键盘、显示电路的基础上完成一个数字时钟的设计,完成以下功能:
(1)要求以24小时计时方式显示时、分、秒;
(2)时、分、秒可以通过按键分别调整。
4.1.2数字时钟流程图
4.1.3数字时钟程序
程序如下:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitdula=P2^6;
sbitwela=P2^7;
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^2;
uchari,num,hour,min,sec,num1;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//带小数点的0~9编码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//不带小数点的0~9的编码
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddisplay(ucharnum1,uchardat)//数据显示程序
{//num是第几个数码管,dat是要显示的数字
uchari;
i=0xff;
i=i&(~((0x01)<<(num1)));//用I来存储位选数据,只有一位为0
wela=1;P0=i;wela=0;
dula=1;P0=table[dat];//编码赋给P0口
dula=0;P0=0xff;
delayms(5);
}
voiddis_time(ucharhour,ucharmin,ucharsec)//显示时间函数
{display(0,hour/10);display(1,hour%10+10);
display(2,min/10);display(3,min%10+10);
display(4,sec/10);display(5,sec%10);}
voidkeyscan()
{if(key1==0)
{delayms(10);if(key1==0)
{num=4;TR0=0;num--;while(!
key1);delayms(10);while(!
key1);
while(num)
{dis_time(hour,min,sec);
if(key1==0){delayms(10);if(key1==0)num--;}while(!
key1);
if(key4==0){delayms(10);if(key4==0)num=0;}while(!
key4);switch(num){
case3:
if(key2==0){delayms(10);if(key2==0){sec++;if(sec==60)sec=0;while(!
key2)display(4,sec/10);display(5,sec%10);}}
if(key3==0){delayms(10);if(key3==0){sec--;if(sec==255)sec=59;while(!
key3)display(4,sec/10);display(5,sec%10);}}
break;
case2:
if(key2==0){delayms(10);if(key2==0){min++;if(min==60)min=0;while(!
key2)display(2,min/10);display(3,min%10+10);}}
if(key3==0){delayms(10);if(key3==0){min--;if(min==255)min=59;while
(!
key3)display(2,min/10);display(3,min%10+10);}}
break;
case1:
if(key2==0){delayms(10);if(key2==0){hour++;if(hour==24)hour=0;while(!
key2)display(0,hour/10);display(1,hour%10+10);}}
if(key3==0){delayms(10);if(key3==0){hour--;if(hour==255)hour=23;while(!
key3)display(0,hour/10);display(1,hour%10+10);}}
break;}}
TR0=1;}}}
voidinit_t()
{
TH0=(65536-4597)/256;TL0=(65536-4597)%256;
TH1=(65536-1)/256;TL1=(65536-1)%256;
TMOD=0x51;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;}}}
4.2、数字温度计
4.2.1数字温度计和时钟分别显示的要求
当按下键盘上的温度显示按键时将实时温度信息显示在LED显示器上,当按下键盘上的时钟显示按键时,恢复时钟的正常显示;
4.2.2数字温度计和时钟分别显示的流程图
4.2.3数字温度计和时钟分别显示的程序
前半部分同数字时钟后半部分为:
oiddsreset()//DS18B20复位,初始化函数
{uinti;ds=0;i=103;
while(i>0)i--;
ds=1;i=4;while(i>0)i--;}
bittempreadbit(void)//读1位数据函数
{uinti;bitdat;ds=0;i++;//i++起延时作用
ds=1;i++;i++;
dat=ds;i=8;while(i>0)i--;
return(dat);}
uchartempread(void)//读一个字节数据函数
{uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在dat里}
return(dat);}
voidtempwritebyte(uchardat)//向DS18B20写一个字节数据函数
{uinti;ucharj;bittestb;for(j=1;j<=8;j++)
{testb=dat&0x01;dat=dat>>1;
if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}
else{ds=0;i=8;while(i>0)i--;ds=1;i++,i++;}}}
voidtempchange(void)//DS18B20开始获取温度并转换
{dsreset();delayms
(1);tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令}
uintget_temp()//读取寄存器中存储的温度数据
{uchara,b;dsreset();delayms
(1);tempwritebyte(0xcc);
tempwritebyte(0xbe);a=tempread();//读低8位
b=tempread();//读高8位
temp=b;temp<<=8;//两个字节组合为1个字
temp=temp|a;f_temp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625度
temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;returntemp;//temp是整型}
voiddis_temp(uintt)//显示温度数值函数t传递的是整型的温度值
{uchari;i=t/100;//除以100得到商,为温度的十位
display(0,i);//在第1个数码管上显示
i=t%100/10;//100取余再除以10得到商,为温度的个位
display(1,i+10);//在第2个数码管上显示
i=t%100%10;//100取余再用10取余,为温度的小数位
display(2,i);//在第3个数码管上显示//}
4.2.4串口通信要求
通过串行通信的方式,将采集到的实时温度信息送至第二个单片机系统,并在第二个单片机系统显示实时温度。
4.2.5串口通信程序流程图
4.2.6串口通信的程序
发送程序:
#include
#defineucharunsignedchar
void send(char a)
{SBUF=a;while(!
TI);TI=0;}
temp1=(uchar)(get_temp()/2);send(temp1);
接收程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//带小数点的0~9编码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//不带小数点的0~9的编码
sbitwela=P2^7;//数码管位选
sbitdula=P2^6;//数码管段选
ucharbuff;uintbuff1;
voidintcom()
{TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xfd;TL1=0xfd;TR1=1;}
voiddelay(uintz)
{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}
voiddisplay()
{buff1=buff*2;wela=1;P0=0xfe;wela=0;dula=1;P0=table[buff1/100];
dula=0;P0=0xff;delay(5);wela=1;P0=0xfd;wela=0;dula=1;
P0=table[buff1/10%10+10];dula=0;P0=0xff;delay(5);
wela=1;P0=0xfb;wela=0;dula=1;P0=table[buff1%10];dula=0;
P0=0xff;delay(5);}
voidmain()
{uch