找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机频率计代码

[复制链接]
跳转到指定楼层
楼主
ID:454245 发表于 2018-12-25 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. bit timeint0,timeint1;
  3. unsigned char dispbuf[4];
  4. unsigned int period;
  5. unsigned int timecount=0;
  6. unsigned int count_1s;
  7. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //7段数码管代码表
  8. HEX_TO_BCD(unsigned int n)
  9. {
  10.         unsigned char i; //当显示的频率超出范围,显示EEEE报错
  11.         if (n>9361)
  12.         for(i=0;i<4;i++)
  13.         dispbuf[i]=0x0e;
  14.         else

  15.         {
  16.                 dispbuf[3]=n/1000; //取出千位字节
  17.                 dispbuf[2]=(n/100)%10; //取出百位字节
  18.                 dispbuf[1]=(n/10)%10; //取出十位字节
  19.                 dispbuf[0]=n%10; //取出个位字节
  20. }
  21. }
  22. void scandisp(void) //显示子程序,
  23. //将显示缓存数组中的BCD码扫描并显示在数码管上
  24. {
  25.         unsigned char posi=0x01;
  26.         unsigned char i,j,temp;
  27.         for(i=0;i<4;i++) //依次选中4个数码管
  28.         {
  29.         temp=dispbuf[i];//查出字码
  30.         temp=table[temp];//第三位显示小数点
  31.         if(i==1)
  32.                 {
  33.                 for(j=0;j<200;j++)
  34.                 {
  35.                 P2=posi;
  36.                 P0=temp|0x80;
  37.                 }
  38.                 }
  39.         else
  40.         {
  41.         for(j=0;j<200;j++)
  42.         {
  43.         P2=posi;
  44.         P0 =temp;
  45.         }
  46.         }
  47. //依次点亮字位
  48. posi<<=1;
  49. }
  50. }
  51. void INIT_TMR1INT(void) //定时器初始化了程序,定义了两种
  52. {
  53. //定时/计数器0工作定时器方式,定时/计数器1工作在计数器方式
  54.         TMOD=0x51;
  55.         ET1=1;//中断0开中断
  56.         ET0=1;//CPU开中断
  57.         EA=1;
  58.         count_1s=0;//启动定时/计数器0开始定时
  59.         TR0=1;
  60.         TR1=1;
  61. }
  62. void time0(void) interrupt 1 //定时器0中断服务程序,系统自动调用,
  63. //每2.5ms执行一次
  64. {
  65.         TH0=0xf6;
  66.         TH1=0x3c;//每次定时是2.5 ms, 40次即0.1s
  67.         if(++count_1s>40)
  68.         {
  69.                 count_1s=0;//每0.1s对计数器1所计数值进行统计
  70.                 timecount=TH1*256+TL1;
  71.                 TH1=0;
  72.                 TL1=0;//精确到小数点后1位,以KHz为单位
  73.                 period=timecount/10;//四舍五入显示
  74.                 if((timecount%10)>4)
  75.                 period++;
  76.                 timecount=0;
  77.                 HEX_TO_BCD(period);
  78.         }
  79. }
  80. void timer1(void) interrupt 3 //定时器1中断服务程序,溢出后中断
  81. {
  82.         TH1=0x00;
  83.         TL1=0x00;
  84. }
  85. void main(void) //主函数
  86. {
  87. //初始化
  88. INIT_TMR1INT();
  89.         while(1)
  90.         {
  91. //显示子程序
  92.                 scandisp();
  93.         }
  94. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-25 19:21 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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