找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机带时钟1602计算器终极程序 PCF8574T和PCF8563的通信协议 带详细注释

[复制链接]
跳转到指定楼层
楼主
一年前弄的小玩意了,硬件丢失了,翻出来,重新分割了下,加了详细注释,注释很重要啊,以前没加详细,我自己理解起来也要半天,分享下,希望对他人有所帮助吧。其实我目前发的三个东西,现在想来,对单片机资源方面的知识涉及的不多,主要还是单片机C语言方面。在没硬件的情况下,我想分享的是我的思维,我是如何构思的,是如何运用运算符变量语句的。





单片机源程序如下:
  1. //=================================================================================================================================================================================================================
  2. //软件功能:带时钟计算器
  3. //硬件描述:最小系统(stc15)+ 1x(LCD1602 + PCF8574T) + 1x(5x4矩阵按键 + 74ls08)+ 1x(PCF8563)
  4. //程序描述:IIC.c中有PCF8574T和PCF8563的通信协议
  5. //          anjian.c中有按键函数
  6. //          shizhong.c中有时钟相关函数
  7. //          jisuan.c中有计算器相关函数
  8. //功能概括描述:LCD1602用于显示、可以切换计算器模式和时钟模式(时间模式和闹钟模式)
  9. //              (用x和y表示两个数的长度(小数点不算长度),则,x+y<16的条件下)可以进行四则运算
  10. //              时间和闹钟可以设置
  11. //=================================================================================================================================================================================================================
  12. #include "reg15.h"                                                               //STC15Wxx/STC15Fxx系列头文件
  13. #include "IIC.h"                                                                       //I2C通信协议
  14. #include "anjian.h"
  15. #include "shizhong.h"
  16. #include "jisuan.h"
  17. #define FOSC 11059200L                                                                           
  18. #define T50MS (65536-FOSC/12/20)                                                       //12T,11.0592MHz(50ms=20MHz)        
  19. #define ANJ P1
  20. sbit INT0=P3^2;
  21. //=================================================================================================================================================================================================================
  22. uchar b=0,ajbh=21,hang,tsgn=0;                                                                      //LCD列变量,按键编号变量,LCD行变量,特殊模式切换变量                                
  23. uchar HUANCUN[16],SUM[17],a=0,j=0,K=0,L=0,q=1,p=0;                    //算式缓存数组,计算结果缓存数组,算式缓存数组对应位变量,运算符标识变量,第一位数小数点变量,第二位数小数点变量,运算符限制变量,小数点限制变量                                                                        
  24. uchar SZXSHC[8],sjsz=0,naoz=0,shuzi=10;                                            //时间缓存变量,时钟模式切换变量,闹钟模式切换变量,特殊模式下的数字键变量
  25. //=================================================================================================================================================================================================================                                                                                   
  26. //中断和P口初始化程序
  27. //=========================================================================================
  28. void Init()
  29. {
  30.         AUXR&=0x7f;                                                                                 //定时器0为12T模式
  31.         INT0=1;                                                                                           //外部中断P口置高电平
  32.         ANJ=0xf0;                                                                                         //矩阵输入输出对应P口初始化
  33.         a4=0;
  34.         TMOD=0x00;                                                                                 //定时器为方式0(STC15F2K60S2方式0是16位自动重装模式)
  35.         TL0=T50MS;                                                                                 //初始化定时值
  36.         TH0=T50MS>>8;
  37.         ET0=1;                                                       //定时器T0中断开启
  38.         IT0=1;                         //设置INT0的中断类型为下降沿触发
  39.   EX0=1;                                                       //INT0中断开启
  40.         PT0=1;                                                                                                 //优先级T0优先
  41.         PX0=0;                                                                                                 //外部中断优先级低         
  42.         EA=1;                                                                                                    //总中断开启
  43.         TR0=0;                                     //定时器0
  44. }
  45. //=========================================================================================
  46. void main()                                                                                                   //主函数
  47. {
  48.         Init();
  49.         LCDInit();                                                                                           //1602初始化            
  50.         CleanAlarm();                                                                             //闹钟初始化
  51.         TR0=1;                                                                                                                                      
  52.         while(1);
  53. }
  54. //=========================================================================================
  55. //功能说明:按键所用中断
  56. //          矩阵按键的四个置位口连接74LS08的输入端,用了3个与门,2个与门的输出端接1个与门的输入端,
  57. //          最后引出来接INT0口,采用外部中断方式
  58. //=========================================================================================
  59. void EX_T() interrupt 0                                                                  
  60. {         
  61.          EX0=0;                                                                                                       //INT0中断关闭
  62.          IICdelay1(20);                                                                                   //去抖动
  63.          if(INT0==0)                                                                                     //如果仍有键按下
  64.          {
  65.            An_j();                                                                                          
  66.            Cu_l();
  67.            SZ_bd();
  68.          }
  69.          while(!INT0);                                                                                   //判断按键是否松开
  70.          IICdelay1(20);                                                                                   //去抖动
  71.          EX0=1;                                                                                                       //INT0中断开启               
  72. }
  73. //==================================================================================
  74. //功能说明:时钟所用中断
  75. //          给定变量tu用于计时,200ms读取一次闹钟响铃位GetPCF8563(0x01,SZXSHC+7)
  76. //          判断该位,如果告警了,LCD右下角显示字符'n'
  77. //          持续12.5s后字符'n'消失
  78. //          按任意键关闭闹钟在按键部分程序
  79. //==================================================================================
  80. void timer0() interrupt 1                                                 //定时器中断
  81. {         
  82.         static uchar cb=0,tu=0;
  83.         tu++;
  84.         if(tu==4){                                                                                           //加计数变量tu,不然读取速度过于频繁
  85.           GetPCF8563(0x01,SZXSHC+7);                    //读取溢出标志位到SZXSHC[7]        
  86.                 tu=0;
  87.         }
  88.         if(SZXSHC[7]&0x08){                                                                 //判断闹钟溢出标志位是否为1(第4位)
  89.           if(cb==0){
  90.       tu=4;
  91.                   cb=1;                        
  92.             LCD_writezl(0x01);             //LCD清除显示
  93.             GotoXY(15,1);                                                                         //右下角显示字符n
  94.             yige('n');
  95.           }else{
  96.              if(tu==254){                                                                   //显示10多秒n后,闹钟自动关闭         
  97.                SetPCF8563(0x01,0x02);      //清除告警中断位
  98.                LCD_writezl(0x01);          //LCD清除显示
  99.                      tu=3;
  100.                      cb=0;
  101.                    }
  102.            }
  103.         }else{                          
  104.            Sh_z(sjsz);
  105.            Sh_z(naoz);
  106.                  if(tu>4){                       //如果是按任意键后关闭闹钟
  107.                    tu=3;
  108.                    cb=0;
  109.                  }         
  110.          }      
  111. }
  112. //==================================================================================
复制代码

原理图: 无
仿真: 无
代码: 带时钟1602计算器终极程序.rar (540.32 KB, 下载次数: 61)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:775486 发表于 2020-6-10 20:25 | 只看该作者
谢谢楼主非常好
回复

使用道具 举报

板凳
ID:666564 发表于 2020-6-11 12:33 | 只看该作者
感谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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