PIC16F877A开发板 数码管计数器实验

发布者:Changfeng520最新更新时间:2016-12-07 来源: eefocus关键字:PIC16F877A  数码管  计数器 手机看文章 扫描二维码
随时随地手机看文章
//*******************电子园PIC16F877A开发板 数码管计数器实验*****************
//
//CKP=0;       空闲为低电平
//CKP=1;       空闲为高电平
//STAT_CKE=0;  SDO后沿采样
//STAT_CKE=1;  SDO前沿采样
//
//STAT_SMP=0;    //在数据输出时间的中间采样输入数据
//STAT_SMP=1;    //在数据输出时间的末尾采样输入数据
//
//RC3/SCK 接74595 移位时钟11脚
//RC5/SDO 接74595 数据输入14脚
//RC4/SDI 接74595 锁存时钟12脚
//
//TMR0用作定时器时,定时器时钟=系统时钟/4
//写TMR0时,会产生2个周期的延时,如果不使用前置分频器,可通过设置初值进行补偿
//例如  需要定时200个时钟周期时,TMR0=256-200+2=58
//
//使用TMR0实现数码管动态扫描,每1ms点亮一位数码管
//
//mcu: PIC16F877A  4MHz  电子园PIC16F877A开发板
//2010年12月23日19:22:30
//***************************************************************************
 
#include
__CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);   
//HS振荡,禁止看门狗,低压编程关闭,启动延时定时器                        
                                            
uchar disbuf[8];
uint count=0;
uchar time_ok=0; 
 
//********************函数定义*********************
void delay1ms(uint DelayTime);    
uchar spi_write_read(uchar dd);
void led_display(void);
void decimal_bcd_16bit(uint cnt);
 
 
//*************** 主程序 ********************
void main(void)
{   
  SSPM3=0;
  SSPM2=0;
  SSPM1=0;
  SSPM0=0;       //spi主控模式,时钟为Fosc/4
   
  CKP=0;         //空闲为低电平
  STAT_CKE=1;    //SDO前沿采样
   
  STAT_SMP=0;    //在数据输出时间的中间采样输入数据
   
  TRISC3=0;      //RC3/SCK为输出
  TRISC5=0;      //RC5/SDO为输出
  TRISC4=0;      //RC4/SDI为输出(不使用SDI引脚时,可设置为输出,作普通io用)
  RC4=0;
  SSPEN=1;       //使能MSSP模块,启用spi或iic
   
  PSA=1;          //前置分频器分配给WDT(TMR0时钟不分频)
  T0CS=0;         //设为定时方式
  TMR0=256-200+2;    //定时200个时钟            
   
  GIE=1;          //总中断允许
  T0IE=1;         //TMR0中断允许
   
  delay1ms(10);
 
 
  while(1)
  {
    if(time_ok)
    {
      time_ok=0;
      count=count+1;    
      decimal_bcd_16bit(count);            
    }              
  }
}   
 
//****************spi总线发送接收数据***************
uchar spi_write_read(uchar dd)
{
  uchar buf;
  SSPBUF=dd;
  while(!STAT_BF);    //等待数据发送接收完毕
  buf=SSPBUF;         
  return (buf);       //返回接收到的数据
}
 
void led_display(void)
{
  const uchar smg[]={0x0a,0xfa,0x8c,0xa8,0x78,0x29,0x09,0xba,0x08,0x28,0x00,};                       
                    // 0    1    2    3    4    5    6    7    8    9   all
  const uchar smg_bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff,};
  static uchar st=0;
   
  RC4=0;
  spi_write_read(smg_bit[st]);    
  spi_write_read(smg[disbuf[st]]);
  RC4=1; 
   
  st=(++st)%8;
 
