基于51单片机的数字频率计设计_第1页
基于51单片机的数字频率计设计_第2页
基于51单片机的数字频率计设计_第3页
基于51单片机的数字频率计设计_第4页
基于51单片机的数字频率计设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、端口引脚第二功能RXD (串行输入口)TXD(串行输出口) (外部中断0)(外部中断1)T0(定时器0)T1(定时器1)(外部数据存储器写选通)(外部数据存储器都选通)名 称符 号标 准 值单 位MINTYPEMAX电路电源VDD - VSSVLCD驱动电压VDD - VEEV输入电压VINV静电电压-100V工作温度-20+70°C储存温度-30+80°C名 称符 号测 试 条 件标 准 值单位MINTYPEMAX输入高电平VIH-VDDV输入低电平VIL-V输出高电平VOH-V输出低电平VOL-V工作电流IDDmA液晶驱动电压VDD- VEETa = 0°CV

2、Ta = 25°CTa = 50°C项 目符 号测试条件标 准 值单位MINTYPEMAX允许时间周期TCYCE1000ns允许脉冲宽度,高电平PWEH450-ns允许上升和下降时间tEr tEf-25ns地址建立时间tAS140-ns数据延迟时间tDDR-320ns数据建立时间tDSW195-ns数据保持时间tH10-nsDATA HOLD TIMEtDHR20-ns地址保持时间tAH10-ns引 线 号符 号名 称功 能1Vss接地0V2VDD电路电源5V±10%3VEE液晶驱动电压5V电压差4RS寄存器选择信号H:数据寄存器 L:指令寄存器5R/W读/写信号

3、H:读 L:写6E片选信号下降沿触发,锁存数据7|14DB0|DB7数据线数据传输RSR/W操 作00指令寄存器(IR)写入01忙标志和地址计数器读出10数据寄存器(DR)写入11数据寄存器读出 显 示 位 序 号1 2 3 4 5 40 DD RAM 地 址(HEX)第 一 行00 01 02 03 04 . 27第 二 行40 41 42 43 44 . 67#include<reg51.h>#include<intrins.h>#include<math.h>#define uchar unsigned char#define uint unsigne

4、d int#define S_RST DS_RST=1#define C_RST DS_RST=0#define S_CLK DS_CLK=1#define C_CLK DS_CLK=0#define Write_Disable RW_DS1302(0x8e,0x80) /写保护#define Write_Enable RW_DS1302(0x8e,0x00) /允许写入sbit SET = P15;   /设置按键sbit ADD = P14;   /调整加sbit DEC = P16;   /调整减#define RdefineT

5、1 TH1=0;TL1=0;TR1=0;a=0; /初始化超时检测/#define Delay2us()   _nop_();_nop_(); /延时2us,每nop 1us/#define Delay8us()   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();#define     ReDetectTime    20 /设置重复检测次次数,超出次数则超时/ds18b20命令#define 

6、    SkipROM      0xCC#define     MatchROM     0x55#define     ReadROM      0x33#define     SearchROM    0xF0#define    

7、AlarmSearch 0xEC#define     Convert      0x44 /启动温度转换#define     WriteScr     0x4E#define     ReadScr      0xBE#define     CopyScr   &#

8、160;  0x48#define     RecallEE     0xB8#define     ReadPower    0xB4#define     md   collect_time0&0x0f#define     mg   (collect_time0&0x70)/16#define&#

9、160;    fd   collect_time1&0x0f#define     fg   (collect_time1&0x70)/16#define     sd   collect_time2&0x0f#define     sg   (collect_time2&0x30)/16sbit DS_RST = P12; 

10、;   /DS复位端sbit DS_CLK = P10;    /SCLK端sbit DS_IO   = P11;    /IO端sbit DS18B20 = P13; /温度传感器接口bit keyboard,flash,STA=1;uchar choose,a; uchar collect_time3=0x45,0x23,0x11;/定义变量秒分时uchar collect_temperature2 = 0;uchar num10 = 0x7e,0x48,0x3d,0x6d,0x4b,0x6

