数码管电子钟C语言程序设计

发布者:快乐行者最新更新时间:2016-10-27 来源: eefocus关键字:数码管  电子钟 手机看文章 扫描二维码
随时随地手机看文章
#include

#include

unsigned char data dis_digit;
unsigned char key_s, key_v;

unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
    0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100;

sbit K1 = P3^2;
sbit K2 = P3^3;
bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);

void main(void)
{
 P0 = 0xff;
 P2 = 0xff;
 TMOD = 0x11;  // 定时器0, 1工作模式1, 16位定时方式
 TH1 = 0xdc;
 TL1 = 0;

 TH0 = 0xFC;
 TL0 = 0x17;
 
 hour = 12;
 min = 00;
 sec = 00;

 sec100 = 0;
 
 dis_buf[0] = dis_code[hour / 10];  // 时十位
 dis_buf[1] = dis_code[hour % 10];  // 时个位
 dis_buf[3] = dis_code[min / 10];  // 分十位
 dis_buf[4] = dis_code[min % 10];  // 分个位
 dis_buf[6] = dis_code[sec / 10];  // 秒十位
 dis_buf[7] = dis_code[sec % 10];  // 秒个位
 dis_buf[2] = 0xbf;      // 显示"-"
 dis_buf[5] = 0xbf;      // 显示"-"
   
 dis_digit = 0xfe;
 dis_index = 0;
 
 TCON = 0x01;
 IE = 0x8a;    // 使能timer0,1 中断
 
 TR0 = 1;
 TR1 = 1;

 key_v = 0x03;

 while(1)
 {
  if(scan_key())
  {
   delayms(10);
   if(scan_key())
   {
    key_v = key_s;
    proc_key();
   }
  }
  
 }
}

bit scan_key()
{
 key_s = 0x00;
 key_s |= K2;
 key_s <<= 1;
 key_s |= K1;
 return(key_s ^ key_v); 
}

void proc_key()
{
 EA = 0;
 if((key_v & 0x01) == 0)  // K1
 {
  inc_hour();
 // JJ=1;
 }
 else if((key_v & 0x02) == 0) // K2
 {
  min++;
 // JJ=0;
  if(min > 59)
  {
   min = 0;
  }
  dis_buf[3] = dis_code[min / 10];  // 分十位
  dis_buf[4] = dis_code[min % 10];  // 分个位
 }

 EA = 1;
}

