找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5656|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机检测频率并输出到1602

[复制链接]
跳转到指定楼层
#
ID:265358 发表于 2017-12-22 16:10 | 显示全部楼层 回帖奖励 |正序浏览 |阅读模式
  1. #include<STC11.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit LCD_RS= P3^6;//定义LCD引脚
  5. sbit LCD_RW= P3^0;
  6. sbit LCD_E=  P3^7;
  7. //sbit beep=P2^0;
  8. uchar code DIS[]={"--Sound_waves---"};//NE555 测试;
  9. uchar code dsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;
  10. uchar i,c[4],a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  11. uint s;
  12. /*====================延时子程序====================*/
  13. void delay(uint z)
  14. {
  15.     uchar m;
  16.         for(;z>0;z--)
  17.                 for(m=124;m>0;m--);
  18. }
  19. void delay400ms(void)////400ms延时
  20. { uchar z = 5;
  21.   uint m;                                                                                                                                                          
  22. while(z--)
  23.   { m=7269;
  24.     while(m--);
  25.   }
  26. }
  27. /*====================LCD1602子程序====================*/
  28. /*-- 读状态 --*/
  29. //读状态子程序;有返回值;返回值类型为CHAR型;
  30. //读回的状态通过RETURN返回;

  31. uchar read_estate(void)                                        //定义有返回值的函数;
  32. { P1=0Xff;                                                //把LCD端口全置1方便读取信号;
  33.   LCD_RS=0;                                                                //RS置0;
  34.   LCD_RW=1;                                                                //RW置1;
  35.   LCD_E=0;                                                            //E端置0;
  36.   delay(10);                                                        //短延时;
  37.   LCD_E=1;                                                                //E端置1;以锁存数据;
  38.   while(P1&0x80);                 //检测忙,则一直循环;
  39.   return(P1);                                                //返回读取的信号;
  40. }
  41. /*-- 写数据 --*/

  42. //写数据子程序;无返回值;输入变量I;
  43. //I为要写入LCD中的数据;
  44. //数据类型CHAR形;

  45. void write_data(uchar i)                                //定义输入变量值I;
  46. {                                                                               
  47.   read_estate();                                                //检测忙信号;
  48.   P1=i;                                                        //把I中数据送到LCD数据端;
  49.   LCD_RS=1;                                                                //RS置1;
  50.   LCD_RW=0;                                                                //RW置0;
  51.   LCD_E=0;                                                                //E置0;
  52.   delay(10);                                                        //短延时;
  53.   LCD_E=1;                                                                //E置1;以锁存数据;
  54. }
  55. /*-- 写指令 --*/

  56. //写指令子程序;无返回值;输入二个变量I和J.
  57. //I为要写入LCD的指令;J为判断要不要检测忙.
  58. //如果J为0则不判断检测忙;
  59. //如果J为1则判断检测忙;

  60. void write_dictate(uchar i,j)                        //定义二个变量;
  61. {
  62.   if(j)read_estate();              //根据需要检测忙;
  63.   P1=i;                           //把要写入的数据送到LCD数据端;
  64.   LCD_RS=0;                                            //RS置0;
  65.   LCD_RW=0;                                                                //RW置0;
  66.   LCD_E =1;                                                                //E端置0;
  67.   delay(10);                                                        //延时;
  68.   LCD_E =0;                                                                //E端置1;以锁存数据;
  69. }
  70. /*-- LCD初始化 --*/

  71. //LCD初始化程序;主要作用初始化LCD,对LCD进行复位以及设置;

  72. void initialization(void)                                //定义函数;
  73. {
  74.   delay(50);                                                        //延时5MS;
  75.   write_dictate(0x38,0);                                //写指令38H;不检测忙;
  76.   delay(50);                                                        //延时5MS;
  77.   write_dictate(0x38,0);                                //写指令38H;不检测忙;
  78.   delay(50);                                                        //延时5MS;
  79.   write_dictate(0x38,0);                                //写指令38H;不检测忙;
  80.   delay(50);
  81.   write_dictate(0x38,1);                                //显示模式设置;检测忙;
  82.   write_dictate(0x08,1);                                //关闭显示;检测忙;
  83.   write_dictate(0x01,1);                                //显示清屏;检测忙;
  84.   write_dictate(0x06,1);                                //显示光标移动设置;检测忙;
  85.   write_dictate(0x0C,1);                                //显示开及光标设置;检测忙;
  86. }
  87. /*-- 在指定位置显示一个字符 --*/
  88. void displayonechar(uchar x, y,ddata)
  89. {
  90. y &= 0x01;
  91. x &= 0x0f;                             //限制X不能大于15,Y不能大于1
  92. if (y) x+= 0x40;                      //当要显示第二行时地址码+0x40;
  93. x+= 0x80;                             //算出指令码
  94. write_dictate(x,0);                    //这里不检测忙信号,发送地址码
  95. write_data(ddata);
  96. }

  97. /*-- 在指定位置显示一串字符 --*/
  98. void displaylistchar(uchar x,y,uchar code *ddata)
  99. {uchar a=0;
  100. y&=0x01;
  101. x&=0xf;
  102. while(ddata[a]>0x20)
  103. { if(x<=0xff)
  104.         {  
  105.           displayonechar(x, y,ddata[a]);
  106.           a++;
  107.           x++;
  108.         }
  109.    }
  110. }
  111. /*====================MAIN主程序====================*/
  112. void main()
  113. {

  114.   delay400ms();//延时400MS
  115.   initialization();//LCD复位;
  116.   displaylistchar(0,0,DIS);//显示NE555 测试;
  117.   displayonechar(0,1,'F'); //在LCD是显示F=____Hz
  118.   displayonechar(1,1,'=');
  119.           displayonechar(8,1,'H');
  120.     displayonechar(9,1,'z');
  121. TMOD=0X51;                  //定义T0为方式一(十六位进制),T1为计数器(16位)
  122. TH0=0X3C;                 //50 ms
  123. TL0=0XB0;
  124. TH1=0X00;                 //初始值
  125. TL1=0X00;
  126. TR0=1;
  127. TR1=1;
  128. ET0=1;
  129. ET1=0;
  130. EA=1;
  131. i=0;
  132. /*  显示  */     //  调用显示子程序(显示位,显示行,显示数据) 注:显示行 "0"为第一行,"1为第二行"
  133. while(1)
  134. {       
  135.    if(s/10000>=1)
  136.     {
  137.         displayonechar(3,1,dsptab[s/10000]); //万
  138.         displayonechar(4,1,dsptab[s/1000%10]);//千
  139.         displayonechar(5,1,dsptab[s/100%10]);//百
  140.         displayonechar(6,1,dsptab[s/10%10]); //十
  141.         displayonechar(7,1,dsptab[s%10]);    //个
  142.     }
  143.     else  if(s/1000>=1)
  144.          {
  145.          displayonechar(3,1,' ');
  146.          displayonechar(4,1,dsptab[s/1000%10]);//千
  147.          displayonechar(5,1,dsptab[s/100%10]);//百
  148.          displayonechar(6,1,dsptab[s/10%10]); //十
  149.          displayonechar(7,1,dsptab[s%10]);    //个
  150.          }
  151.           else if(s/100>=1)
  152.           {
  153.                   displayonechar(2,1,' ');
  154.                   displayonechar(3,1,' '); //万
  155.                   displayonechar(4,1,' ');         //千
  156.                   displayonechar(5,1,dsptab[s/100%10]);//百
  157.                   displayonechar(6,1,dsptab[s/10%10]); //十
  158.                   displayonechar(7,1,dsptab[s%10]);    //个
  159.               }
  160.                 else if(s/10>=1)           
  161.                     {
  162.                                   displayonechar(2,1,' ');
  163.                                   displayonechar(3,1,' '); //万
  164.                                   displayonechar(4,1,' ');         //千
  165.                            displayonechar(5,1,' ');//百
  166.                         displayonechar(6,1,dsptab[s/10%10]); //十
  167.                         displayonechar(7,1,dsptab[s%10]);    //个
  168.                         }
  169.                                     else           
  170.                             {
  171.                                           displayonechar(2,1,' ');
  172.                                           displayonechar(3,1,' '); //万
  173.                                           displayonechar(4,1,' ');         //千
  174.                                    displayonechar(5,1,' ');//百
  175.                                 displayonechar(6,1,dsptab[s/10%10]); //十
  176.                                 displayonechar(7,1,dsptab[s%10]);    //个
  177.                                 }

  178. }
  179. }
  180. /*  中断  */
  181. void t0()interrupt 1
  182. {
  183.         TH0=0X3C;
  184.     TL0=0XB0;
  185.        
  186.         i++;
  187.         if(i==20)                        //1 s时间到时
  188.         {
  189.         s=TH1;                           //555信号发生器的输出口接P3.5(T1) 15脚
  190.         s=s<<8;
  191.         s=s+TL1;                  
  192.         i=0;                           //清零
  193.         TH1=0X00;
  194.         TL1=0X00;       
  195.         }
  196. }
  197. /*----------------------------------------------------------------*/
  198. /*----------------- 1602液晶数据读取子程序 -----------------------*/

  199. //读数据子程序;有返回值,返回值类型为CHAR型;

  200. /*uchar read_data(void)                                        //定义有返回值的子函数;
  201. {
  202.   LCD_DATA=0Xff;                                                //LCD数据端口置1;
  203.   LCD_RS=1;                                                                //RS置1;
  204.   LCD_RW=1;                                                                //RW置1;
  205.   LCD_E=0;                                                                //E置0;
  206.   delay(10);                                                        //短延时;
  207.   LCD_E=1;                                                                //E置1;以锁存数据;
  208.   return(LCD_DATA);                                                //返回读取的值;
  209. }
  210. /*----------------------------------------------------------------*/
复制代码

NE555.zip

33.96 KB, 下载次数: 83, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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