搜索
bottom↓
回复: 0

不懂为什么我的用50ms测得频率没有显示啊,请教各位大侠....

[复制链接]

出0入0汤圆

发表于 2012-9-3 22:08:54 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<intrins.h>


sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7;
sbit fmq=P3^6;
sbit P10=P1^0;
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
unsigned int num1;
unsigned int num2;
unsigned int count1;
unsigned int count2;
unsigned char  result1[15]={0};
//unsigned int i;

unsigned int i;
  void delay1ms(uint i)
{

uchar j;
while(i--)
{
for(j=0;j<115;j++)          //1ms基准延时程序
{
  ;
}


}
  
}
  void delay1ms1()
{
                   unsigned char i,j;       
                 for(i=0;i<10;i++)
                  for(j=0;j<33;j++)
           ;                 
}

void delay500us()
{

unsigned char j;

for(j=0;j<57;j++)          //500us基准延时程序
{
  ;
}
}  
void beep()        //产生1KHZ频率声音的函数
{
        fmq=0;
        delay500us();
        fmq=1;
        delay500us();       

}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned int n)
{
           unsigned int i;
        for(i=0;i<n;i++)
        delay1ms1();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
  {
            bit result;
                RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
            RW=1;
            E=1;        //E=1,才允许读写
            _nop_();   //空操作
            _nop_();
            _nop_();
                   _nop_();   //空操作四个机器周期,给硬件反应时间       
            result=BF;  //将忙碌标志电平赋给result
                E=0;
            return result;
  }
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void Write_com (unsigned char dictate)
{   
    while(BusyTest()==1); //如果忙就等待
         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
         RW=0;   
         E=0;                   //E置低电平(写指令时,
                             // 就是让E从0到1发生正跳变,所以应先置"0"
         _nop_();
         _nop_();             //空操作两个机器周期,给硬件反应时间
         P0=dictate;            //将数据送入P0口,即写入指令或地址
         _nop_();
         _nop_();
         _nop_();
         _nop_();               //空操作四个机器周期,给硬件反应时间
         E=1;                   //E置高电平
         _nop_();
         _nop_();
         _nop_();
         _nop_();               //空操作四个机器周期,给硬件反应时间
          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
     Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"       
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
    while(BusyTest()==1);  
          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
          RW=0;
          E=0;            //E置低电平(写指令时,,
                       // 就是让E从0到1发生正跳变,所以应先置"0"
          P0=y;           //将数据送入P0口,即将数据写入液晶模块
          _nop_();
          _nop_();
          _nop_();
              _nop_();       //空操作四个机器周期,给硬件反应时间
          E=1;          //E置高电平
          _nop_();
          _nop_();
          _nop_();
          _nop_();        //空操作四个机器周期,给硬件反应时间
          E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInt(void)
{
           delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
           Write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
        delay(5);   //延时5ms 
        Write_com(0x38);
        delay(5);
        Write_com(0x38); //3次写 设置模式
        delay(5);
        Write_com(0x0F);  //显示模式设置:显示开,有光标,光标闪烁
        delay(5);
        Write_com(0x06);  //显示模式设置:光标右移,字符不移
        delay(5);                                                                                          
        Write_com(0x01);  //清屏幕指令,将以前的显示内容清除
        delay(5);
}


void f0_test(void)
{  
           count1=0;
        EA=1;                  //开总中断
        ET0=1;                                   //允许定时器T0
    EX0=1;
        IE0=1;       
    IT0=0;
       

        TMOD=0x01;             //使用定时器T0的模式1
        TH0=(65536-50000)/256; //定时器T0的高8位赋初值
        TL0=(65536-50000)%256; //定时器T0的高8位赋初值
                               //定时器中断溢出          

        TR0=1;                                   //启动定时器T0  
       
         TF0=1;  
                                
       
   }


    void display(void)
   {
                   
          int i;
               
               

                //result1[4]=       
                result1[3]=(num1%10)+'0';
        result1[2]=((num1/10)%10)+'0'   ;
                result1[1]=((num1/100)%10)+'0'        ;
                result1[0]=(num1/1000)+'0';
       
     
        delay(5);
                WriteAddress(0x02);  // 设置显示位置为第一行的第1个字
                delay(5);
                  i = 0;
                while(result1 != '\0')    //'\0'是数组结束标志
                        {                                                // 显示字符        WWW.RICHMCU.COM
                                        WriteData(result1);
                                        i++;
                                        delay(10);
                        }  
               
          
                                       
        }
       
  
         




void main()
{  
   count1=0;
   count2=0;
  while(1)
  {       
    //LcdInt();
         f0_test();
        display();
    // panduan();
//        Write_com(0x0c);
        // count1=0;
   }
}


           void int_count0(void) interrupt 0
{
   count1++;
}



  void Time0(void) interrupt 1  //“interrupt”声明函数为中断服务函数
                 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{          
      TR0=0;
      //count2++;
          
          num1=count1;
          //count1=0;
         // TH0=(65536-50000)/256; //定时器T0的高8位赋初值
          //TL0=(65536-50000)%256; //定时器T0的高8位赋初值
     
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 18:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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