11、7,0x77,0x4c,0x7f,0x6f;    /七段数码管显示的段码uchar display8 = 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08;void delay(uint i)uint k;while(i-)    for(k=0;k<120;k+);void Dat_Int(void)/数据初始化P0=0xff;P1=0xff;P2=0xff;choose=0;flash=1;void Time01_Int(void)TMOD = 0x12; /定时器0为8位自动重载定时采样,定

12、时器1为16位超时检测处理TCON = 0x00;TH0 = 0x60;TL0 = 0x60;TR0 = 1;IE = 0x0a; /允许定时器0、1中断IP = 0x00;/*                                   &

13、#160;                  *              DS18B20温度传感器程序段                

14、*                                                  

15、;    */*11微秒延时函数*/void delayus(uint t)for(;t>0;t-);/*18B20复位函数*/void ow_reset(void)char presence=1;while(presence)while(presence)DS18B20 = 1;_nop_();_nop_();DS18B20 = 0;delayus(50); / 550usDS18B20 = 1; delayus(6); / 66uspresence=DS18B20; / presence=0继续下一步   delayus(45);&#

16、160;   /延时500uspresence = DS18B20;DS18B20 = 1; /*18B20写命令函数*/向 1-WIRE 总线上写一个字节void write_byte(uchar val)uchar i;for (i=8; i>0; i-) /DS18B20 = 1;_nop_();_nop_(); DS18B20 = 0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDS18B20 = val&0x01;      /最低位移出delayus(6)

17、;           /66usval=val/2;          /右移一位DS18B20 = 1;delayus(1); /*18B20读1个字节函数*/从总线上读取一个字节uchar read_byte(void)uchar i;uchar value = 0;for (i=8;i>0;i-)DS18B20 = 1;_nop_();_nop_();value>>=1;DS18B

18、20 = 0;             /_nop_();_nop_();_nop_();_nop_();   /4usDS18B20 = 1;_nop_();_nop_();_nop_();_nop_();   /4us if(DS18B20)value|=0x80;delayus(6);           /66usDS18B20

19、= 1;return(value);/*读出温度函数*/void Ds18b20_ReadEE(void)ow_reset();write_byte(SkipROM); / Skip ROMwrite_byte(Convert); / 发转换命令ow_reset();       /总线复位write_byte(SkipROM); / 发Skip ROM命令write_byte(ReadScr); / 发读命令collect_temperature0=read_byte(); /温度低8位collect_temperature1=re

20、ad_byte(); /温度高8位/*                                               

21、;       *              DS1302时钟芯片程序段                    *         

22、;                                             */void DS1302_InputByte(uchar byte

23、) /往DS1302写入1Byte数据 uchar i;uchar temp;temp = byte; for(i=8; i>0; i-)       DS_IO = temp&0x01;    S_CLK;    C_CLK;    temp = temp >> 1;    uchar DS1302_OutputByte(void) /从DS1302读取1Byte数据 uchar i;uchar temp=0

24、;for(i=0; i<8;i+)    C_CLK;    if(DS_IO!=0) temp|=(1<<i);    S_CLK; return(temp); void RW_DS1302(uchar reg, uchar byte)/向DS1302寄存器写数据C_RST;C_CLK;S_RST;DS1302_InputByte(reg); DS1302_InputByte(byte);S_CLK;C_RST; uchar Read_DS1302(uchar reg)/从DS1302

