找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15108|回复: 20
收起左侧

STC15F204EA单片机+NTC热敏电阻+ds1302+数码管显示时钟源码

  [复制链接]
ID:55211 发表于 2018-10-19 11:57 | 显示全部楼层 |阅读模式
如有雷同请莫怪,高手请不要飘过本人就是懒虫硬件很随便
一个用单片机adc+ntc热敏电阻构成的时钟电路分享

制作出来的实物图如下:
23284771789745949.jpg 233451634026181101.jpg 489334760998475537.jpg 586061746574192568.jpg

电路原理图如下:
0.png

单片机源程序如下:
  1. #include"reg52.h"
  2. #include"ds1302.h"
  3. #include"intrins.h"
  4. //#include"EEP.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define on 1
  8. #define off 0                        
  9. #define NOP(N)  NOP##N()
  10. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
  11. sfr ADC_RES     =   0xBD;           //ADC高8位结果
  12. sfr ADC_RESL    =   0xBE;           //ADC低2位结果
  13. sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器
  14. uint get_temperature(uint adc);
  15. void Get_Temp(void);

  16. //段码位选
  17. sbit G1= P3^4;
  18. sbit G2= P3^5;
  19. sbit G3= P3^6;
  20. sbit G4= P3^7;
  21. //按键定义
  22. sbit set=P3^0;
  23. sbit jia=P3^1;
  24. sbit zh=P3^3;                                        // 颠倒开关
  25. #define N 8                                                        //ADC采样使用递推平均滤波算法,采样次数

  26. unsigned int  Temp_Buf[N+1];                //采样数组
  27. unsigned char ADCcount;                                //数码管显示计数变量,ADC采样次数变量
  28. uchar tab[4]={0};                                        //显示缓存
  29. unsigned int temp[3];
  30. #define FOSC 11059200L

  31. #define T1MS (65536-FOSC/12/33)                        //12T模式           30MS


  32. sfr AUXR = 0x8e;                                                //Auxiliary register
  33. sbit P10 = P1^0;          //调用闹钟用
  34. sfr P1M0        =   0x92;
  35. sfr P1M1        =   0x91;

  36. bit nf=0;                //闹钟开标志:受水银影响
  37. bit gk=0;                //光控开标志
  38. bit nk=0;                //闹钟开标志:受设置影响
  39. bit nx=1;                //闹钟响标志:受时间影响
  40. bit ps=0;                //颠倒开关标志
  41. bit flag1=1,
  42.         wflag1=0;
  43. int ld=1;
  44. char menu=0;
  45. char flag;


  46. //没有小数点                 共阳数码管
  47. uchar table1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  48.                           0x80,0x90,0xff,0x88,0xc7};                          //c4
  49. //显示小数点                                                           a   l
  50. uchar table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
  51.                           0x00,0x10,0xff,};
  52. //倒没有小数点
  53. uchar table3[]={0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,
  54.                           0x80,0x82,0xff,};
  55. //倒显示小数点
  56. uchar table4[]={0x40,0x4F,0x24,0x06,0x0B,0x12,0x10,0x47,
  57.                                                   0x00,0x02,0xff,0x70,};

  58. //延时ms
  59. void delay_ms(uchar ms){
  60.         uchar i;
  61.         while(ms--){
  62.                 for(i=0;i<123;i++);        
  63.         }
  64. }
  65. //温度显示
  66. void display_temperatue(){

  67.         G1 = off;
  68.         G2 = on;
  69.         G3 = on;
  70.         G4 = on;
  71.         P2 =  table1[tab[0]];
  72.         delay_ms(8);

  73.         G1 = on;
  74.         G2 = off;
  75.         G3 = on;
  76.         G4 = on;
  77.         P2 =  table1[tab[1]];
  78.         delay_ms(8);
  79.         
  80.         G1 = on;
  81.         G2 = on;
  82.         G3 = off;
  83.         G4 = on;
  84. //        P2 =  table3[tab[2]];
  85.         P2 =  table4[11];
  86.         delay_ms(8);

  87.         G1 = on;
  88.         G2 = on;
  89.         G3 = on;
  90.         G4 = on;
  91.         P2 =  table4[tab[3]];
  92. //        P2 =  table1[tab[3]];
  93.         delay_ms(5);
  94. }
  95. //时间显示
  96. void display_time(){

  97.         G1 = off;
  98.         G2 = on;
  99.         G3 = on;
  100.         G4 = on;
  101.         P2 =  table1[tab[0]];
  102.         delay_ms(5);
  103.         if(flag>0){
  104.                 G1 = on;
  105.                 G2 = off;
  106.                 G3 = on;
  107.                 G4 = on;
  108.                 P2 =  table1[tab[1]];
  109.                 delay_ms(5);
  110.                
  111.                 G1 = on;
  112.                 G2 = on;
  113.                 G3 = off;
  114.                 G4 = on;
  115.                 P2 =  table3[tab[2]];
  116.                 delay_ms(5);        
  117.         
  118.         }else{
  119.                 G1 = on;
  120.                 G2 = off;
  121.                 G3 = on;
  122.                 G4 = on;
  123.                 P2 =  table2[tab[1]];
  124.                 delay_ms(5);        

  125.                 G1 = on;
  126.                 G2 = on;
  127.                 G3 = off;
  128.                 G4 = on;
  129.                 P2 =  table4[tab[2]];
  130.                 delay_ms(5);        
  131.         }
  132.         if(nx==0){
  133.                 if(flag>0){
  134.                         G1 = on;
  135.                         G2 = on;
  136.                         G3 = on;
  137.                         G4 = off;
  138.                         P2 =  table1[tab[3]];
  139.                         delay_ms(5);        
  140.                 }
  141.                 else{
  142.                         G1 = on;
  143.                         G2 = on;
  144.                         G3 = on;
  145.                         G4 = off;
  146.                         P2 =  table2[tab[3]];
  147.                         delay_ms(5);        
  148.                 }
  149.         }else{
  150.                         G1 = on;
  151.                         G2 = on;
  152.                         G3 = on;
  153.                         G4 = off;
  154.                         P2 =  table1[tab[3]];
  155.                         delay_ms(5);        
  156.         }


  157.         G1 = on;
  158.         G2 = on;
  159.         G3 = on;
  160.         G4 = on;         
  161. }
  162. //音频调用
  163. void display_Audio(){

  164.         G1 = off;
  165.         G2 = on;
  166.         G3 = on;
  167.         G4 = on;
  168.         if(temp[1]>5){P2=0xcf;}else{P2=0xff;}
  169.         delay_ms(10);
  170.         if(temp[1]>30){P2=0xf9;}else{P2=0xff;}
  171.         delay_ms(10);
  172.         G1 = on;
  173.         G2 = off;
  174.         G3 = on;
  175.         G4 = on;
  176.         if(temp[1]>60){P2=0xcf;}else{P2=0xff;}
  177.         delay_ms(10);
  178.         if(temp[1]>90){P2=0xf9;}else{P2=0xff;}
  179.         delay_ms(10);

  180.         G1 = on;
  181.         G2 = on;
  182.         G3 = off;
  183.         G4 = on;
  184.         if(temp[1]>120){P2=0xf9;}else{P2=0xff;}
  185.         delay_ms(10);
  186.         if(temp[1]>150){P2=0xcf;}else{P2=0xff;}
  187.         delay_ms(10);

  188.         G1 = on;
  189.         G2 = on;
  190.         G3 = on;
  191.         G4 = off;
  192.         if(temp[1]>180){P2=0xcf;}else{P2=0xff;}
  193.         delay_ms(10);
  194.         if(temp[1]>210){P2=0xf9;}else{P2=0xff;}
  195.         delay_ms(10);
  196. }

  197. //闹钟用 ,光控用
  198. void display_alme(){
  199.         G1 = off;
  200.         G2 = on;
  201.         G3 = on;
  202.         G4 = on;
  203.         P2 =  table1[tab[0]];
  204.         delay_ms(8);

  205.         G1 = on;
  206.         G2 = off;
  207.         G3 = on;
  208.         G4 = on;
  209.         P2 =  table2[tab[1]];
  210.         delay_ms(8);
  211.         
  212.         G1 = on;
  213.         G2 = on;
  214.         G3 = off;
  215.         G4 = on;
  216.         P2 =  table4[tab[2]];
  217.         delay_ms(8);

  218.         G1 = on;
  219.         G2 = on;
  220.         G3 = on;
  221.         G4 = off;
  222.         P2 =  table2[tab[3]];
  223.         delay_ms(5);
  224.         G1 = on;
  225.         G2 = on;
  226.         G3 = on;
  227.         G4 = on;

  228. }
  229. /*
  230. //设计调用
  231. void display_set1(){

  232.         G1 = off;
  233.         G2 = on;
  234.         G3 = on;
  235.         G4 = on;
  236.         P2 =  table1[tab[0]];
  237.         delay_ms(8);

  238.         G1 = on;
  239.         G2 = off;
  240.         G3 = on;
  241.         G4 = on;
  242.         P2 =  table2[tab[1]];
  243.         delay_ms(8);
  244.         
  245.         G1 = on;
  246.         G2 = on;
  247.         G3 = off;
  248.         G4 = on;
  249.         P2 =  table4[tab[2]];
  250.         delay_ms(8);

  251.         G1 = on;
  252.         G2 = on;
  253.         G3 = on;
  254.         G4 = off;
  255.         P2 =  table1[tab[3]];
  256.         delay_ms(5);
  257.         G1 = on;
  258.         G2 = on;
  259.         G3 = on;
  260.         G4 = on;
  261. } */
  262. //设计调用
  263. void display_set(){

  264.         G1 = off;
  265.         G2 = on;
  266.         G3 = on;
  267.         G4 = on;
  268.         P2 =  table1[tab[0]];
  269.         delay_ms(8);

  270.         G1 = on;
  271.         G2 = off;
  272.         G3 = on;
  273.         G4 = on;
  274.         P2 =  table2[tab[1]];
  275.         delay_ms(8);
  276.         
  277.         G1 = on;
  278.         G2 = on;
  279.         G3 = off;
  280.         G4 = on;
  281.         P2 =  table4[tab[2]];
  282.         delay_ms(8);

  283.         G1 = on;
  284.         G2 = on;
  285.         G3 = on;
  286.         G4 = off;
  287.         P2 =  table1[tab[3]];
  288.         delay_ms(5);
  289.         G1 = on;
  290.         G2 = on;
  291.         G3 = on;
  292.         G4 = on;
  293. }
  294. //ADC初始化
  295. void ic_adc_init(){
  296.         ADC_CONTR = 0xE0;        //90T, ADC power on
  297.         delay_ms(5);

  298. }
  299. //读ADC值
  300. uint get_adc_temp(uchar channel){

  301.         ADC_RES = 0;
  302.         ADC_RESL = 0;

  303.         ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel;         //start the ADC

  304.         delay_ms(1);
  305.         while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
  306.         ADC_CONTR &= ~0x10;                //清除ADC结束标志
  307.         return        (((uint)ADC_RES << 2) | (ADC_RESL & 3));
  308. }
  309. void key(){

  310.         if(zh==0){ps=0;}else ps=1;
  311.         if(ps==0){
  312.                 if(set==0){
  313.                         delay_ms(10);
  314.                         if(set==0){
  315.                                 menu+=1;
  316.                                 if(menu==1)//        read_time();
  317.                                 if(menu==3){ read_nao();}
  318.                         //        if(menu==5)                        // IapProgramByte(IAP_ADDRESS+5,gk&0x01);           display_alme();//调显示
  319.                         //        if(menu==6)                          //        IapProgramByte(IAP_ADDRESS+6,nk&0x01);  display_alme();//调显示
  320.                                 if(menu==7)menu=0;         write_time();
  321.                                 while(set==0);
  322.                                 display_set();//调显示               
  323.                         }
  324.                 }
  325.                 if(menu==1){ //调分钟
  326.                         if(jia==0){
  327.                                 delay_ms(10);
  328.                                 if(jia==0){        
  329.                                 fen=fen+1;
  330.                                 if(fen == 0x5a)
  331.                                         fen = 0;
  332.                                 if((fen & 0x0f) >= 0x0a)
  333.                                         fen = (fen & 0xf0) + 0x10;        
  334.                                         while(jia==0);
  335.                                 }
  336.                         }        display_set();//调显示
  337.                 }
  338.                 if(menu==2){   //小时
  339.                         if(jia==0){
  340.                                 delay_ms(10);
  341.                                 if(jia==0){
  342.                                         shi=shi+1;
  343.                                         if(shi == 0x24)
  344.                                                 shi = 0;
  345.                                         if((shi & 0x0f) >= 0x0a)
  346.                                                 shi = (shi & 0xf0) + 0x10;        
  347.                                                 while(jia==0);                                
  348.                                 }
  349.                         }display_set();//调显示               
  350.                 }
  351.                 if(menu==3){        //分钟
  352.                         if(jia==0){
  353.                                 delay_ms(10);
  354.                                 if(jia==0){        
  355.                                 nfen=nfen+1;
  356.                                 if(nfen == 0x5a)
  357.                                         nfen = 0;
  358.                                 if((nfen & 0x0f) >= 0x0a)
  359.                                         nfen = (nfen & 0xf0) + 0x10;        
  360.                                         while(jia==0);
  361.                                 }
  362.                         }        display_alme();//调显示
  363.                 }
  364.                 if(menu==4){        //小时
  365.                         if(jia==0){
  366.                                 delay_ms(10);
  367.                                 if(jia==0){
  368.                                         nshi=nshi+1;
  369.                                         if(nshi == 0x24)
  370.                                                 nshi = 0;
  371.                                         if((nshi & 0x0f) >= 0x0a)
  372.                                                 nshi = (nshi & 0xf0) + 0x10;        
  373.                                                 while(jia==0);                                
  374.                                 }
  375.                         }display_alme();//调显示               
  376.                 }
  377.                 if(menu==5){         //调光控
  378.                         if(jia==0){
  379.                                 delay_ms(10);
  380.                                 if(jia==0){
  381.                                        
  382.                                         while(jia==0);
  383.                                         gk=!gk;
  384.                                        
  385.                                 //   IapProgramByte(0x03,gk);
  386.                                 }
  387.                         } display_set();//调显示
  388.                 }
  389.                 if(menu==6){         //调闹钟
  390.                         if(jia==0){
  391.                                 delay_ms(10);
  392.                                 if(jia==0){
  393.                                        
  394.                                         while(jia==0);
  395.                                         nk=!nk;
  396.                                 //        IapProgramByte(0x02,nk);
  397.                         
  398.                                 }
  399.                         }display_alme();//调显示               
  400.                 }                                                                        
  401.         }
  402. }

  403. void main(){

  404. //        AUXR |= 0x80;                   //定时器0为1T模式
  405.         AUXR &= 0x7f;                   //定时器0为12T模式
  406.         TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
  407.         TL0 = T1MS;                     //初始化计时值
  408.         TH0 = T1MS >> 8;

  409.     TR0 = 1;                        //定时器0开始计时
  410.     ET0 = 1;                        //使能定时器0中断
  411.     EA = 1;

  412.         ic_adc_init();
  413.         init_ds1302_io();  
  414.         init_ds1302();
  415.         read_nao();

  416.         P1M0=0X00;
  417.         P1M1=0Xff;
  418.         while(1){
  419.         
  420.                 if(nk==1){if(shi==nshi && fen==nfen && nf==0){nx=0;}else{nx=1;}}  //开闹钟
  421.                 key();
  422.                 if(ps==0){
  423.                         if(menu==0){//主菜单
  424.                                 if(flag1==1){         //显示时间
  425.                                         temp[2]=get_adc_temp(1);
  426.                                         if(gk==1){
  427.                                                                                        
  428.                                                 if(temp[2]<100) ld=5;
  429.                                                 if(temp[2]>100&&temp[2]<300)ld=10;
  430.                                                 if(temp[2]>300&&temp[2]<500)ld=50;
  431.                                                 if(temp[2]>500&&temp[2]<600)ld=80;
  432.                                                 if(temp[2]>600&&temp[2]<700)ld=100;
  433.                                                 if(temp[2]>700&&temp[2]<800)ld=120;
  434.                                                 if(temp[2]>900&&temp[2]<1000)ld=130;
  435.                                                 if(temp[2]>1000)ld=150;
  436.                                         }else ld=5;
  437.                                         read_time();
  438.                                         tab[0]=shi/16;
  439.                                         tab[1]=shi%16;
  440.                                         tab[2]=fen/16;
  441.                                         tab[3]=fen%16;
  442.                                         display_time();
  443.                                         delay_ms(ld);                                       
  444.                                 }
  445.                                 if(flag1==0)         //显示温度
  446.                                 {
  447.                                         if(wflag1==0){wflag1=1;}
  448.                                         Get_Temp();
  449.                                         display_temperatue();
  450.                                         delay_ms(ld);
  451.                                 }
  452.                         }else{          //设置菜单
  453.                
  454.                                 if(menu==1){ //调时间分
  455.                                                 tab[0]=shi/16;
  456.                                                 tab[1]=shi%16;
  457.                                         if(flag>0){
  458.                                                 tab[2]=fen/16;                                       
  459.                                                 tab[3]=fen%16;
  460.                                         }else{
  461.                                                 tab[2]=10;
  462.                                                 tab[3]=10;
  463.                                         }                        
  464.                                 }
  465.                                 if(menu==2){ //调时间时
  466.                                                 tab[2]=fen/16;
  467.                                                 tab[3]=fen%16;               
  468.                                         if(flag>0){
  469.                                                 tab[0]=shi/16;
  470.                                                 tab[1]=shi%16;

  471.                                         }else{
  472.                                                 tab[0]=10;
  473.                                                 tab[1]=10;
  474.                                         }        
  475.                                 }
  476.                                 if(menu==3){ //调闹钟分
  477.         
  478.                                                 tab[0]=nshi/16;
  479.                                                 tab[1]=nshi%16;
  480.                                         if(flag>0){
  481.                                                 tab[2]=nfen/16;                                       
  482.                                                 tab[3]=nfen%16;
  483.                                         }else{
  484.                                                 tab[2]=10;
  485.                                                 tab[3]=10;
  486.                                         }                        
  487.                                 }
  488.                                 if(menu==4){ //调闹钟时
  489.         
  490.                                         if(flag>0){
  491.                                                 tab[0]=nshi/16;
  492.                                                 tab[1]=nshi%16;
  493.                                         }else{
  494.                                                 tab[0]=10;
  495.                                                 tab[1]=10;
  496.                                         }        
  497.                                                 tab[2]=nfen/16;
  498.                                                 tab[3]=nfen%16;                        
  499.                                 }
  500.                                 if(menu==5){ //调光控
  501.                                                 tab[0]=11;
  502.                                                 tab[1]=gk;
  503.                                                 tab[2]=gk;
  504.                                                 tab[3]=gk;
  505.         
  506.                                 }
  507.                                 if(menu==6){ //调闹钟
  508.                                                 tab[0]=12;
  509.                                                 tab[1]=nk;
  510.                                                 tab[2]=nk;
  511.                                                 tab[3]=nk;                        
  512.                                 }
  513.                         }
  514.                 }
  515.                 if(ps==1){         //端口一定要设计置高阻输入
  516.                         temp[1]=get_adc_temp(0);
  517.                         display_Audio();//
  518.                 }
  519.          }
  520. }
  521. char t;
  522. int t1;
  523. // Timer0 interrupt routine  定时0中断
  524. void tm0_isr() interrupt 1 using 1
  525. {

  526.     P10 = ! P10;                    //将测试口取反
  527.         t++;
  528.         t1++;
  529.         if(t==20)
  530.         {
  531.                 t=0;
  532.                 wflag1=0;
  533.                 flag=!flag;
  534. //                if(nx==0)bell=!bell;
  535.         }
  536.         if(t1>0 && t1<350)flag1=1;
  537.         if(t1>350 && t1<430)flag1=0;
  538.         if(t1>430)t1=0;        
  539. }
  540. //NTC温度
  541. void Get_Temp(void)
  542. {
  543.         unsigned char xx;
  544.         unsigned int sum,tempvalue;
  545.         sum = tempvalue =0;
  546.         Temp_Buf[N]=get_adc_temp(2);        //将ADC转换结果放数组最高位
  547.         if( ++ADCcount < 8)                //采样初期不使用滤波算法
  548.         {        
  549.                 for(xx=0;xx<N;xx++)        //准备滤波算法的数据
  550.                 {
  551.                         Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
  552.                 }
  553.                 tempvalue=Temp_Buf[N];//采样初期使用当前采样值
  554.         }
  555.         else         //只有采样次数大于8次以后才使用滤波算法        
  556.         {
  557.                 ADCcount=8;        //采样次数超过8次后,固定设置为8
  558.                 for(xx=0;xx<N;xx++)        //滤波算法
  559.                 {
  560.                         Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
  561.                         sum+=Temp_Buf[xx];        //求和
  562.                 }
  563.                 tempvalue=sum/N;                //求平均值               
  564.         }        //        
  565.         tempvalue=get_temperature(tempvalue);
  566. //        tab[0]=tempvalue/1000;               
  567.         tab[0]=tempvalue%1000/100;        //十位
  568.         tab[1]=tempvalue%100/10;//个位加小数点
  569. //        tab[3]=tempvalue%10;        //小数位
  570. }

  571. //        MF52E 10K at 25, B = 3534, ADC = 12 bits
  572. uint code temp_table[]={
  573.                 140,        //;-40        0
  574.                 149,        //;-39        1
  575.                 159,        //;-38        2
  576.                 168,        //;-37        3
  577.                 178,        //;-36        4
  578.                 188,        //;-35        5
  579.                 199,        //;-34        6
  580.                 210,        //;-33        7
  581.                 222,        //;-32        8
  582.                 233,        //;-31        9
  583.                 246,        //;-30        10
  584.                 259,        //;-29        11
  585.                 272,        //;-28        12
  586.                 286,        //;-27        13                        14
  587.                 301,        //;-26        14                        15
  588.                 317,        //;-25        15                        16
  589.                 334,
  590.                 351,
  591.                 369,
  592.                 387,
  593.                 406,
  594.                 425,
  595.                 445,
  596.                 466,
  597.                 487,
  598.                 509,
  599.                 528,   //
  600.                 555,
  601.                 579,
  602.                 603,
  603.                 628,
  604.                 654,
  605.                 681,
  606.                 709,
  607.                 738,
  608.                 768,
  609.                 799,
  610.                 824,        //;-4        36
  611.                 858,        //;-3        37                9
  612.                 893,        //;-2        38
  613.                 929,        //;-1        39
  614.                 965,        //;0        40
  615.                 1003,        //;1        41
  616.                 1041,        //;2        42
  617.                 1080,        //;3        43
  618.                 1119,        //;4        44
  619.                 1139,
  620.                 1160,        //;5        45
  621.                 1180,
  622.                 1201,        //;6        46
  623.         
  624.                 1243,        //;7        47
  625.                 1285,        //;8        48
  626.                 1328,        //;9        49
  627.                 1371,        //;10        50
  628.                 1414,        //;11        51
  629.                 1459,        //;12        52
  630.                 1503,        //;13        53
  631.                 1548,        //;14        54
  632.                 1593,        //;15        55
  633.                 1638,        //;16        56
  634.                 1684,        //;17        57
  635.                 1730,        //;18        58
  636.                 1775,        //;19        59
  637.                 1821,        //;20        60
  638.                 1867,        //;21        61
  639.                 1912,        //;22        62
  640.                 1958,        //;23        63
  641.                 2003,        //;24        64
  642.                 2048,        //;25        65
  643.                 2093,        //;26        66
  644.                 2137,        //;27        67
  645.                 2182,        //;28        68
  646.                 2225,        //;29        69
  647.                 2269,        //;30        70
  648.                 2312,        //;31        71
  649.                 2354,        //;32        72
  650.                 2397,        //;33        73
  651.                 2438,        //;34        74
  652.                 2479,        //;35        75
  653.                 2519,        //;36        76
  654.                 2559,        //;37        77
  655.                 2598,        //;38        78
  656.                 2637,        //;39        79
  657.                 2675,        //;40        80
  658.                 2712,        //;41        81
  659.                 2748,        //;42        82
  660.                 2784,        //;43        83
  661.                 2819,        //;44        84
  662.                 2853,        //;45        85
  663.                 2887,        //;46        86
  664.                 2920,        //;47        87
  665.                 2952,        //;48        88
  666.                 2984,        //;49        89
  667.                 3014,        //;50        90
  668.                 3044,        //;51        91
  669.                 3073,        //;52        92
  670.                 3102,        //;53        93
  671.                 3130,        //;54        94
  672.                 3157,        //;55        95
  673.                 3183,        //;56        96
  674.                 3209,        //;57        97
  675.                 3234,        //;58        98
  676.                 3259,        //;59        99
  677.                 3283,        //;60        100
  678.                 3306,        //;61        101
  679.                 3328,        //;62        102
  680.                 3351,        //;63        103
  681.                 3372,        //;64        104
  682.                 3393,        //;65        105
  683.                 3413,        //;66        106
  684.                 3432,        //;67        107
  685.          
  686. };
  687. /********************  计算温度 ***********************************************/
  688. // 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
  689. // 为了通用, ADC输入为12bit的ADC值.
  690. // 电路和软件算法设计: Coody
  691. /**********************************************/

  692. #define                D_SCALE                10                //结果放大倍数, 放大10倍就是保留一位小数
  693. uint        get_temperature(uint adc)
  694. {
  695.         uint        code *p;
  696.         uint        i;
  697.         uchar        j,k,min,max;
  698.         
  699. //        adc = 1024 - adc;        //Rt接地
  700.         p = temp_table;
  701.         if(adc < p[0])                return (0xfffe);
  702.         if(adc > p[160])        return (0xffff);
  703.         
  704.         min = 0;                //-40度
  705.         max = 160;                //120度

  706.         for(j=0; j<5; j++)        //对分查表
  707.         {
  708.                 k = min / 2 + max / 2;
  709.                 if(adc <= p[k])        max = k;
  710.                 else                        min = k;
  711.         }
  712.                  if(adc == p[min])        i = min * D_SCALE;
  713.         else if(adc == p[max])        i = max * D_SCALE;
  714.         else        // min < temp < max
  715.         {
  716.                 while(min <= max)
  717.                 {
  718.                         min++;
  719.                         if(adc == p[min])        {i = min * D_SCALE;        break;}
  720.                         else if(adc < p[min])
  721.                         {
  722.                                 min--;
  723.                                 i = p[min];        //min
  724.                                 j = (adc - i) * D_SCALE / (p[min+1] - i);
  725.                                 i = min;
  726.                                 i *= D_SCALE;
  727.                                 i += j;
  728.                                 break;
  729.                         }
  730.                 }
  731.         }
  732.         return i;
  733. }
