找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C2052单片机+MINI12864的时钟+计数器

[复制链接]
跳转到指定楼层
楼主
用20引脚的小单片机,驱动1302时钟芯片,和小屏12864显示时间和计数信息。
由于只有2K ROM空间,所以程序比较简单,没有调时间,按键采用外部中断和定时器控制防连续计数
按一下外部中断1,单次数值 +1,按一下外部中断2,单次清0,积++,
制作出来的实物图如下:


单片机源程序如下:
  1. /****************************************************************
  2. 通用头文件
  3. ****************************************************************/
  4. #include <STC12C2052.H>
  5. #include <intrins.h>
  6. #include <DS1302.H>                  
  7. #include<time0.H>
  8. #include<STC12C2052EEPROM.H>
  9. #include <LCDMINI12864.H>

  10. //uchar x;
  11. //#include<KEY.H>
  12. /****************************************************************
  13. 硬件接口定义
  14. ****************************************************************/
  15. /*DS1302IO接口 请用3P杜邦线与对应的P1口链接*/
  16. //sbit TSCLK = P1^0;   //DS1302时钟引脚
  17. //sbit TIO   = P1^1;   //DS1302数据引脚
  18. //sbit TRST  = P1^2;   //DS1302使能引脚
  19. /*4位独立按键引脚*/
  20. //sbit KEY_S2 = P3^0;        //S2独立按键
  21. //sbit KEY_S3 = P3^1;        //S3独立按键
  22. //sbit KEY_S4 = P3^2;        //S4独立按键
  23. //sbit KEY_S5 = P3^3;        //S5独立按键

  24. /*数码管*/
  25. //sbit WE = P2^7;        //数码管位选       
  26. //sbit DU = P2^6;        //数码管段选

  27. /*DS18B20温度传感器引脚*/
  28. //sbit DS18B20_IO = P2^2;   //DS18B20通信引脚
  29. /*5V有源蜂鸣器引脚*/
  30. //sbit BUZZER = P2^3;        //蜂鸣器引脚
  31. sbit BEEP = P3^4 ;          //蜂鸣器
  32. void LCDMINI12864_EEPROM_DIS()
  33. {
  34.                             
  35.                         //  计数值   单
  36.                         strEEPROM_Z1[0] = (EEPROM_Z1/100) + '!';  //十位转为ASCII码
  37.                                                 strEEPROM_Z1[1] =  ' ';  //十位转为ASCII码
  38.                         strEEPROM_Z1[2] = (EEPROM_Z1% 100/10) + '!';  //十位转为ASCII码
  39.                                                 strEEPROM_Z1[3] =  ' ';  //十位转为ASCII码
  40.                         strEEPROM_Z1[4] = (EEPROM_Z1% 10) + '!';  //十位转为ASCII码
  41.                         strEEPROM_Z1[5] = '\0';             //字符串结束符
  42.                     Disp_String_8x16( 7, 59, strEEPROM_Z1);//显示温度

  43.                         //  计数值   总
  44.                         strEEPROM_Z2[0] = (EEPROM_Z2/100) + '!';  //十位转为ASCII码
  45.                         strEEPROM_Z2[1] = (EEPROM_Z2% 100/10) + '!';  //十位转为ASCII码
  46.                         strEEPROM_Z2[2] = (EEPROM_Z2% 10) + '!';  //十位转为ASCII码
  47.                         strEEPROM_Z2[3] = '\0';             //字符串结束符
  48.                     Disp_String_8x16( 5, 28, strEEPROM_Z2);//显示温度
  49.                
  50.                
  51. }
  52. void main()
  53. {

  54.          

  55.         InitLcd();//mini12864初始化
  56.         LcdCls( 1, 1, 128, 64); //清屏指定区域
  57.         LCDMINI12864_GUDING(); //液晶显示固定不变的信息
  58. //        inital_1302();  // 时钟初始化
  59.         P1M0=0;                P1M1=0XE0;  //  DS1302推挽输出,因为没接上拉电阻 ,信号不稳定
  60.         time0init();  //定时器0 初始化
  61.         EEPROM_Z1= dcx(0x2000);         // 开机读取EEPROM区 总值
  62.         EEPROM_Z2= dcx(0x2001);         // 开机读取EEPROM区 总值
  63. //        EEPROM_Z1=EEPROM_Z1A*256+EEPROM_Z1B        ;  //拆分的值 再乘回去,显示
  64.         EA=1;
  65.          EX0=1;         //外部中断0开
  66.         IT0=1;         //电平触发
  67.                  EX1=1;         //外部中断0开
  68.         IT1=1;         //电平触发
  69.        
  70.         while(1)
  71.         {
  72.                 
  73.                         
  74.                  if(t0z3>=15)  // 上电定时器++,1.5秒后
  75.                  {
  76.                          x4_flag=1;                //标志位置1,让t0z3不再加值 ,
  77.                     LCDMINI12864_TIME_DIS2();  //  上电1。5后先刷新一次  时值 ,然后1000个50毫秒后再刷新
  78.                         LCDMINI12864_TIME_DIS3();  //刷新一次 周 年  月  日 ,然后都不刷新了。
  79.                  }
  80.          if(x1_flag==1){LCDMINI12864_TIME_DIS1();x1_flag=0;t0z1=0;        }        //单独读秒,分 并刷新 秒 分
  81.          if(x2_flag==1){LCDMINI12864_EEPROM_DIS();x2_flag=0;t0z0=3;        }         //显示计数值
  82.          if(x3_flag==1){LCDMINI12864_TIME_DIS2();x3_flag=0;t0z2=0;        }         //读时 并刷新   时
  83.           
  84.                
  85.         }
  86. }

  87. void exint0() interrupt 0
  88. {  
  89.         if(t0z0>=19)  //  计时器0过了19个50毫秒,后
  90.         {
  91.         EEPROM_Z1++;         //计数值 ++
  92.         BEEP=0;                   //  FMQ响
  93.          
  94.         t0z0=0;                // 让计数器0归0
  95.         if(EEPROM_Z1>=200)delay(900);  // 如果计数值 到了200,长响,       
  96.         else delay(300);           //让FMQ响一会
  97.         BEEP=1;                   //  关闭FMQ
  98.                 cc(0x2000);         // 擦除第1个扇区(2000h~21FFh)                                       
  99.                    xcx(0x2000,EEPROM_Z1);         // 对EEPROM区2002h写入2
  100.                 xcx(0x2001,EEPROM_Z2);         // 对EEPROM区2002h写入2   
  101.                 EA=1;  //使用EEPROM后,要再开
  102.                        
  103.         }  
  104.        
  105. }

  106.          void exint1() interrupt 2            //清零键
  107. {  
  108. delay(300);           //延时一会
  109.         EEPROM_Z1=0;                //  计数值 清零
  110.         EEPROM_Z2++;                //  累计值 +1
  111.         cc(0x2000);         // 擦除第1个扇区(2000h~21FFh)                                       
  112.                    xcx(0x2000,EEPROM_Z1);         // 对EEPROM区2002h写入2  
  113.                 xcx(0x2001,EEPROM_Z2);         // 对EEPROM区2002h写入2  
  114.                 EA=1;  //使用EEPROM后,要再开
  115.                  t0z0=0;                          //  计时器0归0,让计数值 刷新 显示
  116. }

复制代码
Keil代码有待改进:
11 清零键加延时 要不然会连续加数 未成功 下次再加.rar (57.3 KB, 下载次数: 14)


Honeycam 2022-03-24 18-26-57.gif (14.27 MB, 下载次数: 70)

Honeycam 2022-03-24 18-26-57.gif

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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