找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管显示万年历 日期 时间 NTC温度显示ADC0832 程序仿真

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


花了两天时间弄出来的,希望能帮到你们

单片机源程序如下:

  1. #include<reg52.h>  //  包含51单片机寄存器定义的头文件;
  2. #include <intrins.h>
  3. #include <math.h>
  4. sbit P20=P2^0;
  5. sbit P21=P2^1;
  6. sbit P22=P2^2;
  7. sbit P23=P2^3;
  8. sbit P24=P2^4;
  9. sbit P25=P2^5;
  10. sbit P26=P2^6;
  11. sbit P27=P2^7;
  12. sbit P30=P3^0;
  13. sbit P31=P3^1;
  14. sbit P32=P3^2;
  15. sbit P33=P3^3;
  16. sbit P34=P3^4;
  17. sbit P35=P3^5;

  18. sbit hoursetting=P1^1;
  19. sbit minsetting=P1^2;
  20. sbit monthsetting=P1^3;
  21. sbit yearsetting=P1^4;
  22. sbit CS   = P3^6;//ADC0832 PIN1
  23. sbit Clk = P1^7;//ADC0832 PIN7
  24. sbit DATI = P3^7;//ADC0832 PIN5
  25. sbit DATO = P3^7;//ADC0832 PIN6
  26. unsigned int  Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管显示0~9的段码表
  27. //unsigned int  Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管显示0~9的段码表
  28. /*******************************共阴LED段码表*******************************/

  29. unsigned char code temptab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  30. /*******************************定义全局变量********************************/
  31. unsigned char dat = 0x00;      //AD值
  32. unsigned char count = 0x00;      //定时器计数
  33. unsigned char CH;       //通道变量
  34. unsigned char dis[4];       //显示数值
  35. unsigned int sum=0;

  36. unsigned int sec_time;        //记录中断次数
  37. unsigned char second,min,hour,year,month,day;        //储存秒


  38. //数组下标就是对应温度
  39. code unsigned char Temp_adc[]={
  40. 196,        194,        191,        189,        186,        184,        181,        179,        176,        173,        170,        168,       
  41. 165,        162,        159,        157,        154,        151,        148,        145,        142,        139,        136,        132,       
  42. 129,        126,        123,        117,        114,        113,        112,        110,        109,        106,        104,        101,       
  43. 99,        96,        94,        91,        89,        87,        84,        82,        80,        78,        76,        74,        71,        70,        68,        66,        64,        62,       
  44. 60,        59,        57,        55,        54,        52,        51,        49,        48,        47,        45,        44,        43,        41,        40,        39,        38,        37,       
  45. 36,        35,        34,        33,        32,        31,        30,        29,        28,        27,        27,        26,        25,        24,        24,        23,        22,        22,       
  46. 21,        21,        20,        20,        19,        18,        18,        17,        17,        16,        16, 15,        15,        14,        14, 13,        13,        12,
  47. 12,        11,        11,        10,        10,        9,        9,        8, 8,        7,        7,        6,        6, 5,        5,        4,        4,        3,        3,
  48. 2,        2,        1,        1};


  49. //查找相近值,并返回下标
  50. unsigned char Find_data(unsigned char *a,unsigned char x,unsigned char len)
  51. {
  52.         unsigned char i,min,r=0;
  53.        
  54.         min=abs(*a-x);
  55.         for(i=0;i<len;i++)
  56.         {
  57.                 if(abs(a[i]-x)<min)
  58.                 {
  59.                         min=abs(a[i]-x);
  60.                         r=i;
  61.                 }
  62.         }
  63.        
  64.         return r;
  65. }
  66. /****************************************************************************
  67. 函数功能:AD转换子程序
  68. 入口参数:CH
  69. 出口参数:dat
  70. ****************************************************************************/
  71. unsigned char adc0832(unsigned char CH)
  72. {
  73.       unsigned char i,test,adval;
  74.            unsigned char m;  
  75.      adval = 0x00;
  76.      test = 0x00;
  77.      Clk = 0;       //初始化
  78.      DATI = 1;
  79.     _nop_();
  80.     CS = 0;
  81.     _nop_();
  82.     Clk = 1;
  83.    _nop_();


  84.    if ( CH == 0x00 )      //通道选择
  85.    {
  86.        Clk = 0;
  87.        DATI = 1;      //通道0的第一位
  88.        _nop_();
  89.       Clk = 1;
  90.         _nop_();
  91.         Clk = 0;
  92.       DATI = 0;      //通道0的第二位
  93.       _nop_();
  94.       Clk = 1;
  95.       _nop_();
  96.     }
  97.     else
  98.     {
  99.        Clk = 0;
  100.     DATI = 1;      //通道1的第一位
  101.       _nop_();
  102.       Clk = 1;
  103.       _nop_();
  104.       Clk = 0;
  105.       DATI = 1;      //通道1的第二位
  106.     _nop_();
  107.      Clk = 1;
  108.      _nop_();
  109.    }

  110.       Clk = 0;
  111.       DATI = 1;
  112.     for( i = 0;i < 8;i++ )      //读取前8位的值
  113.     {
  114.        _nop_();
  115.        adval <<= 1;
  116.        Clk = 1;
  117.        _nop_();
  118.        Clk = 0;
  119.        if (DATO)
  120.           adval |= 0x01;
  121.       else
  122.           adval |= 0x00;
  123.     }
  124.       for (i = 0; i < 8; i++)      //读取后8位的值
  125.       {
  126.            test >>= 1;
  127.            if (DATO)
  128.               test |= 0x80;
  129.            else
  130.               test |= 0x00;
  131.           _nop_();
  132.           Clk = 1;
  133.           _nop_();
  134.           Clk = 0;
  135.       }
  136.       if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  137.        dat = test;
  138.        nop_();
  139.        CS = 1;        //释放ADC0832
  140.        DATO = 1;
  141.        Clk = 1;
  142.                        
  143.        return dat;
  144.                
  145. }

  146. /***********************************************************************
  147. 函数功能:快速动态扫描延时,延时约0.6毫秒
  148. ************************************************************************/
  149. void delay(void)
  150. {
  151.   unsigned int i;
  152.   for(i=0;i<80;i++)
  153.         ;
  154. }


  155. /******************************************************************
  156. 函数功能:显示计数次数的子程序
  157. 入口参数:x
  158. ********************************************************************/
  159.   void Display(second,min,hour,year,month,day,unsigned char temperature)
  160. {   
  161. P0=temptab[temperature%100/10];      
  162.    
  163.     if(temperature>9)
  164.     {P34=0;  }           
  165. ……………………

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

Keil代码与Proteus仿真下载:
数码管显示万年历_时间_日期_NTC温度221211.7z (127.47 KB, 下载次数: 38)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:297903 发表于 2022-12-15 08:34 | 只看该作者
好资料,谢谢分享!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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