⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fil10.c

📁 单片机学习系统附的实验源代码
💻 C
字号:
//频率计 实验
//现象 P1.0 闪烁,作为计数输入
//数码管显示000000,开始计数的时候,显示计数结果
//用导线连接P1.0和外部中断输入引脚就可以得到计数结果
//P1.0作为外部信号源,计数结果是10hz。
//由于p0/p2不断刷新数据,每个口的状态不断改变,也可以直接连接
//p0口线和外部中断ex0(12脚)也可以得到结果

#include <8051.h>

#define uchar unsigned char
#define ulong unsigned long

#define segdata  P0   //数据 输出
#define sege  P2_7    //显示 选中
#define segb  P2_6    //位 选
#define segd  P2_5    //段 选

//****************************************************************************
void delay(unsigned char times);
void delay5ms();
void display(unsigned char disseg,unsigned char disdata);
void DIS_NUM(int number);

// 这里定义的是数码管对应的字符字根
code unsigned char disbuf_u[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                               0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
                               0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
                               0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};
// ***************************************************************************
static long  Counts; //外部计数结果
static long scount;
unsigned char times;


//下面是外部计数的中断服务程序
void count (void) interrupt 0 {
     Counts++;                 //结果只是简单地增加计数值
}

void timer(void) interrupt 1{
     TH0 = 0;
     TL0 = 0;
     times ++;   
       
     if(times == 10)
     {
	     scount = Counts;
	     Counts = 0;
	     times = 0;
     }

}
void main()
{

    P1 = 255;          //关闭LED显示
    P0 = 0;            //关闭数码显示
    P2 = 255;          //
    P3_7 = 0;          //关闭蜂鸣器
    Counts = 255;      //初始化计数值
    Counts = 0;
    times = 0;

    ET0 = 1;            // 外部计数触发方式下降沿方式
    TMOD = 0x01;        // 计数器工作在方式 0  
    EX0 = 1;
    TR0 =1;             //打开定时器T0  
    
      
    EA =1;              // 中断总允许



  while(1)             //设置一个无限制循环
 {      
        P1_0 =~P1_0;   //翻转 P1.0 作为外部中断源
     //   delay(120);
   DIS_NUM(scount);	
  }
}

//*****************************************************************************
//下面是延时程序。具体的延时时间不能通过表面程序看出,(为什么?)
//如果我们需要一个精密的延时程序,那么我们可以采用内嵌汇编代码的方式
void delay(unsigned char times)
{
    int t=15000;           //延时倍数
    unsigned char i=times;   
    for(;i!=0;i--)
    {for(;t!=0;t--){}}
}


//这里是显示子程序,入口参数为
// disseg  -> 位选 可选范围 0-7 一共8个数码管
// disdata -> 段选 可选范围 0-31 一个32个字符
//  段选 0-15  16个字符 为 "0"->"F"
//  段选 16-31 16个字符 为 "0."->"F."

void display(unsigned char disseg,unsigned char disdata)
{
    unsigned char dataf;
   if(disseg < 8)          //只有当要显示的位数有效,才显示.否则,不显示
  {
     dataf = 1;
     while(disseg)
     {
         dataf <<= 1;
         disseg--;
      }
      sege = 0;
	  segdata = dataf;             //这里首先把要显示的数据放到数据总线
	  segb = 1;                    //这里给出一个脉冲,数据送往位选端
	  segb = 0;
	  
      segdata = disbuf_u[disdata];
      segd = 1;                    //这里给出一个脉冲,数据送往段选端
      segd = 0;
   }
   else{
      segdata = 255;
      segd = 1;                    //这里给出一个脉冲,数据送往段选端
      segd = 0;                    //往段寄存器全部送255,那么就关闭了显示(显示灭)
        
        }  //关闭数码管显示
}

// 少量延时
void delay5ms()
{
_asm
       mov R0,#100
   lp: mov R1,#5
   lk: djnz R1,lk
       djnz R0,lp
_endasm;
}

//这个子程序用来显示数值,
void DIS_NUM(int number)
{
   int nu,tmp;
   uchar i;
    tmp = number;
   for(i =0;i<6;i++)
    { 
        nu = tmp%10;
        display(i,nu);
        delay5ms();
        tmp = tmp/10;
        
     }
        display(255,nu);
   
}
//*******************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -