找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3401|回复: 2
收起左侧

基于8255的LCD显示频率计设计

[复制链接]
ID:166400 发表于 2017-2-24 14:25 | 显示全部楼层 |阅读模式
1.用P1或P3口,产生一方波信号,频率为1000Hz,用LCD显示频率和周期。
2.将输出信号输入到另一端口作频率计的信号输入端,测量此方波信号的频率、周期和脉宽,在另一LCD上将参数值显示出来。
3.设置一功能键,能将当前LCD上的信号值锁定。
1.硬件部分电路设计
由于本次实验设计的是一个单片机的基于8255的LCD的频率计实验,通过使用定时器T0产生1s钟的定时,同时测量T1口输入的方波的低电平的次数,就可以得出所输入信号的频率,然后将测得的频率由锁存器连接到8255,再通过8255扩展连接到LCD液晶显示器。完整电路原理图如下:file:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
2.软件部分设计
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define PA XBYTE[0x007c]
#define PB XBYTE[0x007d]
#define COM XBYTE[0x007f]
uchar codetab1[]="F:";
uchar codetab2[]="C:";
uchardisp1[]="0000HZ";
uchardisp2[]="0.00ms";
sbit key1=P1^6;
sbit key2=P1^7;
uchar count,i;
uchar time;
unsigned long freq;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P1^2;
void delay(uchar z)                   //延时函数
{
    uchar x,y;
    for(x=110;x>0;x--)
    for(y=z;y>0;y--);
}
void write_com(uchar com)           //写命令
{
    lcdrs=0;   
    PA=com;
    delay(5);
    lcden=1;
    delay(2);
    lcden=0;
}
void write_dat(uchar dat)           //写数据
{
    lcdrs=1;
    PA=dat;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void init_lcd()                       //lcd初始化
{
    lcden=0;
//  lcdrs=0;
    lcdrw=0;
    write_com(0x38);/****工作方式设置***/
    write_com(0x0c);/****显示状态设置***/
    write_com(0x06);/****输入方式设置***/
    write_com(0x01);/****清除屏幕显示***/
    write_com(0x80);
}
void display()                         //显示函数
{
    if(freq>0&&freq<10000)
    {
        disp1[0]=freq/1000+'0';
        disp1[1]=freq/100%10+'0';
        disp1[2]=freq/10%10+'0';
        disp1[3]=freq/2%10+'0';
        if(freq<1000)
        {
            disp2[0]=1000/freq+'0';
            disp2[2]=10000/freq%10+'0';
            disp2[3]=100000/freq%10+'0';
        }
        else
        {
            disp2[0]=1000/freq+'0';
            disp2[2]=10000/freq+'0';
            disp2[3]=100000/freq%10+'0';
        }
        write_com(0x82);
        for(i=0;i<6;i++)
        {
            write_dat(disp1);
            delay(2);
        }
        write_com(0x80+0x42);
        for(i=0;i<6;i++)
        {
            write_dat(disp2);
            delay(2);
        }
    }
}
void main()
{
        COM=0x80;
        init_lcd();
        write_com(0x80);
        for(i=0;i<2;i++)
        {
            write_dat(tab1);
            delay(5);
        }
        write_com(0x80+0x40);
        for(i=0;i<2;i++)
        {
            write_dat(tab2);
            delay(5);
        }
        write_com(0x80+0x49);
        TMOD=0x51;                   //T0定时,T1计数
        TH1=0;
        TL1=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;                  
        ET0=1;
        ET1=1;
        EA=1;
        while(1)
        {
            if(key2==0)
            {
                delay(5);
                if(key2==0)
                {
                    TR1=TR0=1;
                }
            }
            else
            {
                display();         
            }
        }  
}
void timer0() interrupt 1               //T0中断,定时1s
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    count++;
    if(count==20)
    {
        count=0;
        TR1=0;TR0=0;
        freq=(TH1*256+TL1);
//      display();
        TH1=0;TL1=0;
    }   
}   
仿真测试
1.开始阶段输入第一组数据:file:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png输入第二组数据:file:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image004.pngfile:///C:/Users/acer/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
回复

使用道具 举报

ID:285693 发表于 2018-2-26 16:06 | 显示全部楼层
请问  软件的电路图有吗
回复

使用道具 举报

ID:286090 发表于 2018-2-27 19:34 | 显示全部楼层
楼主能教教我吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表