找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机迷你时钟电路与程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include "STC15F2K.h"
  2. #include "intrins.h"
  3. #include <math.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sfr ADC_LOW2    =   0xBE;           //ADC低2位结果

  7. #define ADC_POWER   0x80            //ADC电源控制位
  8. #define ADC_FLAG    0x10            //ADC完成标志
  9. #define ADC_START   0x08            //ADC起始控制位
  10. #define ADC_SPEEDLL 0x00            //540个时钟
  11. #define ADC_SPEEDL  0x20            //360个时钟
  12. #define ADC_SPEEDH  0x40            //180个时钟
  13. #define ADC_SPEEDHH 0x60            //90个时钟

  14. sbit S1=P3^3;
  15. sbit S2=P3^4;
  16. sbit S3=P3^5;
  17. sbit S4=P3^6;

  18. sbit bell=P3^0;

  19. sbit set=P1^0;
  20. sbit jia=P1^1;

  21. uchar dat1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0X80,0X90,0xff,0xc6};
  22. uchar dat2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0X00,0X10,0xff};//有小数点

  23. uchar table[4]={1,2,3,4};
  24. uchar xg=0;
  25. char t=0;
  26. int t1;
  27. char ps=0;
  28. char flag=1;
  29. int sudu1=0,sudu2=0;

  30. unsigned int temp[2];
  31. int ld;
  32. extern void init_ds1302_io();
  33. extern void init_ds1302();
  34. extern void read_time();
  35. extern void write_time();
  36. extern void read_nao();

  37. extern uchar miao;
  38. extern uchar fen;
  39. extern uchar shi;

  40. extern uchar nfen;
  41. extern uchar nshi;

  42. void Delayms(uint t)
  43. {
  44.         uchar i;
  45.         while(t--)
  46.            for(i=0;i<100;i++);
  47. }

  48. void display()
  49. {
  50.         S1=1;
  51.         P2=dat1[table[0]];
  52.         Delayms(2);       

  53.         S1=0;S2=1;
  54.         if(flag==0)P2=dat2[table[1]];
  55.         if(flag==1)P2=dat1[table[1]];
  56.         Delayms(2);
  57.        
  58.         S2=0;S3=1;
  59.         P2=dat1[table[2]];       
  60.         Delayms(2);
  61.        
  62.         S3=0;S4=1;
  63.         P2=dat1[table[3]];
  64.         Delayms(2);       

  65.         S1=S2=S3=S4=1;
  66.         P2=0xff;
  67.         S1=S2=S3=S4=0;
  68.         Delayms(2);                                                       
  69. }

  70. void init()
  71. {
  72.     TMOD= 0x01;                                  
  73.     TL0 = (65536-20000)/256;        //设置定时初值
  74.     TH0 = (65536-20000)%256;        //设置定时初值
  75.     ET0 = 1;
  76.     TR0 = 1;
  77.     EA = 1;
  78. }
  79. char menu=0;
  80. bit nf=0;
  81. bit gk=0;
  82. void key()
  83. {
  84.         if(set==0)
  85.         {
  86.                 bell=0;
  87.                 menu++;
  88.                 if(menu==3){read_nao();}
  89.                 if(menu==7){menu=0;ET1 = 1;write_time();}
  90.                 while(set==0);       
  91.                 bell=1;                       
  92.         }

  93.         if(menu==1)
  94.         {
  95.                 if(jia==0)
  96.                 {
  97.                         bell=0;
  98.                         if(fen >= 0x60)
  99.                                 fen = 0;

  100.                         fen=fen+0x01;
  101.                         if((fen & 0x0f) >= 0x0a)
  102.                                 fen = (fen & 0xf0) + 0x10;
  103.                         while(jia==0);
  104.                         bell=1;
  105.                 }                       
  106.         }
  107.         if(menu==2)
  108.         {
  109.                 if(jia==0)
  110.                 {
  111.                         bell=0;
  112.                         shi+=0x01;
  113.                         if((shi & 0x0f) >= 0x0a)
  114.                                 shi = (shi & 0xf0) + 0x10;

  115.                         if(shi >= 0x24)
  116.                                 shi = 0;
  117.                         while(jia==0);
  118.                         bell=1;
  119.                 }               
  120.         }
  121.        
  122.         if(menu==3)        //闹钟
  123.         {
  124.                 if(jia==0)
  125.                 {
  126.                         bell=0;
  127.                         if(nfen >= 0x60)
  128.                                 nfen = 0;

  129.                         nfen=nfen+0x01;
  130.                         if((nfen & 0x0f) >= 0x0a)
  131.                                 nfen = (nfen & 0xf0) + 0x10;
  132.                         while(jia==0);
  133.                         bell=1;       
  134.                 }
  135.         }
  136.         if(menu==4)
  137.         {
  138.                 if(jia==0)
  139.                 {
  140.                         bell=0;
  141.                         nshi+=0x01;
  142.                         if((nshi & 0x0f) >= 0x0a)
  143.                                 nshi = (nshi & 0xf0) + 0x10;

  144.                         if(nshi >= 0x24)
  145.                                 nshi = 0;
  146.                         while(jia==0);
  147.                         bell=1;
  148.                 }       
  149.         }
  150.         if(menu==5)
  151.         {
  152.                 if(jia==0)
  153.                 {
  154.                         while(jia==0);
  155.                         nf=!nf;
  156.                 }       
  157.         }
  158.         if(menu==6)
  159.         {
  160.                 if(jia==0)
  161.                 {
  162.                         while(jia==0);
  163.                         gk=!gk;
  164.                 }       
  165.         }       
  166. }
  167. void InitADC()
  168. {
  169.           P1ASF = 0x03;                        //Open channels ADC function 0100 0000 p1.6使用AD功能
  170.         ADC_RES  = 0;                                    //Clear previous result
  171.         ADC_LOW2 = 0;
  172.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  173. }
  174. void GetADCResult(unsigned char ch,unsigned int *value)
  175. {
  176.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  177.     _nop_();                        //Must wait before inquiry
  178.     _nop_();
  179.     _nop_();
  180.     _nop_();
  181.     _nop_();                        //Must wait before inquiry
  182.     _nop_();
  183.     while(!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  184.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  185.         *value = 0;
  186.         *value = ADC_RES;
  187.         *value = ((*value)*4 + ADC_LOW2);                //Return ADC result.×¢êíμ?′????ò·μ??8??ADC?á1?
  188. }

  189. void ADC_convert(void)
  190. {
  191.         GetADCResult(0,&temp[0]);
  192.         temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 278.15) * 100 );
  193. }
  194. void main()
  195. {
  196.     init();       
  197.         InitADC();
  198.         init_ds1302_io();
  199.         init_ds1302();

  200.         read_nao();

  201.         P3M0=0xf8;P3M1=0x00;

  202.         P2M0=0xff;P2M1=0x00;

  203.         P1M0=0xff;P1M1=0x00;

  204.         P5M0=0x10;P5M1=0x00;
  205.         while(1)
  206.         {
  207.                 P1ASF = 0x00;
  208.                 key();
  209.                 P1ASF = 0x03;
  210.                 if(menu==0)
  211.                 {
  212.                         read_time();
  213.                         if(t1>20 && t1<25)
  214.                         {
  215.                                 ADC_convert();
  216.                                 flag=1;
  217.                                 table[0]=10;
  218.                                 table[1]=temp[0]/1000;
  219.                                 table[2]=temp[0]%1000/100;
  220.                                 table[3]=11;
  221.                         }
  222.                         if(t1>0 && t1<20)
  223.                         {
  224.                                 table[0]=shi/16;
  225.                                 table[1]=shi%16;
  226.                                 table[2]=fen/16;
  227.                                 table[3]=fen%16;
  228.                         }
  229.                         if(t1>25)t1=0;       
  230.                 }

  231.                 if(menu==1)
  232.                 {       
  233.                         if(flag>0)
  234.                         {
  235.                                 table[2]=fen/16;
  236.                                 table[3]=fen%16;
  237.                         }
  238.                         else
  239.                         {
  240.                                 table[2]=10;
  241.                                 table[3]=10;                               
  242.                         }
  243.                         table[0]=shi/16;
  244.                         table[1]=shi%16;                       
  245.                 }
  246.                 if(menu==2)
  247.                 {
  248.                         table[2]=fen/16;
  249.                         table[3]=fen%16;
  250.                         if(flag>0)
  251.                         {
  252.                                 table[0]=shi/16;
  253.                                 table[1]=shi%16;                               
  254.                         }
  255.                         else
  256.                         {
  257.                                 table[0]=10;
  258.                                 table[1]=10;       
  259.                         }
  260.                 }
  261.                 if(menu==3)
  262.                 {       
  263.                         if(flag>0)
  264.                         {
  265.                                 table[2]=nfen/16;
  266.                                 table[3]=nfen%16;
  267.                         }
  268.                         else
  269.                         {
  270.                                 table[2]=10;
  271.                                 table[3]=10;                               
  272.                         }
  273.                         table[0]=nshi/16;
  274.                         table[1]=nshi%16;                       
  275.                 }
  276.                 if(menu==4)
  277.                 {
  278.                         table[2]=nfen/16;
  279.                         table[3]=nfen%16;
  280.                         if(flag>0)
  281.                         {
  282.                                 table[0]=nshi/16;
  283.                                 table[1]=nshi%16;                               
  284.                         }
  285.                         else
  286.                         {
  287.                                 table[0]=10;
  288.                                 table[1]=10;       
  289.                         }
  290.                 }
  291.                 if(menu==5)
  292.                 {
  293.                         table[0]=nf;
  294.                         table[1]=nf;
  295.                         table[2]=nf;
  296.                         table[3]=nf;       
  297.                 }
  298.                 if(menu==6)
  299.                 {
  300.                         table[0]=gk;
  301. ……………………

  302. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
程序.rar (52.64 KB, 下载次数: 8)

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

使用道具 举报

沙发
ID:737771 发表于 2021-6-20 11:56 | 只看该作者
第215行 temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 278.15) * 100 ) 公式怎么来的
回复

使用道具 举报

板凳
ID:737771 发表于 2021-6-20 11:57 | 只看该作者
第215行 temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 278.15) * 100 )公式怎么来的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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