void decimal_bcd_16bit(uint cnt)
{
  disbuf[4]=(cnt/1000)%10;
  cnt=cnt%1000;
  disbuf[5]=(cnt/100)%10;       
  cnt=cnt%100;
  disbuf[6]=cnt/10;          //除以10
  disbuf[7]=cnt%10;          //取出个位
   
  disbuf[0]=disbuf[4];
  disbuf[1]=disbuf[5];
  disbuf[2]=disbuf[6];
  disbuf[3]=disbuf[7];
 
 
//*********************中断服务程序******************
void interrupt isr(void)
{
  static uchar time_con1=0;
  static uint time_con2=0;
   
  if(T0IE&&T0IF)     //判断是否为TMR0中断
  {
    T0IF=0;          //清TMR0中断标志位(必须用软件清零)   
    TMR0=TMR0+58;    //TMR0重新赋初值
    if(++time_con1>=5)  //每次定时1ms
    {
      time_con1=0;
      led_display();
    }
     
    if(++time_con2>=500)  //每0.1s计数器加1
    {
      time_con2=0;
      time_ok=1;   
    }
  }   
}
 
 
//*****************延时 n*1ms 12MHz*****************
void delay1ms(uint DelayTime)
{   
  uint temp;
  for(;DelayTime>0;DelayTime--)
  {   
    for(temp=0;temp<270;temp++)
    {;}
  }
}


关键字:PIC16F877A  数码管  计数器 引用地址:PIC16F877A开发板 数码管计数器实验

上一篇:PIC16F877A开发板 普通IO驱动74595实验
下一篇:PIC16F877A开发板 数码管动态扫描实验

推荐阅读最新更新时间:2024-03-16 15:23

数码管的静态显示与动态显示介绍
数码管是单片机系统中经常用到的显示器件, 从内部结构上可以分为共阴极和共阳极数码管。对不同的数码管,电路的接法也不一样。图1A为数码管的结构图。以共阳极数码管为例, 要想点亮某段, 只需要在相应的段上给低电平即可。图1B为共阳极数码管段码分布, 以及一个显示的实例。 图1 数码管段码分布及显示示例 按照工作方式, 数码管驱动可以分为静态显示和动态扫描。所谓静态显示, 就是每一个数码管的段码都要独占具有锁存功能的输出口, CPU把要显示的字码送到输出口上,就可以使数码管显示对应的字符, 直到下一次送出另外一个字码之前, 显示的内容一直不会消失;动态扫描是把所有显示器的8个段码中的A-dp的各个相同段连接在一起, 接到一个公共的
[单片机]
<font color='red'>数码管</font>的静态显示与动态显示介绍
单个数码管显示4x4矩阵按键
代码: #include reg52.h #define uchar unsigned char #define uint unsigned int sbit BEEP = P3^7; uchar code DSY_CODE = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00 }; uchar Pre_KeyNO = 16,KeyNO = 16; void DelayMS(uint ms) { uchar t; while(ms--) { for(t=0;t
[单片机]
单个<font color='red'>数码管</font>显示4x4矩阵按键
蓝桥杯STC15单片机复习——数码管的使用
前言 下面进行数码管的使用复习 主要分为静态显示与动态显示 静态显示 当我们对数码管的显示需求仅为一位时,可以直接通过数码管的静态显示实现,即将对应的位选选通,随后直接向段选输入段码信号即可。 国信长天的板子的数码管模块的原理图如上图所示,该数码管为共阳数码管,其位选通过74LS138控制为Y6通道,即当P25 = 0;P26 = 1;P27 = 1;时,P0口为数码管位选;其段选为74LS138的Y7通道,即当P25 = 1;P26 = 0;P27 = 1;时,P0口为数码管段选。 1、数码管静态显示 #include STC15F2K60S2.h #include intrins.h #define uint
[单片机]
蓝桥杯STC15单片机复习——<font color='red'>数码管</font>的使用
AVR单片机8位数码管显示的程序实现
我们接着来完成 数码管的显示实验。现在我们开始动手编写程序; 根据前面的介绍,我们应该已经能够知道编写一个 的C语言程序的基本步骤和方法了。 下面给出这个程序的主程序文件,在这个程序中我们应该能够知道这个程序都包含了那几块,具体来说我们应该能够在这个程序中把以下几个部分找出来:预编译语句、 的定义、函数的声明、主函数、函数定义。如果你还不能够准确找出这几部分,那么需要把前面的内容再详细阅读一下。 主程序代码 #include /io.h //io端口寄存器配置文件,必须包含 #include util/delay.h //GCC中的延时函数头文件 #include hc .h //unsigned char Led_Dis
[单片机]
单片机定时/计数器工作于定时和计数方式时有何异同点
定时工作模式和技术工作模式的工作原理相同,只是计数脉冲来源有所不同: 处于计数工作模式时,加法计数器对芯片端子T0(P3.4)或T1(P3.5)上的输入脉冲计数; 处于定时器工作模式时,加法计数器对内部机器周期脉冲计数。 本质都是一样的,都是计数. 定时器,当计数溢出后,会产生中断.
[单片机]
51单片机用矩形键盘控制交通信号灯和数码管显示
电路图 C语言程序 #include reg51.h #define uint unsigned int #define uchar unsigned char //共阳数码管编码表 uchar code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //函数声明 void delay(uint time); //延时函数 void display(uchar w); // uchar getKey(); //读取键盘的数值 void delay0_5s(); void delay5s(); //主程序 void main() { uc
[单片机]
单片机4*4按键数码管显示0-9
#include reg51.h #define KEY P1 //键盘 #define SEG P0 //数码管 sbit COM=P2^0; // 数码管com sbit OC = P2^1;//573锁存器 char code TAB ={//0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xa7,0xa1,0x84,0x84,0xbf,0x7f};//共阳极 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7D,0x07,0x7f,0x6F}; //共阴极 unsigned char scan ={0xe
[单片机]
单片机4*4按键<font color='red'>数码管</font>显示0-9
80C51单片机的定时器/计数器介绍
定时器/计数器介绍 定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。 TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。 TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。 在现在很多新MCU中,不只有两个 定时/计数器,例如STC15系列就有四个定时/计数器,但是在使用上操作上是大同小异的。
[单片机]
80C51单片机的定时器/<font color='red'>计数器</font>介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved