找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1968|回复: 2
收起左侧

单片机时钟和电压表

[复制链接]
ID:466105 发表于 2019-2-1 15:20 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include "XPT2046.h"       
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar a;
  6. sbit lcden=P2^7;                //LDC1602读写使能
  7. sbit rs=P2^6;                                //LCD1602寄存器
  8. sbit rw=P2^5;              //LCD1602读写

  9. sbit s1=P3^0;       //时钟暂停
  10. sbit s2=P3^1;       //时间减
  11. sbit s3=P3^3;       //时间加
  12. sbit k3=P3^2;       //中断开关,按下后跳到电压表

  13. sbit LSA=P2^2;                //三八译码器A口
  14. sbit LSB=P2^3;                //三八译码器B口
  15. sbit LSC=P2^4;                //三八译码器C口

  16. int disp[4];
  17. int code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     //数码管0到9
  18. int code xiaoshu[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

  19. uchar count,s1num;
  20. char miao,shi,fen;
  21. uchar code table[]=" 2019-1-11 TIME ";      
  22. uchar code table1[]="    00:00:00";
  23. uchar code table2[]="student id:1840740128";  

  24. void delay(uint z)     //延时
  25. {
  26.         uint x,y;
  27.         for(x=z;x>0;x--)
  28.                 for(y=110;y>0;y--);
  29. }

  30. void write_com(uchar com)
  31. {
  32.         rs=0;
  33.         lcden=0;
  34.         P0=com;
  35.         delay(5);
  36.         lcden=1;
  37.         delay(5);
  38.         lcden=0;       
  39. }

  40. void write_date(uchar date)
  41. {
  42.         rs=1;
  43.         lcden=0;
  44.         P0=date;
  45.         delay(5);
  46.         lcden=1;
  47.         delay(5);
  48.         lcden=0;       
  49. }

  50. void init()
  51. {

  52.         uchar num;
  53.         lcden=0;      
  54.     rw=0;
  55.         write_com(0x38);
  56.         write_com(0x0c);
  57.         write_com(0x06);
  58.         write_com(0x01);
  59.         write_com(0x80);
  60.         for(num=0;num<15;num++)
  61.                 {
  62.                         write_date(table[num]);
  63.                         delay(5);
  64.                 }
  65.         write_com(0x80+0x40);
  66.         for(num=0;num<12;num++)
  67.                 {
  68.                         write_date(table1[num]);
  69.                         delay(5);
  70.                 }
  71.         TMOD=0x01;
  72.         TH0=(65536-50000)/256;
  73.         TL0=(65536-50000)%256;
  74.         EA=1;
  75.         ET0=1;
  76.         TR0=1;
  77. }

  78. void write_sfm(uchar add,uchar date)
  79. {
  80.         uchar shi,ge;
  81.         shi=date/10;
  82.         ge=date%10;
  83.         write_com(0x80+0x40+add);
  84.         write_date(0x30+shi);
  85.         write_date(0x30+ge);
  86. }

  87. void keyscan()
  88. {
  89.         if(s1==0)       
  90.         {
  91.                 delay(5);
  92.                 if(s1==0)
  93.                 {        s1num++;
  94.                         while(!s1);
  95.                         if(s1num==1)
  96.                         {
  97.                                 TR0=0;
  98.                                 write_com(0x80+0x40+10);
  99.                                 write_com(0x0f);
  100.                         }
  101.         }
  102.                         if(s1num==2)
  103.                         {
  104.                                 write_com(0x80+0x40+7);
  105.                         }
  106.                         if(s1num==3)
  107.                         {
  108.                                 write_com(0x80+0x40+4);
  109.                         }
  110.                         if(s1num==4)
  111.                         {
  112.                                 s1num=0;
  113.                                 write_com(0x0c);
  114.                                 TR0=1;
  115.                         }

  116.                                
  117.                 }
  118.                 if(s1num!=0)
  119.                 {
  120.                         if(s2==0)
  121.                         {
  122.                                 delay(5);
  123.                                 if(s2==0)
  124.                                 {
  125.                                         while(!s2);
  126.                                         if(s1num==1)
  127.                                         {
  128.                                                 miao++;
  129.                                                 if(miao==60)
  130.                                                         miao=0;
  131.                                                 write_sfm(10,miao);
  132.                                                 write_com(0x80+0x40+10);
  133.                                                
  134.                                                
  135.                                         }
  136.                                         if(s1num==2)
  137.                                         {
  138.                                                 fen++;
  139.                                                 if(fen==60)
  140.                                                         fen=0;
  141.                                                 write_sfm(7,fen);
  142.                                                 write_com(0x80+0x40+7);
  143.                                         }
  144.                                         if(s1num==3)
  145.                                         {
  146.                                                 shi++;
  147.                                                 if(shi==24)
  148.                                                         shi=0;
  149.                                                 write_sfm(4,shi);
  150.                                                 write_com(0x80+0x40+4);
  151.                                         }
  152.                                 }
  153.                         }
  154.                         if(s3==0)
  155.                         {
  156.                                 delay(5);
  157.                                 if(s3==0)
  158.                                 {
  159.                                         while(!s3);
  160.                                         if(s1num==1)
  161.                                         {
  162.                                                 miao--;
  163.                                                 if(miao==-1)
  164.                                                         miao=59;
  165.                                                 write_sfm(10,miao);
  166.                                                 write_com(0x80+0x40+10);
  167.                                         }
  168.                                         if(s1num==2)
  169.                                         {
  170.                                                 fen--;
  171.                                                 if(fen==-1)
  172.                                                         fen=59;
  173.                                                 write_sfm(7,fen);
  174.                                                 write_com(0x80+0x40+7);
  175.                                         }
  176.                                         if(s1num==3)
  177.                                         {
  178.                                                 shi--;
  179.                                                 if(shi==-1)
  180.                                                         shi=23;
  181.                                                 write_sfm(4,shi);
  182.                                                 write_com(0x80+0x40+4);
  183.                                         }
  184.                                 }
  185.                         }
  186.                 }
  187. }


  188. void timer0() interrupt 1            //定时器中断
  189. {
  190.         TH0=(65536-50000)/256;
  191.         TL0=(65536-50000)%256;
  192.         count++;
  193. if(count==18)
  194.                 {
  195.                         count=0;
  196.                         miao++;
  197.                         if(miao==60)
  198.                         {
  199.                                 miao=0;
  200.                                 fen++;
  201.                                 if(fen==60)
  202.                                 {
  203.                                         fen=0;
  204.                                         shi++;
  205.                                         if(shi==24)
  206.                                         {
  207.                                                 shi=0;
  208.                                         }
  209.                                         write_sfm(4,shi);
  210.                                 }
  211.                                 write_sfm(7,fen);
  212.                         }
  213.                         write_sfm(10,miao);
  214.                        
  215.                 }       
  216. }


  217. void datapros()
  218. {
  219.         int temp;
  220.         static int i;
  221.         if(i==50)
  222.         {
  223.                 i=0;
  224.                 temp = Read_AD_Data(0xE4);                //   AIN3 外部输入
  225.         }
  226.         i++;
  227.         disp[3]=xiaoshu[temp/1000];//千位
  228.         disp[2]=smgduan[temp%1000/100];//百位
  229.         disp[1]=smgduan[temp%1000%100/10];//个位
  230.         disp[0]=smgduan[temp%1000%100%10];               
  231. }

  232. //数码管显示函数

  233. void DigDisplay()
  234. {
  235.         int i;
  236.         for(i=0;i<4;i++)
  237.         {
  238.                 switch(i)         //位选,选择点亮的数码管,
  239.                 {
  240.                         case(0):
  241.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  242.                         case(1):
  243.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  244.                         case(2):
  245.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  246.                         case(3):
  247.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位       
  248.                 }
  249.                 P0=disp[i];//发送数据
  250.                 delay(1); //间隔一段时间扫描       
  251.                 P0=0x00;//消隐
  252.         }               
  253. }

  254. void dianyabiao()
  255. {
  256.     datapros();         //数据处理函数
  257.                 DigDisplay();//数码管显示函数       
  258. }
  259. void shumaguan()
  260. {
  261.   
  262. }

  263. void main()
  264. {       
  265.   a=0;
  266.         IT0=0;  //中断触发方式为低电平触发,IT0=1则为下边沿触发              
  267.         EX0=1;  //打开外部中断0
  268.         EA=1;    //打开中断总开关
  269.         init();
  270.         while(1)
  271.         {
  272.                 switch(a%2)
  273.                 {
  274.                 case 1:dianyabiao();break;
  275.                 case 0:keyscan();break;
  276.                 }
  277.         }
  278. }

  279. void INTERR(void) interrupt 0
  280. {
  281.         if(k3==0)              
  282.         {       
  283.    while(1)
  284.          {
  285.             delay(100);
  286.                         if(k3==1)
  287.                         {
  288.                                 break;
  289.                         }
  290.          }
  291.          a++;
  292.          delay(300);
  293.         }
  294. }
复制代码


改AD.zip

52.78 KB, 下载次数: 2, 下载积分: 黑币 -5

回复

使用道具 举报

ID:412814 发表于 2019-2-2 07:57 | 显示全部楼层
谢谢楼主,学习了。
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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