单片机学习——利用单片机内部中断制作简易电子表

发布者:彭勇最新更新时间:2016-01-20 来源: eefocus关键字:单片机  内部中断  简易电子表 手机看文章 扫描二维码
随时随地手机看文章
题目:利用单片机内部中断制作简易电子表

要求:用两个按键,P1.0和P1.1控制。没有按下P1.0时,按P1.1,不做任何动作。

           当按下P1.0,再按P1。1,则调节年、月、日、星期、时、分、秒。

解决方案:(C 语言编程)

#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="2009-02-01 Mon.";
uchar code table1[]="  00:00:00";
uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";
uchar num,sfcount;
char hour,min,sec,week,day,month,year,rmonth;
sbit lcdrs=P1^7;    //端口定义
sbit lcdrw=P1^6;
sbit lcde=P2^4;
sbit le=P3^ 6;
sbit leden=P2^5;
sbit  dkle=P3^7;
sbit sf=P1^0;
sbit sup=P1^1;
void delay(uint);  //函数声明

void write_com(uchar com)   //写命令子函数
{
 lcde=0;
 lcdrw=0;
 lcdrs=0;
 delay(1);
 lcde=1;
 delay(1);
 P0=com;
 delay(1);
 lcde=0;
}
void write_data(uchar dat) //写数据子函数
{
 lcde=0;
 lcdrw=0;
 lcdrs=1;
 delay(1);
 lcde=1;
 delay(1);
 P0=dat;
 delay(1);
 lcde=0;
}
void init()
{
 month=2;
 day=1;
 year=9;
 TMOD=0x01;   //定时器初始化
 TH0=0x3c;
 TL0=0xb0;
 EA=1;
 ET0=1;
 TR0=1;

 lcde=0;      //LCD1602初始化
 le=0;
 leden=0;
 write_com(0x38);
 write_com(0x0c);
 write_com(0x01);
 write_com(0x80);

 for(num=0;num<15;num++)   //在第一行显示“ 2000-00-00  Mon.”
 {
  write_data(table[num]);
 }
 write_com(0x80+0x40);
 for(num=0;num<10;num++)  //在第二行末尾显示“   00:00:00”
 {
  write_data(table1[num]);
 }
  
}
void write_time(uchar add,char dat)  //写入时间子函数
{
 uchar shi,ge;
 shi=dat/10;
 ge=dat%10;
 write_com(0x80+0x40+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void write_riqi(uchar add,char dat)  //写入日期子函数
{
 uchar shi,ge;
 shi=dat/10;
 ge=dat%10;
 write_com(0x80+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void write_xingqi(char dat)  //写入星期子函数
{
 write_com(0x80+0x0b);
 switch(dat)
 {
  case 0: for(num=0;num<4;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 1: for(num=5;num<9;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 2: for(num=10;num<14;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 3: for(num=15;num<19;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 4: for(num=20;num<24;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 5: for(num=25;num<29;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 6: for(num=30;num<34;num++)
    {
     write_data(xingqi[num]); 
    };break;

 }
}
char keyscan()  //按键扫描子函数
{
  if(sf==0) //功能键
  {
   delay(2);
   if(sf==0)
   {
    while(!sf);
    sfcount++;
    if(sfcount==1)    //秒针闪烁
    {
     TR0=0;
     write_com(0x80+0x40+9);
     write_com(0x0f); 
    }
    if(sfcount==2)  //分针闪烁
    {
     write_com(0x80+0x40+6); 
    }
    if(sfcount==3)  //时针闪烁
    {
     write_com(0x80+0x40+3); 
    }
    if(sfcount==4)  //星期闪烁
    {
     write_com(0x80+0x0d); 
    }
    if(sfcount==5) //天闪烁
    {
     write_com(0x80+9); 
    }
    if(sfcount==6) //月闪烁
    {
     write_com(0x80+6); 
    }
    if(sfcount==7) //年闪烁
    {
     write_com(0x80+3); 
    }
    if(sfcount==8) //取消闪烁
    {
     sfcount=0;
     write_com(0x0c);
     TR0=1; 
    }
   }
  }
  if(sup==0)    //调节时间(上升键)
  {
   delay(5);
   if(sup==0)
   {
    while(!sup);
    if(sfcount==1) //调节秒
    {
     sec++;
     if(sec==60)
      sec=0;
     write_time(8,sec);
     write_com(0x80+0x40+9);
    }
    if(sfcount==2)  //调节分钟
    {
     min++;
     if(min==60)
      min=0;
     write_time(5,min);
     write_com(0x80+0x40+6);
    }
    if(sfcount==3)  //调节小时
    {
     hour++;
     if(hour==60)
      hour=0;
     write_time(2,hour);
     write_com(0x80+0x40+3);
    }
    if(sfcount==4)  //调节星期
    {
     week++;
     if(week==7)
      week=0;
     write_xingqi(week);
     write_com(0x80+0x0d);
    }
    if(sfcount==5)  //调节日
    {
     day++;
     if(day==32)
      day=1;
     write_riqi(8,day);
     write_com(0x80+9);
    }
    if(sfcount==6)  //调节月
    {
     month++;
     if(month==13)
      month=1;
     write_riqi(5,month);
     write_com(0x80+6);
    }
    if(sfcount==7)  //调节年
    {
     year++;
     if(year==100)
      year=9;
     write_riqi(2,year);
     write_com(0x80+3);
    }
   }
  }
  return month;
}
void main()      //main函数
{
 init();
    while(1)
 {
  rmonth=keyscan();
 }
}
void time0() interrupt 1 //中断子函数
{
 uchar tt;
 TH0=0x3c;
 TL0=0xb0;
 tt++;
 if(tt==20)
 {
  tt=0;
  sec++;
  if(sec==60)
  {
   sec=0;
   min++;
   if(min==60)
   {
    min=0;
    hour++;
    if(hour==24)
    {
     hour=0;
     week++;
     if(week==7)
        week=0;
     write_xingqi(week);
     write_com(0x80+0x0b);
     if((rmonth==1)||(rmonth==3)||(rmonth==5)||(rmonth==7)||(rmonth==8)||(rmonth==10)||(rmonth==12)) //有31天的月份
     {
      day++;
      if(day==32)
      {
       day=1;
       month++;
       if(month==13)
       {
        month=1;
        year++; 
        if(year==100)
         year=9;
        write_riqi(2,day);
         write_com(0x80+3);
       }
       write_riqi(5,month);
        write_com(0x80+6);
      
     }
     else if((rmonth==4)||(rmonth==6)||(rmonth==9)||(rmonth==11))//有30天的月份
          {
        day++;
       if(day==31)
       {
        day=1;
        month++;
        if(month==13)
        {
         month=1;
         year++; 
         if(year==100)
          year=9;
         write_riqi(2,day);
          write_com(0x80+3);
        }
        write_riqi(5,month);
         write_com(0x80+6);
       
       }
       else if(rmonth==2){   //二月定为28天
         day++;
        if(day==29)
        {
         day=1;
         month++;
         if(month==13)
         {
          month=1;
          year++; 
          if(year==100)
           year=9;
          write_riqi(2,day);
           write_com(0x80+3);
         }
         write_riqi(5,month);
          write_com(0x80+6);
         }
       }
      write_riqi(8,day);
      write_com(0x80+9);
    }
    write_time(2,hour);
    write_com(0x80+0x40+3);
   }
   write_time(5,min);
   write_com(0x80+0x40+6);
  }
  write_time(8,sec);
  write_com(0x80+0x40+9);
  
}
void delay(uint a) {   //延时子函数
 uint i,j;
 for(j=a;j>0;j--)
     for(i=250;i>0;i--) ;
}

关键字:单片机  内部中断  简易电子表 引用地址:单片机学习——利用单片机内部中断制作简易电子表

上一篇:单片机学习——用ds1302制作一个精密电子钟,按键调节
下一篇:单片机学习——IIC总线及EEPROM实验之一

推荐阅读最新更新时间:2024-03-16 14:44

非常适用于ADAS的语音输出系统 大幅提高车载语音输出品质
全球知名半导体厂商 ROHM 集团旗下的 蓝碧石半导体 股份有限公司(以下简称“蓝碧石半导体”)推出车载语音合成 LSI “ML2253x 系列”产品,非常适用于 ADAS (高级驾驶辅助系统)和 AVAS(车辆接近警报装置)的语音输出系统。 由于蓝碧石半导体的语音合成 LSI 中内置有通信接口、逻辑、存储器、放大器,可构建不依赖于 主控 MCU 的语音输出系统,并可减少软件设计工时,因而在车载应用领域的应用越来越广泛。 “ML2253x 系列”还在上述优势的基础上新增了“播放音异常检测功能”,能够将错误信号发送到主控 MCU。使用该功能可以检测出声音卡顿等播放音异常情况,有助于进一步提高车载语音输出系统的品质。而且
[汽车电子]
非常适用于ADAS的语音输出系统 大幅提高车载语音输出品质
单片机keil编译软件怎么防止代码拼写错误
1. 认真听讲,掌握语法规则,例如: (1)汇编语句每行语句结束一般不加符号 (2)C51的关键词大部分都是以有意义的英文单词命名的,例如for ,不能拼写成fro 等等 2. 先记忆,再打字。 3. 中英文键盘切换,记得英文输入模式下打字。 4. 字体改大,便于发现错误,Edit- Configuration- Colors &Fonts- 8051:Edit Asm/C Files - Text- 点击Font右边按钮,修改Size为24 5. 自查和互查,检查的时候要一个字母,一个空格,一个符号逐个检查。 6. 根据Build Output窗口提示的错误行数进行排查。例如: eightledmain.asm(1
[单片机]
基于单片机的函数发生器的设计实现
1 引言 在自动控制系统设计及调试过程中,不同频率的正弦波、三角波和方波常作为信号源,应用十分方便。过去常由分立元件及集成运放构成振荡器,后来出现的ICL8038其最高频率仅能达到100kHz。而MAX038芯片性能更好,最高频率可达20MHz,且三种波形由同一端输出。单片机控制品质卓越,基于单片机的函数发生器运行可靠,操作方便。 2 高频信号发生器芯片MAX038简介 MAXIM公司生产的MAX038芯片是一种高频精密的函数发生器,可产生三角波、锯齿波、正弦波、方波及脉冲波,且频率及占空比的控制可独立进行。 Lin管脚电流范围在10~400μA时电路获得最佳工作性能。输出波形的选择由逻辑地址引脚A0和A1的组合来决
[单片机]
CC430F5137单片机的动力电池管理系统设计
引言 随着新能源汽车的不断发展,大型工厂开始逐步使用动力电池驱动的运输车辆。电动汽车目前常用的电池有铅酸电池、锂电池、镍氢电池等。电池是一个集成高能量的物体,它的使用以及安全管理就显得尤为重要。目前的电动汽车中缺少能够实时、直观、在线地反映蓄电池状况的设备,由于对蓄电池保养不及时、保管不善、放电过度而造成的早期损坏,给企业带来一定的损失。电池管理系统能解决这一问题,因此研究一套能够实时监测蓄电池工作状况的系统有着十分重要的价值和意义。 参考文献设计出的蓄电池管理系统缺少数据的传输功能,使得应用有一定的局限性。参考文献设计的电池管理系统是以DSP为控制核心,其成本较高,而且系统运行的功耗也较高,有较大的局限性。 针对以上缺
[单片机]
CC430F5137<font color='red'>单片机</font>的动力电池管理系统设计
51单片机频率计数器课程设计
简介:利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。 1. 电路原理图 2. 系统板上硬件连线 (1). 把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。 (2). 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。 (3). 把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。 3. 程
[单片机]
51<font color='red'>单片机</font>频率计数器课程设计
使用SPCE061A单片机的二级倒立摆控制系统
倒立摆系统在控制理论研究中是一种较为理想的实验装置。倒立摆系统可以用多种理论和方法来实现其稳定控制,如PID、自适应、状态反馈、智能控制、模糊控制及人工神经元网络等多种理论和方法,都能在倒立摆系统控制上得到实现,而且当一种新的控制理论和方法提出以后,在不能用理论加以严格证明时,可以考虑通过倒立摆装置来验证其正确性和实用性。本文设计了基于单片机的得倒立摆控制系统,成本低廉,调试方便,能直观的观察控制效果,完成系统的调试任务,快捷的验证控制理论算法的正确与否。 1.二级倒立摆系统的组成结构。 二级倒立摆系统有以下部分组成:有效长度为90cm的光滑导轨,可以在导轨上来回移动的小车,材料为铝的摆杆
[单片机]
使用SPCE061A<font color='red'>单片机</font>的二级倒立摆控制系统
51单片机——8X8点阵显示
74hc595.h: #ifndef __74hc595_H__ #define __74hc595_H__ /************************************位定义************************************/ sbit DATA_IN = P1^0; //串行数据输入 sbit ST_CK = P1^1; //存储寄存器时钟输入 sbit SH_CK = P1^2; //移位寄存器时钟输入 /***********************************函数声明***********************************/ voi
[单片机]
海速芯8位MCU-TM52F1376用于电动剃须刀
电动剃须刀由不锈钢网罩、内刀片、微型电动机和壳体组成,其中主控方面控制按键开关、电机驱动、电源管理等,为保证性能,电动剃须刀需要选用一个稳定性能好的MCU。本文将推荐海速芯高性能、高稳定性的8位MCU-TM52F1376应用于电动剃须刀。 海速芯8位MCU-TM52F1376的主要应用优势特点如下: ①采用8051内核、8bit的MCU,主频高达18MHz,因而拥有高性价比、稳定性好的特点,适合电动剃须刀上的应用,节约成本; ②拥有3ch PWM控制资源,满足电动剃须刀对于电机方面的控制; ③封装形式多样,满足不同设计需求,同时可以有效简化PCB面积; ④工作温度为-40℃~85℃,非常适合对于消费类电子产品即电动剃须刀上的应
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved