51单片机50个实例代码,40个经典单片机实验
1.简介
数字频率计是现代科学研究生产中不可缺少的测量仪,用十进制表示被测频率。 基本功能是测量正弦波信号、方波信号和其他单位时间变化的物理量。
本系统采用AT89C52单片机智能控制,结合周边电子电路,所设计频率计性能稳定。 在软件设计中采用单片机c语言设计,单片机内部定时/计数器同时工作,在测频时将测量频率与测量周期相结合,提高了频率计的测量准确性。
测量结果输出显示在LCD1602上,结果准确到整数位。 频率计软件设计、系统软件设计简单,适用于测量频率为1~99999Hz的脉冲信号。
2.硬件设计
数字频率计的硬件原理比较简单,所以不详细介绍。 主要组成部分包括:
单片机最小系统LCD1602显示电路频率信号输入引脚系统电源3.软件设计
)1)液晶屏1602驱动程序
#define CHECK_BUSYsbit RS=P2^2; //端口定义sbit RW=P2^3; sbit EN=P2^4; # definers _ clr RS=0# definers _ setrs=1# definerw _ clr rw=0# definerw _ set rw=1# define en _ clr en=0# define RW_SET; EN_CLR; _nop_ (); EN_SET; 返回(位) )数据端口0x 80; #else return 0; # endif---------------------------------------- -写命令函数//忙的话等待RS_CLR; RW_CLR; EN_SET; 数据端口=com; _nop_ (); EN_CLR; //------------写入数据函数//忙时等待RS_SET; RW_CLR; EN_SET; 数据端口=数据; _nop_ (); EN_CLR; () ) 011000001 dlayms(5; //------------用于写入字符串函数的unsigned char y,unsigned char *s ) while(*s ) LCD_write_char,y,*s ); s; x; ()--------------------用于写入字符函数的unsigned char y,unsignedchardata(if ) y==0) LCD _ write \ }else{LCD_write_com(0xc0x ); } LCD _ write _ data (数据; (() ) ) ) ) ) ) ) ) ) ) ) 0
------- 初始化函数------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ }(2)外部频率信号处理程序
外部频率信号输入到单片机的外部计数器INT0(P3.2),计数器对每个脉冲进行计数,并采用内部定时器定时1秒钟,然后统计一秒钟内计数器的数值即可得出外部信号的频率大小
(3)主程序
/*------------------------------------------------ 主程序------------------------------------------------*/main(){ unsigned long int a; char temp[16]; //定义字符显示缓冲数组 Init_Timer0(); //初始化定时器0 Init_Timer1(); //初始化定时器1 LCD_Init(); //初始化液晶屏 DelayMs(10); //延时用于稳定,可以去掉 LCD_Clear(); //清屏 LCD_Write_String(0,0,"Frequency Meter");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入 while(1) { if(OVERFLOWFLAG)//检测溢出标志,如果溢出表明频率过高,显示溢出信息 { OVERFLOWFLAG=0;//标志清零 LCD_Write_String(0,1,"overflow >655KHz");} if(TIMERFLAG) //定时100ms到,做数据处理 { a=TL0+TH0*256;//读取计数值 a=a*10; //扩大到实际值 sprintf(temp,"FREQ:%08.0f Hz",(float)a); LCD_Write_String(0,1,temp);//显示到液晶第二行 TR0=1; //2个定时器打开 TR1=1; TH0=0; //保证计数器初值为0 TL0=0; TIMERFLAG=0; //打开计时计数标志 } }}源码+电路图 下载:关注公众号,首页回复“频率计”获取资料