25、寄存器读数据uchar byte;    C_RST;    C_CLK;    S_RST;DS1302_InputByte(reg);byte = DS1302_OutputByte();    S_CLK;    C_RST;return(byte);void GetTime_DS1302(uchar *ucCurtime) /读取DS1302当前时间    ucCurtime0 = Read_DS1302(0

26、x81);/格式为: 秒 分 时ucCurtime1 = Read_DS1302(0x83);ucCurtime2 = Read_DS1302(0x85);void Set_Time(uchar *receive) /写时间Write_Enable; /控制命令,允许写操作RW_DS1302(0x80,receive0);RW_DS1302(0x82,receive1);RW_DS1302(0x84,receive2);Write_Disable; / 控制命令,写保护 /*          

27、                                            *      

28、0;            数码管显示程序段                   *                   

29、;                                   */void deal(void)/送显前的数据处理uint timer2;uint lstemp;timer2+;if(STA)   GetTime_DS1302(c

30、ollect_time);if(flash)/用于闪动效果的控制的display0 = numsg;display1 = numsd;display2 = numfg;display3 = numfd;display4 = nummg;display5 = nummd;elseswitch(choose)case 1:display0=0;break;case 2:display1=0;break;case 3:display2=0;break;case 4:display3=0;break;case 5:display4=0;break;case 6:display5=0;break;if(

31、timer2=3000)/间断性获取温度timer2=0;if(STA)TR0=0;Ds18b20_ReadEE();TR0=1;if(collect_temperature1>127)collect_temperature0=255-collect_temperature0;   collect_temperature1=255-collect_temperature1;    lstemp=(collect_temperature0)>>4)|(collect_temperature1)<<4);display6 = n

32、um(uchar)(lstemp)/10);display7 = num(uchar)(lstemp)%10); /*                                        &

33、#160;             *                   按键控制程序段                 

34、60;   *                                               &

35、#160;      */void Scan(void)if(SET=0&&keyboard=1) /检测设置键有无按下,并进行相应操作 if(SET=0&&keyboard=1)   RdefineT1;   /超时检测初始化    choose+;       while(SET=0);    if(choose=7)   

36、; TR0=0;   Set_Time(collect_time);    TR0=1;    STA=1;   /设置完毕,重新开始采集时间    choose=0;       if(choose)    /只有在时间调整时,加减按键才有作用 if(ADD=0&&keyboard=1)    /检测加调整键有无按下,并进行相应操作

37、0;     if(ADD=0&&keyboard=1)   RdefineT1;   /超时检测初始化a=0TR0=0;   switch (choose)        case 1 :if(sg=2)      collect_time2 = collect_time2&0x0f;      else collect_

38、time2+=16;      break;    case 2 :if(sg<2)&&(sd=9)      collect_time2 &= 0x30;      if(sg>=2)&&(sd=3)      collect_time2 &= 0x30;    &#

39、160; else collect_time2+;      break;    case 3: if(fg=5)      collect_time1 &= 0x0f;      else collect_time1+=16;      break;    case 4: if(fd=9)   &#

40、160;  collect_time1 &= 0xf0;      else collect_time1+;      break;    case 5: if(mg=5)      collect_time0 &= 0x0f;      else collect_time0+=16;     

41、; break;    case 6: if(md=9)      collect_time0 &= 0xf0;      else collect_time0+;      break;       TR0=1;   while(ADD=0);      if(DEC=0&&keyb

42、oard=1)   /检测减调整键有无按下,并进行相应操作      if(DEC=0&&keyboard=1)   RdefineT1; /超时检测初始化   TR0=0;    switch (choose)        case 1 :if(sg=0)       collect_time2=0x20;  

43、0;   else collect_time2-=16;      break;    case 2 :if(sg<2&&sd=0)       collect_time2 |= 0x09;      if(sg=2&&sd=0)       collect_time2 |= 0x03;&#

44、160;     else collect_time2-=1;      break;    case 3 :if(fg=0)       collect_time1 |= 0x50;      else collect_time1-=16;      break;    case 4 :

45、if(fd=0)       collect_time1 |= 0x09;      else collect_time1-=1;      break;    case 5 :if(mg=0)       collect_time0 |= 0x50;      else collect_time0

46、-=16;      break;    case 6 :if(md=0)       collect_time0 |= 0x09;      else collect_time0-=1;      break;       TR0=1;   while(DEC=0); 

47、0;    if(choose!=0)TR1=1;STA=0; /在设置模式下停止采集时间else TR1=0;STA=1;/*                                                      *       

温馨提示

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

评论

0/150

提交评论