找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机为基础利用12864液晶利用两个中断制作的计时器和定时器 源程序注释完整

[复制链接]
跳转到指定楼层
楼主
ID:640681 发表于 2019-11-12 20:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我在学习了中断和LCD12864液晶后,将两者结合写出来的程序,实现了999倒计时功能,和计数器的功能。程序注释完整可用,适合学51单片机的新手,希望大家多多参考学习哦~

单片机源程序如下:
  1. /*看书的时候要十分重点去看寄存器,看到前面我刚开始也是看完之后似懂非懂,我就一直看一直看反复记忆,等觉得自己差不多了就开始看中断程序,看了程序之后,我的天哪其实定时器初始化要写的东西并不多,程序比那些复杂的文字要简单多了,再加上程序后面的分析,我差不多就理解了,之后就用四位数码管编写了一个分秒程序,程序没有错误没有警告但是运行不了,找师兄看过之后他叫我不要深究在这里让我去做定时器液晶,现在想想可能程序还是有点问题等有空再深究一下,不然怎么别人的可以用数码管而我的不行呢。
  2. 我把程序写出来之后不行,我是这么写显示的放在主函数中
  3. Write1_XY_string(2,0,"shi");
  4. 我知道可能是这里有了问题可我不会改,不知道如何下手,杨铭师兄就帮我改成了
  5. Set1_XY(2,0);
  6.   write_date(0x30+shi/10);
  7. 就可以运行了,因为这些要转化成十进制的数要加上0x30所以要用这样写来转换。
  8. 后来师兄想让我做两个定时器,一个是时钟一个是定时的,他把思路告诉我了,后来我写出来程序是OK的,其实理解了中断之后多一个少一个都是一样的。
  9. 我在写的时候用上了那些C语言的符号
  10.     else         if(miao1==0&&fen1!=0)
  11. 我感觉这些很好用的,之前我是不会用的,慢慢的突然就想到就会用了哈哈,定时器我是写程序的时候真的是走的挺快的因为没有出现什么错误,所以我也不知道总结点什么,看书的时候多看看重点“寄存器”吧一定要看懂才行的。
  12. 我会继续加油的!*/


  13. /*****  液晶12864头文件  *****/
  14. #include<reg52.h>
  15. #define uchar unsigned char
  16. #define uint unsigned int
  17.                  
  18. sbit LCD_RS=P2^4;     //片选信号        
  19. sbit LCD_RW=P2^5;     //数据信号       
  20. sbit LCD_EN=P2^6;     //时钟信号
  21. sbit LCD_PSB=P2^7;    //串、并行选择信号

  22. uchar shi=00,fen=00,miao=00,num,shi1=99,fen1=99,miao1=99,num1;

  23. /*延时函数  延时xms*/
  24. void delay(uchar xms)
  25. {
  26.    uchar x,y;
  27.    for(x=xms;x>0;x--)
  28.       for(y=12;y>0;y--);
  29. }

  30. /*以串行协议把数据按位发送,相当于使用并行时接通八个DI口*/
  31. void send_bit(uchar byte)
  32. {
  33.    uchar i;
  34.    for(i=0;i<8;i++)
  35.       {
  36.            LCD_RW=((byte<<i)&0x80);                               
  37.            LCD_EN=0;                          //不加延时,串口中每输送一个数据都有要有个跳变沿,因此速度很快不需延时
  38.            LCD_EN=1;
  39.           }
  40.    delay(5);
  41. }

  42. /*写串口命令函数 */  
  43. void write_com(uchar com)
  44. {
  45.          LCD_RS=1;                             //串口中只要进行数据操作RS就将拉高
  46.          send_bit(0xf8);           //第一字节输入写指令
  47.          send_bit(com&0xf0);      //第二字节发送高四位
  48.          send_bit((com<<4)&0xf0); //第三字节发送低四位
  49.          delay(5);
  50.          LCD_RS=0;
  51. }

  52. /*写数据命令函数*/
  53. void write_date(uchar date)
  54. {
  55.          LCD_RS=1;  
  56.          send_bit(0xfa);          //发送数据识别码
  57.          send_bit(date&0xf0);      //发送高四位
  58.          send_bit((date<<4)&0xf0); //发送低四位
  59.          delay(5);
  60.          LCD_RS=0;
  61. }

  62. /*********液晶初始化*********/
  63. void lcd_init()
  64. {
  65.         LCD_PSB=0;                                  //串口
  66.         LCD_EN=0;
  67.         write_com(0x30);                //基本指令操作                                         //可加延时也可不加,一般来说液晶都是稳定的
  68.         write_com(0x0c);                //开显示,关光标,反白关
  69.         write_com(0x06);                //设置显示格式,光标位置
  70.         write_com(0x01);                //清除显示,将DDRAM的地址计数器归零
  71. }

  72. ///*********设定显示位置************/
  73. void Set1_XY(uchar X, uchar Y)
  74. {
  75.         switch(X)
  76.         {
  77.                  case 1:write_com(0x80+Y); break; //当X为1时执行此程序,在第一行输入
  78.                  case 2:write_com(0x90+Y); break; //第二行
  79.                  case 3:write_com(0x88+Y); break; //等三行
  80.                  case 4:write_com(0x98+Y); break; //第四行
  81.         }
  82.        
  83.    
  84. }
  85. //
  86. ///************写字符串***************/
  87. //
  88.      void Write1_XY_string(uchar X, uchar Y, uchar *str)
  89.          {
  90.             uchar temp;
  91.                 Set1_XY(X,Y);
  92.                 temp=*str;
  93.                 while(temp!=0)
  94.                 {
  95.                      write_date(temp);                                          //输出字符
  96.                      temp=*(++str);
  97.                 }
  98.          }
  99. //
  100. ////**************************************************//
  101. //
  102. ///************液晶显示*************/
  103. //
  104.       void display1()
  105.           {

  106.                    Write1_XY_string(1,0,"北京时间,");
  107.                            Write1_XY_string(2,0," ");
  108.                            Write1_XY_string(3,0,"天气阴");
  109.                            Write1_XY_string(4,0," ");

  110.           }
  111.         void main()
  112.         {
  113.                                                  
  114.    TMOD=0X10;                                          //设置定时器工作方式
  115.    TH0=(65536-45872)/256;                  //装初值
  116.    TL0=(65536-45872)%256;
  117.    TH1=(65536-45872)/256;                  //装初值
  118.    TL1=(65536-45872)%256;
  119.    EA=1;        //全局中断,打开全局中断
  120.    ET0=1;         //定时器中断允许位        ,打开T1中断
  121.    ET1=1;
  122.    TR0=1;         //启动定时器0.INT1电平由高到低
  123.    TR1=1;
  124.    lcd_init();            //调用
  125.    display1();
  126.    while(1)
  127.    {
  128. //     Write1_XY_string(2,0,"shi");
  129. //         Write1_XY_string(2,2,":");
  130. //         Write1_XY_string(2,3,"fen");
  131. //         Write1_XY_string(2,5,":");  
  132. //            Write1_XY_string(2,6,"miao/10");
  133.          Set1_XY(2,0);
  134.   write_date(0x30+shi/10);          
  135.    write_date(0x30+shi%10);
  136.    Set1_XY(2,2);
  137.   write_date(':');
  138.    Set1_XY(2,3);
  139.   write_date(0x30+fen/10);
  140.    write_date(0x30+fen%10);
  141.    Set1_XY(2,5);
  142.   write_date(':');
  143.    Set1_XY(2,6);
  144.   write_date(0x30+miao/10);
  145.    write_date(0x30+miao%10);
  146. //********************************************//
  147. Set1_XY(4,0);
  148.   write_date(0x30+shi1/100);
  149.    write_date(0x30+shi1%100/10);
  150.    write_date(0x30+shi1%10);
  151.    Set1_XY(4,2);
  152.   write_date(':');
  153.    Set1_XY(4,3);
  154.   write_date(0x30+fen1/100);
  155.    write_date(0x30+fen1%100/10);
  156.    write_date(0x30+fen1%10);
  157.    Set1_XY(4,5);
  158.   write_date(':');
  159.    Set1_XY(4,6);
  160.   write_date(0x30+miao1/100);
  161.    write_date(0x30+miao1%100/10);
  162.    write_date(0x30+miao1%10);
  163.    }
  164.         }


  165. void time()interrupt 1
  166. {
  167.    TH0=(65536-45872)/256;                  //重装初值
  168.    TL0=(65536-45872)%256;
  169.    num++;
  170.          if(num==20)
  171.                  {
  172.                     num=0;
  173.                          miao++;
  174.                         if(miao==60)
  175.                         {
  176.                                 fen++;
  177.                                 miao=0;
  178.                                  if(fen==60)
  179.                                  {
  180.                                    shi++;
  181.                                    fen=0;
  182.                                        if(shi==24)
  183.                                            {
  184.                                                      shi=0;
  185.                                            }
  186.                                  }
  187.                         }
  188.                  }

  189. }

  190. //************************************************************//

  191. void time1()interrupt 3
  192. {
  193.            TH1=(65536-45872)/256;                  //重装初值
  194.        TL1=(65536-45872)%256;
  195.        num1++;
  196.            if(num1==20)
  197.            {
  198.                       num1=0;
  199.                   if(miao1!=0)
  200.                   {
  201.                             miao1--;
  202.                   }
  203.           else         if(miao1==0&&fen1!=0)
  204.                  {
  205.                            fen1--;
  206.                  }
  207.           else   if(fen1==0&&shi1!=0)
  208.                  {
  209.                            shi1--;
  210.                          }
  211.                    if(shi1==0)
  212.                    {
  213.                             shi1=99;
  214.                          fen1=99;
  215.                          miao1=99;
  216.                    }
  217.            }
  218. }
复制代码

以上程序51hei提供下载:
中断液晶两个定时器.zip (34.85 KB, 下载次数: 22)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:16201 发表于 2019-11-12 21:12 | 只看该作者
谢谢 共享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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