复制代码

所有资料51hei提供下载:
ds1302 4seg NTC 2K .zip (88.88 KB, 下载次数: 285)

评分

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

查看全部评分

回复

使用道具 举报

ID:413700 发表于 2018-11-4 23:03 | 显示全部楼层
怎么有这么多的警告?


错在哪里?
警告.png

回复

使用道具 举报

ID:420962 发表于 2018-11-5 12:11 | 显示全部楼层
我tb买了个类似的,想要源码改个功能
回复

使用道具 举报

ID:55211 发表于 2018-11-5 13:52 | 显示全部楼层
新佳影 发表于 2018-11-4 23:03
怎么有这么多的警告?

我看少添加ds1302.c文件
回复

使用道具 举报

ID:65956 发表于 2018-11-14 14:32 | 显示全部楼层
学习一下,借鉴一下
回复

使用道具 举报

ID:233051 发表于 2018-11-14 19:59 来自手机 | 显示全部楼层
stc15f204EA下载程序没反应什么问题线路正常,换了三个单片机都没反应,用别的单片机89c52rc下载能用,下载器340,软件用的6.86
回复

使用道具 举报

ID:55211 发表于 2018-11-19 07:20 | 显示全部楼层
CDCQQ 发表于 2018-11-14 19:59
stc15f204EA下载程序没反应什么问题线路正常,换了三个单片机都没反应,用别的单片机89c52rc下载能用,下载器3 ...

