找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1480|回复: 1
收起左侧

12864时钟(定时器)+18b20+按键调时单片机程序

[复制链接]
ID:454712 发表于 2019-5-6 13:35 | 显示全部楼层 |阅读模式
本帖最后由 1367067553 于 2019-5-11 15:34 编辑
  1. #include <reg51.h>                                //头文件
  2. #include <intrins.h>
  3. #define uint unsigned int                //宏定义
  4. #define uchar unsigned char
  5. /*TS12864A-3 端口定义*/
  6. #define LCD_data  P0             //数据口
  7. sbit LCD_RS  =  P3^5;            //寄存器选择输入
  8. sbit LCD_RW  =  P3^6;            //液晶读/写控制
  9. sbit LCD_EN  =  P3^4;            //液晶使能控制
  10. sbit LCD_PSB =  P3^7;            //串/并方式控制
  11. /*键盘定义*/
  12. sbit LIE1 = P2^4;                                 //定义列
  13. sbit LIE2 = P2^5;
  14. sbit LIE3 = P2^6;
  15. sbit LIE4 = P2^7;
  16. sbit HANG1 = P2^0;                                 //定义行
  17. sbit HANG2 = P2^1;
  18. sbit HANG3 = P2^2;
  19. sbit HANG4 = P2^3;
  20. sbit D1 = P1^3;
  21. sbit DQ = P1^1;                                          //定义DS18B20口
  22. sbit beep =P1^2;                                  //蜂鸣器
  23. /*变量定义*/
  24. uchar ucKeyNumber;                          //记录按键值
  25. uchar ucMatrixStatus;             //矩阵键盘状态
  26. uint uiMatrixCount;                      //矩阵键盘计数
  27. uint uiMatrixLieSelect;                  //矩阵键盘计数
  28. uchar ucMatrixTemp;                          //按键端口
  29. uchar ucStatus,flag=0,king;              //定义标志位
  30. uint uiCount,uiStatus;
  31. uchar miao=48,fen=59,shi=23,nian=19,yue=5;ri=2;
  32. uchar mun_char_table[]={"0123456789"};
  33. /*函数调用*/
  34. void My_T0(void);                    //定时器初始化
  35. void delay(int ms);                    //LCD12864延时函数
  36. void lcd_wcmd(uchar cmd);                //写命令
  37. void lcd_wdat(uchar dat);                //写指令
  38. void lcd_init();                                //LCD12864初始化
  39. void LCDWrituenumber(uchar x,uchar y,uchar ucDAT);    //写字符
  40. void lcd_pos(uchar X,uchar Y);                                              //写字符串
  41. void xianshi(void);                            //显示
  42. void kaiji(void);                            //开机动画
  43. void Matrix_keyboar(void);            //按键扫描
  44. void keyRun(void);                            //按键执行

  45. /*********ds18b20模块*************/
  46. void delay_us(uint i)
  47. {
  48.         while(i--);
  49. }
  50. //********DS18B20初始化************//
  51. void DS18B20_Init(void)
  52. {
  53.     uchar x;
  54.     DQ = 1;
  55.         delay_us(100);
  56.         DQ = 0;
  57.         delay_us(1000);
  58.         DQ = 1;
  59.         delay_us(200);
  60.         x = DQ;                                //DQ管脚送出60-240us的0脉冲 以示初始化成功
  61.         delay_us(250);
  62. }
  63. //************写一个字节************//
  64. void write_OneChar(uchar dat)
  65. {
  66.    uchar i=0;
  67.    for(i = 8;i > 0;i--)
  68.    {
  69.       DQ = 0;
  70.           DQ = dat&0x01;
  71.           delay_us(60);
  72.           DQ = 1;
  73.           dat>>=1;
  74.    }
  75. }
  76. //************读一个字节***********//
  77. uchar Read_OneChar(void)
  78. {
  79.    uchar i=0;
  80.    uchar value = 0;
  81.    for(i = 8;i > 0;i--)
  82.    {
  83.           DQ = 0;
  84.           value>>=1;
  85.           DQ = 1;
  86.           if(DQ)value|=0x80;            
  87.           delay_us(50);
  88.     }
  89.         return(value);
  90. }
  91. //**************读取温度**************//
  92. uint ReadTemperature(void)
  93. {
  94.           uchar a = 0;
  95.           uchar b = 0;
  96.           uint t = 0;
  97.           float tt = 0;
  98.           DS18B20_Init();
  99.           write_OneChar(0xcc);
  100.           write_OneChar(0x44);
  101.           DS18B20_Init();
  102.           write_OneChar(0xcc);
  103.           write_OneChar(0xbe);
  104.           a = Read_OneChar();
  105.           b = Read_OneChar();
  106.           t = b;
  107.           t <<= 8;
  108.           t = t|a;
  109.           tt = t*0.0625;
  110.           t = tt*10+0.5;
  111.           return(t);
  112. }
  113. /**************************************************
  114. *函数类型:main.c
  115. *函数名称:主函数
  116. **************************************************/
  117. void main(void)
  118. {  
  119.     lcd_init();                //12864初始化
  120.     DS18B20_Init();        //18B20初始化        
  121.     while(1)
  122.     {        
  123.            My_T0();
  124.        kaiji();
  125.        xianshi();            
  126.     }
  127. }
  128. /**************************************************
  129. *             LCD12864模块                                       
  130. /**************************************************/
  131. void delay(int ms)           //LCD12864延时函数
  132. {
  133.     while(ms--)
  134.         {
  135.       uchar i;
  136.           for(i=0;i<250;i++)  
  137.            {
  138.             _nop_();                           
  139.                 _nop_();
  140.                 _nop_();
  141.                 _nop_();
  142.            }
  143.         }
  144. }               
  145. /*******************************************************************/
  146. /*写指令数据到LCD                                                  */
  147. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  148. /*******************************************************************/
  149. void lcd_wcmd(uchar cmd)
  150. {                           
  151.     LCD_RS = 0;
  152.     LCD_RW = 0;
  153.     LCD_EN = 0;
  154.     _nop_();
  155.     _nop_();
  156.     P0 = cmd;
  157.     delay(1);
  158.     LCD_EN = 1;
  159.     delay(1);
  160.     LCD_EN = 0;  
  161. }
  162. /*******************************************************************/
  163. /*写显示数据到LCD                                                  */
  164. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  165. /*******************************************************************/
  166. void lcd_wdat(uchar dat)
  167. {                          
  168.     LCD_RS = 1;
  169.     LCD_RW = 0;
  170.     LCD_EN = 0;
  171.     P0 = dat;
  172.     delay(1);
  173.     LCD_EN = 1;
  174.     delay(1);
  175.     LCD_EN = 0;
  176. }
  177. /*******************************************************************/
  178. /*  LCD初始化设定                                                  */
  179. /*******************************************************************/
  180. void lcd_init()
  181. {
  182.     LCD_PSB = 1;         //并口方式   
  183.     lcd_wcmd(0x34);      //扩充指令操作
  184.     delay(5);
  185.     lcd_wcmd(0x30);      //基本指令操作
  186.     delay(5);
  187.     lcd_wcmd(0x0C);      //显示开,关光标
  188.     delay(5);
  189.     lcd_wcmd(0x01);      //清除LCD的显示内容
  190.     delay(5);
  191. }
  192. /*********************************************************        
  193. *                                     写字符                                                                 *
  194. **********************************************************/
  195. void LCDWritueString(uchar x,uchar y,uchar *str)          //固定格式
  196. {
  197.         uchar i;
  198.         lcd_pos(x,y);
  199.         i = 0;
  200.     while(str[i] != '\0')
  201.     {
  202.        lcd_wdat(str[i]);      //显示字符
  203.        i++;
  204.     }
  205. }
  206. /*********************************************************        
  207. *                                    写字符串                                                         *
  208. *********************************************************/
  209. void LCDWrituenumber(uchar x,uchar y,uchar ucDAT)
  210. {
  211.         lcd_pos(x,y);
  212.         lcd_wdat((ucDAT / 10)+ 48);
  213.         lcd_wdat((ucDAT % 10) + 48);   
  214.          
  215. }
  216. /*************************************************
  217. *                设定显示位置                    *               
  218. *************************************************/
  219. void lcd_pos(uchar X,uchar Y)
  220. {                          
  221.    uchar  pos;
  222.    if (X==0)
  223.      {X=0x80;}
  224.    else if (X==1)
  225.      {X=0x90;}
  226.    else if (X==2)
  227.      {X=0x88;}
  228.    else if (X==3)
  229.      {X=0x98;}
  230.    pos = X+Y ;  
  231.    lcd_wcmd(pos);     //显示地址
  232. }
  233. /**********************************************
  234. *               定时器初始化                              *
  235. **********************************************/
  236. void My_T0(void)
  237. {
  238.     TMOD = 0x01;
  239.     TH0 = (65536-1000)/256;
  240.     TL0 = (65536-1000)%256;
  241.     EA = 1;
  242.     ET0 = 1;
  243.     TR0 = 1;
  244. }
  245. /***********************************************
  246. *             定时器T0服务函数                                   *
  247. ***********************************************/
  248. void Tim0() interrupt 1
  249. {
  250.            TH0 = (65536-1000)/256;
  251.     TL0 = (65536-1000)%256;
  252.         Matrix_keyboar();
  253.         keyRun();
  254.         uiStatus++;
  255.         if(king == 0)
  256.         {
  257.            uiCount++;
  258.         }
  259.     if(uiCount >= 1000)
  260.     {
  261.            uiCount = 0;
  262.            miao++;
  263.            if(miao >=60)
  264.            {
  265.              miao = 0;
  266.              fen++;
  267.            }
  268.            if(fen >= 60)
  269.            {
  270.               fen = 0;
  271.                   shi++;
  272.            }
  273.            if(shi >= 24)
  274.            {
  275.                   shi = 0;
  276.                   ri++;
  277.            }
  278.            if(ri >=31)
  279.            {
  280.               ri = 0;
  281.               yue++;
  282.            }
  283.            if(yue >= 12)
  284.            {
  285.               yue = 0;
  286.                   nian++;
  287.            }
  288.     }

  289. }
  290. /***********************************************
  291. *                  显示函数                                           *
  292. ***********************************************/                                   
  293. void xianshi(void)
  294. {
  295.    if(flag == 1)
  296.    {   
  297.        uint temp;
  298.            lcd_pos(0,1);   
  299.            lcd_wdat(mun_char_table[shi/10]);
  300.            lcd_wdat(mun_char_table[shi%10]);
  301.            LCDWritueString(0,2," -");
  302.            lcd_pos(0,3);   
  303.            lcd_wdat(mun_char_table[fen/10]);
  304.            lcd_wdat(mun_char_table[fen%10]);
  305.            LCDWritueString(0,4," -");
  306.            lcd_pos(0,5);   
  307.            lcd_wdat(mun_char_table[miao/10]);
  308.            lcd_wdat(mun_char_table[miao%10]);
  309.            lcd_pos(1,1);   
  310.            lcd_wdat(mun_char_table[nian/10]);
  311.            lcd_wdat(mun_char_table[nian%10]);
  312.            LCDWritueString(1,2,"年");
  313.            lcd_pos(1,3);   
  314.            lcd_wdat(mun_char_table[yue/10]);
  315.            lcd_wdat(mun_char_table[yue%10]);
  316.            LCDWritueString(1,4,"月");
  317.            lcd_pos(1,5);   
  318.            lcd_wdat(mun_char_table[ri/10]);
  319.            lcd_wdat(mun_char_table[ri%10]);
  320.            LCDWritueString(1,6,"日");
  321.            LCDWrituenumber(1,0,20);
  322.            /*   显示温度   */
  323.            temp=ReadTemperature();                //把读到的温度赋值给temp
  324.            LCDWritueString(3,0,"当前温度:");
  325.            lcd_pos(3,5);   
  326.            lcd_wdat(mun_char_table[temp/100]);
  327.            lcd_wdat(mun_char_table[temp%100/10]);
  328.        lcd_pos(3,6);  
  329.            LCDWritueString(3,6,".");
  330.            lcd_wdat(mun_char_table[temp%10]);
  331.            LCDWritueString(3,7,"度");
  332.            if(temp >= 250)
  333.            {
  334.               beep = ~beep;                         //蜂鸣器滴滴
  335.            }
  336.            else
  337.               beep = 1;
  338.    }
  339. }
  340. /*******************************************
  341. *               开机动画                                   *
  342. *******************************************/
  343. void kaiji(void)
  344. {
  345.    switch(ucStatus)
  346.    {
  347.         case 0: LCDWritueString(0,0,"大学生单片机竞赛");
  348.                     if(uiStatus >= 500)
  349.                             {
  350.                               uiStatus = 0;
  351.                                      ucStatus = 1;
  352.                             }
  353.                             break;
  354.             case 1: LCDWritueString(0,0,"                ");
  355.                     if(uiStatus >= 500)
  356.                             {
  357.                               uiStatus = 0;
  358.                                      ucStatus = 2;
  359.                             }
  360.                             break;
  361.             case 2: LCDWritueString(1,2,"H001组");
  362.                     if(uiStatus >= 500)
  363.                             {
  364.                               uiStatus = 0;
  365.                                      ucStatus = 3;
  366.                             }
  367.                             break;
  368.             case 3: LCDWritueString(1,2,"                ");
  369.                     if(uiStatus >= 500)
  370.                             {
  371.                               uiStatus = 0;
  372.                                      ucStatus = 4;
  373.                             }
  374.                             break;
  375.                 case 4: LCDWritueString(2,2,"只因追求");
  376.                     if(uiStatus >= 500)
  377.                             {
  378.                               uiStatus = 0;
  379.                                      ucStatus = 5;
  380.                             }
  381.                             break;
  382.             case 5: LCDWritueString(2,2,"               ");
  383.                     if(uiStatus >= 500)
  384.                             {
  385.                               uiStatus = 0;
  386.                                      ucStatus = 6;
  387.                             }
  388.                             break;                                                           
  389.                 case 6: LCDWritueString(3,2,"源于热爱");
  390.                     if(uiStatus >= 500)
  391.                             {
  392.                               uiStatus = 0;
  393.                                      ucStatus = 7;
  394.                             }
  395.                             break;
  396.             case 7: LCDWritueString(3,2,"               ");
  397.                     if(uiStatus >= 500)
  398.                             {
  399.                               uiStatus = 0;
  400.                                   ucStatus = 8;
  401.                                      flag = 1;
  402.                             }
  403.                             break;
  404.                 case 8:        break;
  405.    }
  406. }
  407. ///////////////////*******以下为按键模块********///////////////////
  408. /***********************************************
  409. *                                 矩阵键盘扫描
  410. ***********************************************/
  411. void Matrix_keyboar(void)
  412. {        
  413.         switch(ucMatrixStatus)
  414.         {
  415.                  case 0: if(uiMatrixLieSelect == 0)
  416.                                   {
  417.                                           LIE1 = 0;LIE2 = 1;LIE3 = 1;LIE4 = 1; //每一列 第一个
  418.                                  }
  419.                                  else if(uiMatrixLieSelect == 1)
  420.                                  {
  421.                                           LIE1 = 1;LIE2 = 0;LIE3 = 1;LIE4 = 1; //每一列 第二个
  422.                                  }
  423.                                  else if(uiMatrixLieSelect == 2)
  424.                                  {                                                                                   
  425.                                           LIE1 = 1;LIE2 = 1;LIE3 = 0;LIE4 = 1;  //每一列 第三个
  426.                                  }
  427.                                  else if(uiMatrixLieSelect == 3)
  428.                                  {
  429.                                           LIE1 = 1;LIE2 = 1;LIE3 = 1;LIE4 = 0;  //每一列 第四个
  430.                                  }
  431.                                  else
  432.                                  {
  433.                                           LIE1 = 1;LIE2 = 1;LIE3 = 1;LIE4 = 1;  //没有列按下
  434.                                  }
  435.                                  ucMatrixStatus = 1;
  436.                                  break;
  437.                  case 1: if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1) )//没有行按下
  438.                                   {
  439.                                           ucMatrixStatus = 0;          //重新扫描
  440.                                          uiMatrixLieSelect++;                  //逐行扫描
  441.                                          if(uiMatrixLieSelect > 3)uiMatrixLieSelect = 0;
  442.                                  }
  443.                                  else
  444.                                  {
  445.                                           uiMatrixCount++;                 //计时
  446.                                          if(uiMatrixCount >= 10)   //消抖
  447.                                          {
  448.                                                   uiMatrixCount = 0;                 //清零
  449.                                                  if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1))
  450.                                                  {
  451.                                                          ucMatrixStatus = 0;          //回到第一步
  452.                                                  }
  453.                                                  else
  454.                                                  {
  455.                                                         ucMatrixTemp = P2;
  456.                                                         ucMatrixStatus = 2;
  457.                                                  }
  458.                                          }
  459.                                  }
  460.                                  break;
  461.                 case 2:  if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1))
  462.                                  {
  463.                                          switch(ucMatrixTemp)
  464.                                         {
  465.                                                 case 0XEE: ucKeyNumber = 1;break;    //S1
  466.                                                 case 0XDE: ucKeyNumber = 2;break;         //S2
  467.                                                 case 0XBE: ucKeyNumber = 3;break;         //S3
  468.                                                 case 0X7E: ucKeyNumber = 4;break;         //S4

  469.                                                 case 0XED: ucKeyNumber = 5;break;         //S5
  470.                                                 case 0XDD: ucKeyNumber = 6;break;         //S6
  471.                                                 case 0XBD: ucKeyNumber = 7;break;         //S7
  472.                                                 case 0X7D: ucKeyNumber = 8;break;         //S8

  473.                                                 case 0XEB: ucKeyNumber = 9;break;         //S9
  474.                                                 case 0XDB: ucKeyNumber = 10;break;         //S10
  475.                                                 case 0XBB: ucKeyNumber = 11;break;         //S11
  476.                                                 case 0X7B: ucKeyNumber = 12;break;         //S12

  477.                                                 case 0XE7: ucKeyNumber = 13;break;         //S13
  478.                                                 case 0XD7: ucKeyNumber = 14;break;         //S14
  479.                                                 case 0XB7: ucKeyNumber = 15;break;         //S15
  480.                                                 case 0X77: ucKeyNumber = 16;break;         //S16
  481.                                         }
  482.                                             ucMatrixStatus = 0;
  483.                                  }
  484.                                  break;
  485.         }
  486. }
  487. /*************************************************
  488. *                 按键执行                                                 *
  489. *************************************************/
  490. void keyRun(void)
  491. {
  492.    switch(ucKeyNumber)
  493.    {
  494.        case 1: king = 1;D1 = 0;ucKeyNumber = 0;break;                          //暂停
  495.            case 2: miao++;if(miao>=59)miao=0;ucKeyNumber = 0;break;                  //秒加                                                   
  496.            case 3: miao--;if(miao<=0)miao=0;ucKeyNumber = 0;break;                      //秒减
  497.            case 4: fen++;if(fen>=59)fen=0;ucKeyNumber = 0;break;                  //分加
  498.            case 5: fen--;if(fen<=0)fen=0;ucKeyNumber = 0;break;                                  //分减
  499.            case 6: shi++;if(shi>=23)shi=0;ucKeyNumber = 0;break;                      //时加
  500.            case 7: shi--;if(shi<=0)shi=0;ucKeyNumber = 0;break;                                  //时减
  501.            case 8: king = 0;D1 = 1;ucKeyNumber = 0;break;                                          //开启
  502.    }
  503. }
复制代码

12864时钟.rar

41.65 KB, 下载次数: 18, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2019-5-6 17:23 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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