void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
//    选通P2.0口数码管
// dis_buf   --- 显于缓冲区基地址 
{
 TH0 = 0xFC;
 TL0 = 0x17;
 
 P2 = 0xff;       // 先关闭所有数码管
 P0 = dis_buf[dis_index];   // 显示代码传送到P0口
 P2= dis_digit;      //

 dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
 dis_index++;      // 
     
 dis_index &= 0x07;   // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}

void timer1() interrupt 3
{
 TH1 = 0xdc;
 
 sec100++;
 
 if(sec100 >= 100)
 {
  sec100 = 0;
  inc_sec();
 }
}

void inc_sec()
{
 sec++;
 if(sec > 59)
 {
  sec = 0;
  inc_min();
 }
 dis_buf[6] = dis_code[sec / 10];  // 秒十位
 dis_buf[7] = dis_code[sec % 10];  // 秒个位 
}

void inc_min()
{
 min++;
 if(min > 59)
 {
  min = 0;
  inc_hour();
 }
 dis_buf[3] = dis_code[min / 10];  // 分十位
 dis_buf[4] = dis_code[min % 10];  // 分个位
}

void inc_hour()
{
 hour++;
 if(hour > 23)
 {
  hour = 0;
 }
 if(hour > 9)
  dis_buf[0] = dis_code[hour / 10];  // 时十位
 else
  dis_buf[0] = 0xff;     // 当小时的十位为0时不显示
 dis_buf[1] = dis_code[hour % 10];  // 时个位

}


void delayms(unsigned char ms) 
// 延时子程序
{      
 unsigned char i;
 while(ms--)
 {
  for(i = 0; i < 120; i++);
 }
}

关键字:数码管  电子钟 引用地址:数码管电子钟C语言程序设计

上一篇:数码管动态扫描显示12345678
下一篇:8位数码管秒表程序--C语言程序

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

51单片机矩形按键控制16个LED灯亮灭和数码管显示
电路原理图 程序 #include reg51.h #define uint unsigned int #define uchar unsigned char //函数声明 void delay(uint time); //延时函数 void display(uchar k); //数码管显示0-F以及LED灯的亮灭 uchar getKey(); //读取键盘的数值 //主程序 void main(){ uchar keyValue; while(1){ keyValue = getKey(); //读取键盘值 display(keyValue); //数码管显示&LED亮灭 } }
[单片机]
STC89C52单片机 数码管动态显示
数码管动态显示 静态与动态显示 动态显示 动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。 数组的定义与引用 数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。 数组的一般格式定义如下: 数据类型 数组名 = {元素表}; 例如: unsigned char tabel = ; P0 = tabel ; // P0此时的值为0x3F 数码管动态显示数字 123 #inc
[单片机]
怎么用万用表判断数码管是共阴极还是共阳极
  一、什么是数码管   数码管是由多个发光二极管组成的一种显示器件,按字段多少可以分为七段管、八段管、米字管等;按工作方式分又可分为共阳数码管和共阴数码管;按位数分又可分为1位、2位、3位、4位等;按颜色分还有红色、绿色、蓝色等,按大小还可分为0.28寸、0.30寸、0.36寸等。   二、数码管工作原理   数码管是一种半导体发光器件,其基本单元是发光二极管。能显示4位数字的叫四位数码管,当然也有多位和只有一位的数码管,他们的电气原理相同。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发
[测试测量]
怎么用万用表判断<font color='red'>数码管</font>是共阴极还是共阳极
PIC单只数码管循环显示0-9
8个数码管滚动显示同一个数字 8个数码管显示多个不同的字符 8个数码管闪烁显示 8个数码管滚动显示数字串 #include p IC .h __CONFIG(0x3B31); unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};//0-F--共阴极数码管 #define LED PORTB void delay1ms(unsigned int x) { unsigned char i; for(;x 0;x--) for(i=0;i 165;i++); } void init
[单片机]
基于51单片机的智能恒温箱设计
一.系统概述 系统使用的模块有AT89C51单片机+8位共阳极数码管+DS18B20温度检测模块+按键+小灯。 本设计采用51单片机为核心控制,使用数码管进行温度以及阈值的显示,通过按键可以对温度上限和温度的下限进行设置,当检测到温度超过温度上限和温度下限后会通过小灯进行报警。 二.仿真概述 1.使用8位共阳数码管显示实时温度。 2.通过按键可以调节温度阈值,阈值分为上限和下限,通过按键可以对阈值进行加减调节。 3.当温度低于温度下限阈值后黄灯就会亮。 4.当液位高于温度上限阈值后绿灯就会亮。 三.程序设计 使用Keil 51进行程序设计,打开Proteus时程序是默认烧录的状态,如果没有烧录点击AT89C
[单片机]
基于51单片机的智能恒温箱设计
电子制作:LED流动显示电子钟
  电子钟有:指针式、液晶式、LED式三种。前两种在光线较暗时就看不清楚,后一种一般采用数码管显示,体积较大,多用于公共场所,不太适合家用。为此,笔者设计制作了一款LED流动显示电子钟,体积小巧,字形美观,且每天有4次闹铃,每次定时时间一到,蜂鸣器响20s,非常实用。   本制作采用64只LED排列成8×8点阵,采用流动循环显示方式。右图所示即是18:28时间的显示效果。   1.工作原理   本制作的硬件电路如下图所示。主控电路图118:28时间显示效果图是非常便宜的89C2051单片机,c5、R6组成它的上电复位电路,Yl、C6、C7组成它的时钟电路。Pl口作数据总线用,LED点阵的列数据(1~8)由IC2锁存,单片
[电源管理]
电子制作:LED流动显示<font color='red'>电子钟</font>
51单片机入门 - 数码管动态显示实验
设计要求: 在8位8端的数码管上动态显示76543210,快速显示时人眼看到的效果为同时亮起 ———————————————————————————————————————————— 实现目标: ———————————————————————————————————————————— 数码管编码计算: #include reg52.h typedef unsigned char uchar; uchar table = { //Proteus图上数码管下引脚显示对应的断码,从前往后分别是0123456789AbCdEF 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE
[单片机]
51单片机入门 - <font color='red'>数码管</font>动态显示实验
电子钟显示部分电路原理图
电子钟显示部分电路原理图如下图所示:
[模拟电子]
<font color='red'>电子钟</font>显示部分电路原理图
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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