数字式相位差测量系统(基于51单片机)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字相差检测仪的制作
专业:电气
班级:XX班
学号:XXXXXXXXXX 学生姓名:XXX
指导教师:XX
目录
摘要: ............................................................................................................... 错误!未定义书签。
Abstract: ............................................................................................................. 错误!未定义书签。
第一章绪论. (5)
1.1 测量相位差的作用和意义 (5)
1.2 相位差测量的研究现状 (5)
1.3本课题研究的主要内容 (7)
第一章:最小二乘法以及快速傅里叶变换简介 (8)
1.1:最小二乘法简介 (8)
2.1 主程序流程图 (12)
2.2位倒序算法实现 (12)
2.4 FFT算法的实现 (13)
2.5 AD采样的使用 (14)
2.6 定时器的使用 (15)
第三章:硬件电路设计 (17)
3.1 移相电路的设计 (17)
3.2 电压跟随器模块 (17)
3.4 电源电路 (18)
3.4.1 变压器简介 (18)
3.4.2 单相全桥整流电路 (19)
结论 (20)
致谢 ................................................................................................................... 错误!未定义书签。
参考文献(Reference).. (21)
附录: (22)
基于最小二乘法的低频数字相位差检测仪的研究
摘要:常见的相位差检测方法一般是过零法,通过外部硬件电路对正弦信号的零点进行检测,产生的脉冲信号出发MCU的外部中断,通过MCU的定时器计算出信号的频率以及相位差。
但是,现实生活中的正弦信号,特别是电网提供的交流电,或多或少都会有失真,如果交流电在过零点处失真特别严重,就可能会导致检测不出零点或者检测出多个零点,并且这种检测方法外部硬件电路比较复杂,成本较高。
所以,本文提出的最小二乘法因其成本低,使用范围广,可靠性高而被广泛应用。
主要方法是,在单周期内对两个信号进行2N点的采样,
把离散化后的信号相乘,通过快速傅里叶变化分解出其中的直流信号,最终计算得到两个正弦信号的相位差。
关键词:最小二乘法,快速傅里叶变换
The low-frequency digital phase detector based on
least-square method research
Abstract:the phase difference detection method in common is the zero passage method and through external hardware circuit of zero point of sine signal detection, produce the pulse signal of the external interrupt of MCU by MCU timer to calculate the frequency and phase difference of signals.
Sine signal in real life, however, especially the alternating current power grid provided, there will be more or less distortion, if alternating current (ac) in a zero distortion is extremely serious, is likely to lead to detect the zero or detect more than zero, and the test method of external hardware circuit is more complex, high cost. So, in this paper, the least square method because of its low cost, wide use, high reliability and is widely used. The main method is, in a single cycle of two signals 2 n sampling points,
After the discretization of the signal multiplied by fast Fourier change into the dc signal, finally the phase difference of two sine signals is calculated.
Keywords: least squares method, fast Fourier transform
第一章绪论
1.1 测量相位差的作用和意义
信号的相位差测量在电力系统、工业自动化、功率因素测量、谐波分析等许多领域都有着广泛的应用。
相位差是工业领域经常需要测量的一个参数,它是信号分析的基本任务,在实际工作中,经常需要测量两个同频信号之间的相位差,来解决实践中的各种问题。
相位差测量与传统电压、电流信号、温度量测量不同。
首先,相位差依附于电压、电流信号中,如何消除电压、电流、频率变化对相差测量的影响是相差测量中很重要的一个方面;其次,相差是一个比较量,测量两路信号之间的相差不但需要保证两路信号的频率相同,而且需要排除信号幅值不同等其他因素造成的影响,所以如何准确可靠得测量相差是一个值得研究的课题。
在实际工作中,通常需要测量两个同频信号的相位差来解决实际问题。
例如电网合闸时,需要保证两电网电信号的相位相同,这时需要精确测量两工频信号之间的相位差,如果两信号之间的相差不相同,就会有很大的冲击电流流过电网,会对电网产生很大的破坏,所以必须精确测量出两信号之间的相位差。
随着数字电子技术的发展,由数字电路组成的控制系统已经变成现代检测技术的主流,人们对数字测量系统也越来越重视。
相差的数字测量采用液晶屏显示,精度高,稳定性好,读数方便,所以,相位差的数字化测量有应用前景很广泛。
1.2 相位差测量的研究现状
随着电子技术和计算机技术的发展,相位测量技术的发展也非常迅速,尤其在电气、电力电子技术方面得到了极大的重视和发展。
目前,相位测量技术已比较完善,测量方法及理论也比较成熟,相位测量仪已商品化和系列化,广泛应用于测量RC、LC网络、放大器相频特性以及依靠信号相位传递信息等方面的电子设备。
现代相位测量技术的可分为三个阶段
第一阶段是在早期采用的如李妙育法、阻抗法、和差法、三电压法等,这些测量方法通常采用对比法和平衡法,虽然方法简单,但测量精度较低;
第二阶段是利用数字专用电路、微处理器等来构成测试系统,使测量精度得以大大提高;
第三阶段是充分利用计算机及智能化测量技术,从而大大简化程序设计,增强功能,使得响应的产品精度高、功能更全。
同时,各种新的算法、测量手段和新的设计方法及器件也随之出现。
目前,国内外提出了许多改进的高精确度的相位差测量方法,主要包括有:
(1)采用专用的数字处理芯片,利用正余弦表格及快速傅立叶变换方法来计算相位差,可大大提高测量精度。
(2)采用新器件及设计方法来提高相差测量精度及展宽频带。
、
(3)采用新的算法来改进相差测量
(4)采用高精度相位测量设备,通过相位输出信号,利用桥路与输入信号相位进行比较,
从而测出相位差。
基于不同微处理芯片也已开发了许多不同的相位计,常见的有以下几种:
(1)基于FPGA/CPLD的相差测量。
其优点是可以进行功能仿真,而且FPGA和CPLD 的片内资源丰富,设计的流程简单,缺点是开发成本高。
(2)基于单片机控制的相位差测量设备。
该方法硬件上需要用到过零检测及异或电路,将两路输入信号的相位差转换成方波,再利用单片机测出该方波的占空比,并最终换算出电压。
(3)基于DSP技术的相位计。
相位检测系统主要由前置放大电路实现将被测信号(无论是电压还是电流)衰减为5V以内交流电压信号;由电压跟随器将前后级电路进行隔离,以保证测量系统不吸收被测信号源的能量,保证信号源的工作状态不被改变。
(4)基于PLD和PLL的相位计。
该数字式相位差测量仪以可编程逻辑PLD和锁相环PLL 倍频电路为核心,实现两列信号相位差的自动测量。
在相位/频率测量技术领域,美国一直处于遥遥领先的地位,主要的公司有Agilent(安捷伦)、Tektronix(泰克)、AD-YU公司、DRANETZ实验室。
此外,俄罗斯,英国以及德国在此领域也具有较高水平。
国外的主要产品有美国安捷伦构思的53131I A型通用计数器,该产品提供10秒/位的频率/周期分辨率和225MHz带宽,测量结果范围是1ns-10000s,时间分辨率为500ps,测相范围为-180°-360°,测量频率高达12.4GHz。
标准测量包括相位、频率、周期、时间间隔和上升/下降时间等。
英国Avpower公司的高精度相位计SD1000:具有自动设置量程的功能,测量频率范围高达700KHz,允许输入频率高达100GHz,相位分辨率高达0.001,相位测量范围为-180°-180°,在相位测量精度方面,低频精度为±0.0020,高频精度为±0.20,微波为±0.10。
该产品被公认为是目前等级最高的相位计,输入信号幅值得范围为1mV-350V。
通过调研,目前国外商品化的通用相位计的水平低频段达1xHz数量级。
国内相位计领域起步较晚,相位测量技术的研究开始于70年代,早期研究相位测量的单位和技术人员很少,国内主要有天津中环电子生产商品化相位计,相位计量机构是中国计量科学研究院和国防科工委,产品主要测量工频信号。
目前,国内相位计产品领域发展迅速,如深圳创新仪器仪表SP312B系列等精度通用计数器/相位计,它以高性能的A VR单片机与CPLD为核心,测频分辨率8位/秒,可测周期范围10ns-7000s,测时范围40ns-7000s,相位测量范围0°-360°,测相精度0.05°,测量功能与Agilent 53131A型计数器基本相同,但测量指标略低。
此外还有天津中环科仪电子仪器公司HG4180型数字相位计,其特点包括:频率范围覆盖范围广、测量精度高、不但能测量相位,而且能测量频率、在全部频率范围内都能直接得到五位有效数字的频率读数、具有IEE488借口选件,主要用于工业测量领域。
总体来说,我国相位测量技术与国外相比还有较大的差距,主要体现在产品种类少,配套产品少、产品测试功能单一、仪器精度、数字化和自动化程度较低,相位计量标准不完备。
因此对高精度相位测量算法的研究和相位计产品化设计刻不容缓。
1.3本课题研究的主要内容
当需要测量大功率,高压信号之间的相位差时,通常需要通过放大器或者变压器先将大功率、高压信号转换成小功率、低压信号才能输入到检测设备进行相位差进行测量。
但现实中的器件往往与理论上有一些差距。
受到器件的非线性、环境因素的影响,变换后的信信号总会出现或大或小的失真,在信号过零点出现震荡。
这样,通过过零检测的方法根本无法检测相位差。
这就需要有一种新的方法来进行相位差测量。
本设计主要是研究如何利用最小二乘
2点的采样,在法和快速傅立叶变换算法来测量相位差。
通过对两路信号在一个周期内进行N
将采样后的两路信号相乘,通过快速傅立叶变换算法计算出相乘后的信号中的直流分量的大小。
因为该直流分量的大小仅与两路信号的幅值及其相位差有关系,所以可以在通过公式计算出相位差。
应用这种测量方法,不仅提高了测量精度,节省了硬件成本,而且可以允许变换后的输入信号有一定程度的失真。
第一章:最小二乘法以及快速傅里叶变换简介1.1:最小二乘法简介
由欧拉公式1.2.6可以得出
利用旋转因子nk
N W 的对称性和周期性可得:
再根据旋转因子k
N W 的对称性可得:
N N 11--11N
N
--
DFT变换后的序列应该是0 4 2 6 1 5 3 7,这个排列看起来似乎很乱,没有什么规律,但是我们把他写成二进制的形式,其规律也就一目了然了,通过雷德算法可以得到位倒叙后的正确排序。
第二章:软件设计2.1 主程序流程图
图2 FFT算法程序流程图
FFT算法C语言函数原型为void FFT(struct compx *value,int num),形参struct compx *value 是结构体指针,用来传入待进行FFT运算的复数序列,形参int num用来传入待运算的复数的
个数。
2.5 AD采样的使用
STC12C5A60S2系列带AD转换的单片机的AD转换口在P1口(P1.0_P1.7),有8路十位高速AD,速度可达250KHZ(25万次每秒)。
八路电压输入型AD,可做温度检测,键盘扫描,频谱检测等。
上电复位后P1口为弱上拉型I/O口,用户还可以通过软件设置将任何一路设置为AD转换,不需作为AD转换的口可继续做IO口使用。
STC12C5A60S2系列单片机的AD是逐次比较型AD。
逐次比较型AD由一个比较器和DA 转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序得对每一输入电压与内置DA 转换器输出作比较,通过多次比较,使转换所得的数字逐次逼近输入模拟量与对应值,逐次比较型AD具有速度高,功耗低的优点。
首先,模拟信号要输入到AD必须要有AD输入通道,所以先要把复用IO口P1设置为AD输入,通过对P1ASF寄存器器操作可以实现,需要将P1口的哪一位设置为AD输入,则将P1ASF的该位置一。
例如:要将P1.0作为AD输入,其他的作为普通IO口,则将P1ASF 设置为0X01。
接下来,模拟信号输入到AD通道以后,要使用AD模块对其进行转换,但是AD模块只有一个,所以同一时刻只能选择一个通道进行转换,因此启动AD转换之前还必须告诉AD当前要对哪一个通道进行转换。
此外,在启动转换之前还要告诉AD模块基准电压是多少,转换速率是多少,以及转换精度是多少位,这些都设置完成以后就可以启动AD 转换了。
知道了使用AD模块需要做的相应的配置,接下来就是具体如何实现这些配置了。
首先,通过CH0:CH2可以选择AD转换的通道。
例如:当CH0:CH2=000是即选择通道0。
AD模块的电源只能用5V的单片机电源,无法选择,通过对ADC_POWER置一可以给AD模块上电,AD转换的基准电压就是5V,当不进行AD转换时,为了省电,要断掉AD模块的电源。
通过SPEED0和SPEED1两位可以设置AD的转换速率,分别可以设置成90,180,
360,540个时钟周期(AD的时钟基准信号就是单片机的时钟基准信号)。
AD的转换精度可配置成10位或者8位,默认为10位,8位转换精度太低,所以我们直接使用默认的10位精度,增加两位精度对转换速率影响并不大。
最后,将ADC_START置一就可以启动AD转换了。
最后,通过查看ADC_FLAG就可以知道AD转换是否完成了,当ADC-FLAG=1时说明AD 转换已经完成,可以读取数据了。
ADC转换完成后,十位的ADC转换结果从低到高分别存放在ADC_RESL的低2位和ADC_RES中,通过公式
RESL
ADC
RES
ADC
adcresult+
=
4
_X
03
&
*
_
可以得到十位的ADC转换结果,最后,再通过公式:
可以计算出当前采样信号的电压值。
图3 ADC转换模块的构成示意图
2.6 定时器的使用
STC12C5A60S2单片机与89C51单片机的定时器类似,不同的是它的定时器时钟信号可以是是单片机的震荡周期,也可以是其12分频(与普通的89C51单片机相同),在本设计中采用定时器0,使其工作在方式1,时钟信号为震荡周期的12分频。
因为待测的正弦信号的频率为50HZ,所以周期为20MS,要再一个周期内完成32次采样,所以采样的时间间隔为625uS,所以定时器计数器的初值为625,初始化完成后,启动定时器,在定时器的中断服务程序中进行AD采样,就可以在每个周期内对信号进行等时间间隔的32点采样。
2.7 12864液晶的使用方法
首先,通过RS,RW这两个引脚的电平,12864可以知道当前写入的是数据还是指令。
当RS=0,RW=0时,12864认为当前写入的是指令。
当RS=1,RW=0时,12864认为当前写入的是数据,数据写入以后,通过IO口操作,在EN引脚产生一个上升沿来告诉12864数据已经发出,让12864采样当前接口的数据。
当然,之前的这些操作都是在12864为空闲的情况下才可以操作的,通过读取12864接口的最高位的电平就可以判断当前12864当前是否为空闲。
当RS=0,RW=1时,读取12864当前数据接口的值,然后在判断其最高位的值就可以知道12864的状态了。
将写数据和写指令这两个功能进行封装,得到数据写和指令写的函数,函数原型为
void lcd_wcmd(uchar cmd)(写命令函数)
void lcd_wdat(uchar dat)(写数据函数)
按一定的顺序发送几个不同的指令以后可以完成对12864的初始化操作,将该操作封装好,得到函数原型为void lcd12864_init()
最后,要搞清楚汉字区在屏幕上的分布情况,再写入要操作的区域的坐标,最后写入要显
示的字符的ASCII值或者汉字的编码值就可以了,例如,要在第一行第二列显示一个汉字,只要先写入指令81H,再写入该汉字的对应的编码值即可。
通过一定的算法,可以将在屏幕的固定区域写入字符和写入字符串这两个功能封装,得到两个函数原型如下:void display_12864(uchar x,uchar y,uchar *str)
void dischar_12864(uchar x,uchar y,uchar zifu)
图4 12864液晶屏汉字区分布
2.8 软件设计部分总结
可移植性一直是评价程序好坏的一个很重要的标准,该项目所用到的三个算法全部由个人完成,在算法复杂度尽可能低的情况下,把算法的可移植性做好。
由于算法部分不涉及任何硬件,所以这三个算法可以在任何MCU上运行,只需要修改相应的形参即可。
这三种算法也是数字信号处理中常用的算法,将其功能封装好做成可移植函数也为以后项目中调用该算法提供了方便.
第三章:硬件电路设计
3.1 移相电路的设计
测相差一般都是针对正弦信号,所以要需要有两路相位差可调的正弦信号,这里采用最简单的RC 低通滤波电路。
其上限截止频率为RC
f H π21
=
,输出信号与输入信号的相位差为H
f f
arctan
-=ϕ,通过调节滑动变阻器的阻值可以调节相位差的大小,这样就可以得到两路相差可调的正弦信号了,电路图如下所示:
3.2 电压跟随器模块
电压跟随器具有输入电阻大,输出电阻小,输出电压等于输入电压的优点,通常用作前后级电路的隔离。
电压跟随器可以采用集成运放,也可以采用三极管构成的共集放大电路,考虑到现在的集成运放价格非常低,所以这两种方法的成本是差不多的,显然,采用集成运放构成的电压跟随器具有更高的稳定性,所以在本设计中采用了集成运算放大器构成的电压跟随器作为移相电路和加法电路的隔离电路。
3.3 加法器模块 3.3.1 OP07简介
OP07是一种低噪声,非斩波稳0的双极性集成运算放大器,由于OP07具有非常低的输入失调电压(对于OP07最大为25uV ),所以在很多场合下不需要在增加额外的调0电路,OP07的输入电阻非常大,且开环增益高,其输入偏置电流通常为2nA,所以OP07常用于高增益测量设备或者放大传感器的微弱信号。
OP07是双电源供电,电源电压范围为V V 183±-±,电源电压越大,集成运放的线性区就越宽,所以可以根据输出信号的大小来确定电源电压的大小,要注意到,电源电压不能小于输出信号。
例如,输出信号的范围为0-5V ,则电源电压一定要大于5V ,否则,当输入信号过大,输出电路的晶体管由放大区进入饱和区,集成运放就由线性区进入到非线性区,输出电压等于电源电压,不在具有放大功能。
3.3.2 实用电路设计
由于STC12C5A60S2单片机的片内AD 只能测0-5V 的模拟信号,所以如果直接把信号接到单片机的AD 输入通道上,信号负半波是测不到的,所以考虑先把该交流信号与一个直流信号相加,使得该正弦信号的电压值在任何时刻都大于0,再用单片机AD 进行采样,最终结果在减去直
图5 移相模块电路图
流信号。
这样就可以把交流模拟信号转换成数字信号了。
加法器采用同相加法运算电路,通过反馈电阻R10和R11引入深度负反馈,使得运放工作在线性区。
当集成运放工作在线性区时,其输入端具有虚短和虚断效应。
通过集成运放的虚短和虚断效应可以推导出输出信号与输入信号的关系为
)(
**
162
151R u R u R R R u N
p f o +=
其中161514////R R R R p =, 1012//R R R N =,将图中数据带入公式可得21u u u o +=
3.4 电源电路
电源电路由变压器,单相全桥整流电路,滤波电路和稳压模块构成,首先通过变压器将220V 交流电编程12V 交流电,然后利用单相全桥整流电路将交流信号整成直流信号,再通过滤波电路,利用电容的充放电使得电压信号波动较小,最后通过稳压芯片输出稳定的电压信号。
3.4.1 变压器简介
变压器也可以称之为静态电机,就是通过磁场来耦合前后级电路,通过电磁场来进行能量传递。
当在变压器的一次侧加交流电压U1,交变的电流流过线圈后,在铁芯内产生交变的磁
图6 加法器电路图
场,该磁场与二次侧线圈交链,在二次侧感应出电动势,这样一次侧的能量就通过磁场传递到了二次侧。
假设一次侧线圈匝数为N1,二次侧线圈匝数为N2,由法拉第电磁感应定律可知,一次侧电压为dt d N u φ1
1-=,二次侧感应电动势为dt
d N u φ22-=,所以一二次侧电压比2
1
21N N u u =。
3.4.2 单相全桥整流电路
桥式整流电路的工作原理如图11所示。
在u2的正半周,D1、D3导通,D2、D4截止,电流由TR 次级上端经D1→ RL →D3回到TR 次级下端,在负载RL 上得到一半波整流电压。
在u2的负半周,D1、D3截止,D2、D4导通,电流由Tr 次级的下端经D2→ RL →D4 回到Tr 次级上端,在负载RL 上得到另一半波整流电压。
这样就在负载RL 上得到一个与全波整流相同的电压波形,其电流的计算与全波整流相同,即
29.0U U L =
L L R U I 2
9.0=
流过每个二极管的平均电流为
L L D R U I I 2
45.02==
每个二极管所承受的最高反向电压为
22U U RM =
图7 单相全波整流电路
结论
本文讨论了一种全新的相位差检测的算法,相对于传统的过零检测方法具有很多优势,容许待检测信号具有一定的失真,检测精度更高,但是硬件和软件相对而言也更加复杂,本设计最终实现了0-90º的相位差测量,测量精度精确到小数点后两位。
在此基础上,利用STC12C5A60S2单片机实现了本设计方案,结果表明:
本设计方案对硬件设计要求很高,因为AD模块不能采样到低于0的电压,而交流信号必定会存在负半波,为了能对信号整个周期进行采样,必须通过硬件电路对信号进行处理,在通过算法对其还原,如果硬件电路做的不好,处理信号的过程中因为集成运放的温飘和零飘是的信号产生较大的失真,会导致相差检测波动较大
32点的FFT运算的精度过低,也会导致相差测量精度不高,在本设计中为了节省成本,采用了价格较低的STC单片机,由于收到内存的限制,最大只能运行32点的FFT运算,所以相差测量精度很低,且波动较大。
如果想要提高测量精度,可以换更高端的MCU或者扩展存储器,采用128或者256点的FFT运算,可以大大提高相位差测量的精度。
由于时间仓促,本设计还有很多的不足之处,测量精度也不高且波动较大。
硬件稳定性和算法精度都有待改进,在今后的设计中可以从这两个方面进行改进。
参考文献(Reference)
[1] 谭浩强. C 程序设计(第二版)[M].北京:清华大学出版社.2004
[2] 童诗白、华成英. 模拟电子技术基础(第四版)[M].北京:高等教育出版社. 2006
[3] 邱关源、罗先觉.电路(第五版)[M].北京:高等教育出版社. 2006
[4] 赵金利、肖兴达.单片机原理及应用教程(第二版)[M].北京:机械工业出版社. 2007
[5] 邓新蒲、卢启中、孙仲康.数字式相位差测量方法及精度分析 [E]. 国防科技大学学报.2002
[6] 胡文军、李震梅、饶明忠.基于虚拟仪器的电网信号相位差测量研究[B].山东理工大学学报.2003
[7] 王兆华等.基于全相位谱分析的相位测量原理及其应用 [J].数据处理与采集.2009年第六期
[8] 王兆华等.基于FFT的相位差测量及虚拟相位计的实现.[J].电子测试.2008年第九期
[9] 曹海翔等.利用小波变换抑制数字相位测量中的噪声.[J].电工电能新技术.1999年第二期
[10] 丁玉美、高西全.数字信号处理[M].西安电子科技大学出版社.2004年
附录:
一:源程序
1 AD.H文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
void Delay1(uint n)
{
uint x;
while (n--)
{
x = 5000;
while (x--);
}
}
void InitADC()
{
P1ASF = 0xff; //设置P1口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
Delay1(2); //ADC上电并延时
}
long int GetADCResult(uchar ch)
{ long int adcresult;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
adcresult=ADC_RES*4+(ADC_RESL&0x03); //返回ADC结果return adcresult;
}2:12864.C文件
#include "lcd12864.h"
void delay5us(uchar n)
{
uint x;
while(n--)
{
x=0;
while(x--);
}
}
/*******************************************************************/ /* */ /* 延时函数 */ /* */ /*******************************************************************/ void delayms_12864(uint n)
{
uint x;
while(n--)
{
x=628;
while(x--);
}
}
/*******************************************************************/ /* */ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/ /* */ /*******************************************************************/ bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
// NOP();
delay5us(12);
result = (bit)(P0&0x80);
return(result);
}
/*******************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/ /* */ /*******************************************************************/ void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delay5us(12);
//NOP();
LCD_EN = 1;
//NOP();
delay5us(12);
LCD_EN = 0;
}
/*******************************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/ /* */ /*******************************************************************/ void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
//NOP();
delay5us(12);
LCD_EN = 1;
//NOP();
delay5us(12);
}
/*******************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*******************************************************************/ void lcd12864_init()
{
//LCD_PSB = 1; //并口方式
LCD_RST = 0; //液晶复位
delayms_12864(3);
LCD_RST = 1;
delayms_12864(3);
lcd_wcmd(0x34); //扩充指令操作
delayms_12864(5);
lcd_wcmd(0x30); //基本指令操作
delayms_12864(5);
lcd_wcmd(0x0C); //显示开,关光标
delayms_12864(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delayms_12864(5);
}
/*********************************************************
* *
* 图形显示 *
* *
*********************************************************/
void photodisplay(uchar *bmp)
{
uchar i,j;
lcd_wcmd(0x34); //写数据时,关闭图形显示
for(i=0;i<32;i++)
{
lcd_wcmd(0x80+i); //先写入水平坐标值
lcd_wcmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据
lcd_wdat(*bmp++);
delayms_12864(1);。