找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机脉冲频率计代码

[复制链接]
跳转到指定楼层
楼主
脉冲信号由AT89C51的P3.5输入,由单片机测量出脉冲信号的频率,并由4位数码管显示,具体电路如图5-19 所示。P1.0脚外接一开关key,按一下key则进行频率测试。其效果见如图5-19——频率7.458K的脉冲测试结果显示。


软件代码
  1. /*****脉冲信号由P3.5输入,按下key显示其频率*****/
  2. #include<reg51.h> //定义8051寄存器的头文件
  3. sbit KEY=P1^0;//声明开关接于P1.0脚
  4. unsigned char TAB[11]={
  5. 0xc0,0xf9,0xa4,0xb0,0x99, //数字0~4
  6. 0x92,0x82,0xf8,0x80,0x90, //数字5~9
  7. 0xbf};//"-"号
  8. unsigned char  disp[4];//声明显示区数组
  9. unsigned  char times = 0;
  10. /********声明基本变量*******/
  11. bit status_F = 1; //是否完成测量状态标志位
  12. unsigned char scan = 0X01;   //扫描信号
  13. unsigned int freq = 0;    //频率数值变量
  14. sfr16 DPTR = 0X82; //声明DPTR
  15. /*****函数声明*****/
  16. void delayms(int);
  17. void measure(void);
  18. void display(int);
  19. /******主程序*****/
  20. main(){
  21.     while(1){
  22.        if(KEY==0){ //按键按下开始测量
  23.            delayms(20);//延时消抖
  24.            if(KEY==0){  //确认按键按下
  25.               status_F=0;
  26.               startmeasure();
  27.               while(status_F==0);//等待1S时间到
  28.            }
  29.        }
  30.        display(freq);
  31.     }
  32. }
  33. /*********开始测量函数***********/
  34. void startmeasure(){
  35. P3=0XFF;
  36.     IE=0X82; //启用T0、T1中断
  37.     TMOD=0X51;//T1为计数器,T0为定时器,均为方式1
  38.     TH0=(65536-50000)/256   //定时器初值的高8位
  39. TL0=(65536-50000)%256  //定时器初值的低8位
  40.     TH1=0;TL1=0;//设置T1归零
  41.     TR0=1;TR1=1;//启动T0、T1
  42. }
  43. /*********T0中断服务程序,定时时间50mS***********/
  44. void T0_int () interrupt1{
  45. TH0=(65536-50000)/256  //定时器初值的高8位
  46. TL0=(65536-50000)%256  //定时器初值的低8位
  47.     if(++times==20){      //若1S时间到
  48.        times=0;         //重新计次
  49. status_F=1;      //完成测量
  50.        TR1=0,TR0=0;      //关闭T1、T0
  51.        DPL=TL1;DPH=TH1;  //脉冲计数值高、低8位
  52.        freq=DPTR;//脉冲计数值存入freq变量
  53.     }
  54. }




  55. /***********显示函数*************/
  56. void display(int dat){
  57. uchar i;
  58.     if(dat>=10000){ //若计数值大于10K,即频率超过10KHz
  59.        disp[0]=TAB[10];//负号填入千位数显示区
  60.        disp[1]=TAB[10];//负号填入百位数显示区
  61.        disp[2]=TAB[dat/10000];//计数值的"万"位填入十位显示区
  62.        disp[3]=TAB[(dat/1000)%10];//计数值的"千"位填入个位显示区
  63.     }
  64.     else{  //频率低于10KHz
  65.        disp[0]=TAB[(dat/1000)%10];//填入千位数显示区
  66.        disp[1]=TAB[(dat/100)%10];  //填入百位数显示区
  67.        disp[2]=TAB[(dat/10)%10];   //填入十位数显示区
  68.        disp[3]=TAB[dat%10];        //填入个位数显示区
  69.     }   
  70.     P3=0x01;//初始扫描信号   
  71.     for(i=0;i<4;i++){//扫描4次
  72.        P2 =0XFF; //关闭7段LED数码管
  73.        P3=~scan;//输出扫描信号
  74.        P2=disp[ i];//[ i]输出显示信号
  75.        delayms(4);//延时4ms
  76.        P3<<=1;  //下一个扫描信号
  77.     }
  78. }
复制代码


评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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