单片机实验报告(7)

2018-12-17 10:53

{

b=b*10+table[num]; } }

if(num==11) //- {

flag=1; fuhao=2; } if(num==10) //+ {

flag=1; fuhao=1; }

i=table1[num]; write_date(0x30+i); }

P3=0xf7; if(P3!=0xf7) {

delay(5); if(P3!=0xf7) {

temp=P3&0xf0; switch(temp) {

case 0xe0:num=12; break;

case 0xd0:num=13; break;

case 0xb0:num=14; break;

case 0x70:num=15; break; } }

while(P3!=0xf7); switch(num) {

case 12://x {write_date(0x30+table1[num]); flag=1; fuhao=3; } break;

case 13:// / { write_date(0x30+table1[num]); flag=1; fuhao=4; } break;

case 15://计算结果 {j=1;

if(fuhao==1){write_com(0x80+0x4f); //最后一个数的地址

write_com(0x04); //写入新数据后地址寄存器内容减1 显示

c=a+b; while(c!=0) {

write_date(0x30+c); c=c/10; }

write_date(0x3d); //= a=0;b=0;flag=0;fuhao=0; }

else if(fuhao==2){write_com(0x80+0x4f); write_com(0x04); if(a-b>0) c=a-b; else c=b-a; while(c!=0) {

write_date(0x30+c); c=c/10; }

if(a-b<0)

write_date(0x2d);//符号 45 write_date(0x3d); //= a=0;b=0;flag=0;fuhao=0; }

else if(fuhao==3){write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c!=0) {

write_date(0x30+c); c=c/10; }

相当于从后往前 write_date(0x3d); a=0;b=0;flag=0;fuhao=0; }

else if(fuhao==4){write_com(0x80+0x4f); write_com(0x04); i=0; if(b==0)//如果除数是0,则显示error { write_date('r'); write_date('o'); write_date('r'); write_date('r'); write_date('e'); } else{ c=(long)(((float)a/b)*1000); while(c!=0) {

write_date(0x30+c);//从个位开始写 最低位 c=c/10; i++; if(i==3)

write_date(0x2e);//. 46 }

if(a/b<=0)

write_date(0x30);//0 }

write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } } break;

case 14: //清除显示 {write_com(0x01);a=0;b=0;flag=0;fuhao=0;} break; } } }

main() { init(); while(1)

{

keyscan(); } }

5、电路图

6、仿真结果

能进行正常的 加减乘除运算,除数为0是显示error。

实验八 ADC0808/9信号采集实验

1、实验要求

本实验利用 LCD1602 和 AD0808 实现简单的交流信号过零检测与频率分析。要求信号幅度变化时(满量程的 5%-95%) ,不影响检测的结果。频率检测的结果通过 LCD1602 的第一行显示出来,信号过零时,能够通过 P2.6 输出一个脉冲宽度为 5us 的脉冲信号。

2、编程思路

LCD1602 的控制方法按 3.7 节所示方法进行 ADC0808 的控制方法按 3.8.1 所示方法

进行。这里主要是过零点的检测方法如何实现。不能采用判断所采集到的数据是否为 0 的方法来实现,因为你的采集时刻不一定能够严格对准过零时刻。但是,我们注意到在 0 点的两边信号的极性是发生变化的,我们可以利用这一特点来实现过零检测。正弦波每个周期有两个过零点,因此,1s 内过零次数除以 2 就是信号的频率。

因此,在程序中可以这样实现 。当每次采集到一个新的数据之后都要看一下这个数据 是正数还是负数。当这个数大于 128 时是正数,当它小于 128 时是负数。判断当前数据的正负极性和上一个数据的正负极性是否一致,如果不一致,则说明经过了一次过零点,将其记录入次数计数器。

ADC0808 的 CLK 仍然用定时器 T1 来实现,可以将其设置为 50kHz(硬件实现时可以更高,软件仿真再高将难以实现)。利用定时器 T0 实现 50ms 定时,并配合软件实现 1s 钟定时。采用 12M 晶振时,T0 采用方式 1,则处置应为(TH0=0x3C,TL0=0xB0)。 但是,由于中断处理函数需要一定的响应时间,因此这个参数只是理论计算结果,要根 据实测情况稍作调整。同样 T1 理论计算值和实际输出值可能也会有一定的差距,也要进行调整。

3、实验步骤

① 根据上述实验内容,参考 1.2.2,在 Proteus 环境下建立图 3.22 所示原理图,并将其 保存为 ADC0808_self.DSN 文件。

② 根据(2)和(3)画出流程图,并编写源程序,将其保存为 ADC0808_self.c。

③ 运行 Keil uVision2 开发环境,按照 1.1.3 节介绍的方法建立工程 ADC0808_self.uV2, CPU 为 AT89C51,包含启动文件 STARTUP.A51。

④ 按照 1.2.2 第(6)节介绍的方法将 C 语言源程序 ADC0808_self.c 加入工程

ADC0808_self.uV2,并设置工程 ADC0808_self.uV2 属性,将其晶振频率设置为 12MHz, 选择输出可执行文件,仿真方式为选择硬仿真,并选择其中的“PROTEUS VSM MONITOR 51 DRIVER”仿真器。

⑤ 构造(Build)工程 ADC0808_self.uV2。如果输入有误进行修改,直至构造正确,生 成可执行程序 ADC0808_self.hex 为止。

⑥ 为 AT89C51 设置可执行程序 ADC0808_self.hex。 ⑦ 运行程序,观察计算结果,并验证其是否正确。

⑧ 改变 RV1 的抽头位置,从而改变输入信号的幅值,观察计算结果是否正确。

⑨ 更改信号发射器的频率,再次验证其功能是否正确。(注意:因为是软仿真,所以信 号采集的速度受到限制,因此所输入的交流信号频率也不能太高,可以在 200Hz 以内 尝试)。

4、源程序:

#include //包含单片机寄存器的头文件


单片机实验报告(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安全标准化 现场勘察及整改方案

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

马上注册会员

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