这个简单,你先写个简单的代码,试试 STC15F204EA单片机,能不能正常工作,再试试显示,一步一步来
回复

使用道具 举报

ID:364937 发表于 2018-11-22 16:30 | 显示全部楼层
感谢楼主分享,正式我需要的
回复

使用道具 举报

ID:62973 发表于 2019-5-1 16:36 | 显示全部楼层
下载学习一下;谢谢楼主分享!
回复

使用道具 举报

ID:171746 发表于 2019-5-14 11:49 | 显示全部楼层
下来学习
回复

使用道具 举报

ID:725316 发表于 2020-5-3 20:09 | 显示全部楼层
楼主你好!拟照做一个电子钟,下载了源程序但uV3编译不通过,请问是什么问题?
回复

使用道具 举报

ID:725316 发表于 2020-5-3 20:32 | 显示全部楼层
楼主您好,我是学习单片机和C语言的新手,我用uV3编译您的源代码总有错误或警告,请问有什么办法吗?
回复

使用道具 举报

ID:231936 发表于 2020-5-27 13:29 | 显示全部楼层
下载试试。
回复

使用道具 举报

ID:767459 发表于 2020-7-9 15:18 | 显示全部楼层
不错,正是我想要的。
回复

使用道具 举报

ID:669228 发表于 2020-9-22 11:56 | 显示全部楼层
帮助很大,谢谢
回复

使用道具 举报

ID:517951 发表于 2020-11-15 17:47 | 显示全部楼层
不错,值得学习。51hei有你更精彩!!
回复

使用道具 举报

ID:232619 发表于 2021-9-5 10:04 | 显示全部楼层
不错,值得学习。51hei有你更精彩
回复

使用道具 举报

ID:232619 发表于 2022-1-18 14:41 | 显示全部楼层
感谢楼主分享,正式我需要的
回复

使用道具 举报

ID:97678 发表于 2022-1-19 18:48 | 显示全部楼层
不错,好的。51hei有你更精彩!!
回复

使用道具 举报

ID:1003243 发表于 2022-2-11 20:47 来自手机 | 显示全部楼层
要是能把星期几也加上去循环显示在温度后面就好了
回复

使用道具 举报

ID:703640 发表于 2022-9-11 16:58 | 显示全部楼层
CK45NI)M3VKW3SZ%Z[~M`XR.png 请教一下STC15F204EA烧写时,IRC频率如何选择
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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