基于单片机的数字时钟频率计温度计.docx

上传人:b****6 文档编号:4339795 上传时间:2022-11-29 格式:DOCX 页数:34 大小:1.43MB
下载 相关 举报
基于单片机的数字时钟频率计温度计.docx_第1页
第1页 / 共34页
基于单片机的数字时钟频率计温度计.docx_第2页
第2页 / 共34页
基于单片机的数字时钟频率计温度计.docx_第3页
第3页 / 共34页
基于单片机的数字时钟频率计温度计.docx_第4页
第4页 / 共34页
基于单片机的数字时钟频率计温度计.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

基于单片机的数字时钟频率计温度计.docx

《基于单片机的数字时钟频率计温度计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字时钟频率计温度计.docx(34页珍藏版)》请在冰豆网上搜索。

基于单片机的数字时钟频率计温度计.docx

基于单片机的数字时钟频率计温度计

目录

摘要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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 兵器核科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1