电科本1001+基于单片机的频率计设计(4)

2019-04-14 11:38

商丘学院本科毕业设计(论文)

例如,1602液晶显示器的第2行第1个位置的地址是40H,是不是只要写进去40H就可以把光标定位到这个位置的呢?答案是否定的!因为在写入显示地址的时候需要最高位DB7持续为高电平状态,因此实际需要写进去的数据应该为:

01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在对液晶初始化时需要先设置显示模式,液晶显示字符的时候光标是会自动向右移动的,不需要人工进行控制或干预。每次输入指令前都需要判断液晶是不是处于忙的状态。

1602液晶液晶显示屏内部的字形数据存储单元在出厂前已经存储了一百六十个最常用的点阵式字符图形,这些字符有:小写字母、大写字母、常见符号、日本特殊字和阿拉伯数字等。每一个字符均拥有一个特定的代码,以英文字符为例,“D”的代码是01000100B(44H),使用时就是把液晶模块44H地址中的数据调用,这样“D”就会显示在1602液晶显示屏上。具体请参考:附录C 1602液晶标准字符库表。 3.5.2 显示电路

首先说明1602液晶显示芯片在本作品上需完成的功能:没有信号输入时液晶显示“fre= Hz”;有信号输入时液晶显示单片机RAM中的全局变量“fre”的即时数值(最多显示8位,不显示无效的“0”,如若fre=123,则液晶显示“fre=123Hz”)。

图3.11 LCD1602液晶显示芯片

LCD1602连接电路如图3.11所示,DB0-DB7为1602数据口,分别接单片机的P0.0-P0.7口;单片机的P1.0口接1602的复位脚RS;单片机的P1.1口接1602的读/写控制脚RW;单片机的P1.2口接1602液晶显示屏的使能端EN;通过一个10K的可调电阻调整VEE电压改变液晶,使液晶显示到最佳效果。通过这种连接方式,就能够实现通过1602液晶显示器显示实时测得频率。

12

商丘学院本科毕业设计(论文)

4 系统软件设计

系统软件设计部分是本设计能否成功的关键。因为本设计是基于单片机的频率计设计,而单片机的核心就是程序,所以本设计的核心功能都是通过软件编程的形式实现的。 4.1 主程序流程图设计

本次程序设计采用的是C语言程序设计。数字频率计的系统软件设计采用模块化设计方法。整个系统由初始化模块、定时器中断服务模块和显示模块。

主程序流程图如图4.1所示:

中断到来 系 统 进 入 待 中断没有到来 机,等待中断 系统初始化LCD,定时器 系统上电复位

频率<200KHz 频率>200KHz 中断到来,判 断频率范围

采用原始脉冲计数器数值运算 1602显示频率,系统计数 器清零。继续 等待中断

采用100分频脉冲计数器运算 图4.1 主程序流程图

13

商丘学院本科毕业设计(论文)

4.2 程序设计

程序主要分为三部分,分别是主函数、分频函数与显示函数。 4.2.1 主函数

主函数的主要任务就是进行各种初始化并开启无限循环检测输入信号频率值的变化并通过改变fre的值在LCD1602上表现出来(在无信号输入的情况下,初始化函数将LCD1602上显示的字符固定为“fre= Hz”)。

//----------------主函数-------------------- void main() { }

4.2.2 分频处理算法设计

“未分频脉冲和100分频脉冲分别进入单片机的两个定时/计数器,经过软件算法处理,产生待测信号频率数值”毫无疑问是最关键的环节。

//-------------------定时/计数器初始化-------------- void timer_init(void) //定时/计数器初始化 { 初值

unsigned char i; LCD_init();

timer_init(); //定时/计数器初始化 for(i = 0;i<4;i++) { } while(1) { }

dis_num(); //显示 delay_1s();

LCD_disp_char(i+0,1,character_1[i]);

TMOD=0x66; //计数器0和计数器1工作工作方式2,自动重装

TH0=0; //计数器初值为0 TL0=0;

TR0=1; //计数器开始计数

14

商丘学院本科毕业设计(论文)

ET0=1; //打开计数器0中断 TH1=0; //计数器初值为0 TL1=0;

TR1=1; //计数器开始计数 ET1=1; //打开计数器1中断

RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值, RCAP2L=(65536-62500)%6; //TH2和TL2将会在中断产生时自动使

TH2=RCAP2H,TL2=RCAP2L。

TH2=RCAP2H; //12M

晶振下每次中断

62.5ms(1s=1000ms=62.5ms×16)

}

//------------------中断函数----------------------

void timer2(void) interrupt 5 //定时器2中断(62.5ms) {

time++;

TF2=0; //定时/计数器2的中断标志位TF2不可以通过硬件TL2=RCAP2L;

ET2=1; //打开定时器2中断 TR2=1; //定时器2开始计时 EA=1; //开总中断

清零,因此需要在中断服务程序里把它清零

if (time==16) //定时1s时间到 {

time=0; //计时清0 EA=0; //关中断

fre=(long)count1*256+TL1; //count*256强制转换成long型,否则将不产生

进位~先判断分频后(计数器1)

FLAG = 0;

if(fre<2000)//如果不到200KHz则读取分频前(计数器0)频率(200K÷100=2000) {

fre = (long)count*256+TL0;

15

商丘学院本科毕业设计(论文)

}

FLAG = 1;

}

if(!FLAG) { }

fre = fre *100; //100分频

TL0=0; //清零计数器0计数 TH0=0; TL1=0; TH1=0;

count=0; //清零计数器0计数 count1=0;

EA=1; //开中断 }

//---------------------------------------------------------------- void timer0(void) interrupt 1 //计数器0中断(100分频前) {

count++;

}

//---------------------------------------------------------------- void timer1(void) interrupt 3 //计数器1中断(100分频后) { }

4.2.3 显示函数

1602液晶显示芯片在本作品上需完成的功能:①没有信号输入时液晶显示“fre= Hz”②有信号输入时液晶显示单片机RAM中的全局变量“fre”的即时数值(最多显示8位,不显示无效的“0”,如若fre=123,则液晶显示“fre=123Hz”)。

void dis_num(void) {

count1++;

unsigned char i=0,j=0,k=0;

LCD_write_command(0x01);//清除屏幕显示 character[0] = fre/10000000;

16


电科本1001+基于单片机的频率计设计(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:自媒体时代我们离真相越来越远 一辩稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: