找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2139|回复: 0
收起左侧

ds1302与AD程序 第十一届蓝桥杯国赛一等奖源程序

[复制链接]
ID:626321 发表于 2020-11-18 19:13 | 显示全部楼层 |阅读模式
51hei.png

单片机源程序如下:
  1. #include"stc15f2k60s2.h"
  2. #include"ds1302.h"
  3. #include"onewire.h"
  4. #include"iic.h"

  5. #define u8 unsigned char
  6. #define u16 unsigned int

  7. code u8 dx[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  8. code u8 wx[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  9. void init_ct107d();
  10. void Timer0Init();
  11. void dig_display();
  12. void key_deal();
  13. void dig_deal();
  14. void led_deal();

  15. u8 sj[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

  16. u8 read_key_val();

  17. u8 dig_count=0;
  18. u8 key_read;
  19. u8 key_lock_20ms=0;
  20. u8 ds1302_ds200ms=0;
  21. u8 hour,min,sec;
  22. u8 show_mode=0;
  23. u8 change_mode=0;
  24. u8 parameter[3]={17,25,4};
  25. u8 change_parameter[3]={0};         


  26. u16 led_ds3s=0;
  27. u16 pcf8591_ds400ms=0;        
  28. u16 V;
  29. u16 temp;
  30. u16 ds18b20_ds1s=0;


  31. bit sys_mode=0;
  32. bit key_lock = 1;
  33. bit ds1302_key=1;
  34. bit ds18b20_key=1;
  35. bit led_ron;
  36. bit pcf8591_key=1;
  37. bit l1_sign=0,l2_sign=0;l3_sign=0;led_sign=0;
  38. bit led_ds_sign=0;



  39. void main()
  40. {
  41.         init_ct107d();
  42.         Timer0Init();
  43.         set_sfm(16,59,50);
  44.         while(1)
  45.         {
  46.                 //按键
  47.                 if(key_lock==1)
  48.                 {
  49.                         key_lock = 0;
  50.                         key_read = read_key_val();
  51.                         if(key_read!=0)
  52.                         {
  53.                                 key_deal();
  54.                         }
  55.                 }
  56.                 //时间
  57.                 if(ds1302_key==1)
  58.                 {
  59.                         hour = Read_Ds1302_Byte(0x85)/16*10+Read_Ds1302_Byte(0x85)%16;
  60.                         min = Read_Ds1302_Byte(0x83)/16*10+Read_Ds1302_Byte(0x83)%16;
  61.                         sec = Read_Ds1302_Byte(0x81)/16*10+Read_Ds1302_Byte(0x81)%16;
  62.                         ds1302_key=0;
  63.                         if(parameter[0]<8){if(hour<8&&hour>=parameter[0])l1_sign=1;else l1_sign=0;}
  64.                         else{if(hour>=parameter[0])l1_sign=1;else l1_sign=0;}
  65.                         led_deal();
  66.                 }
  67.                 //温度
  68.                 if(ds18b20_key==1)
  69.                 {
  70.                         temp = rd_temperature();
  71.                         if(temp<parameter[1]*100)l2_sign=1;
  72.                         else l2_sign=0;
  73.                         ds18b20_key=0;
  74.                         //led处理
  75.                         led_deal();
  76.                 }
  77.                 //电压
  78.                 if(pcf8591_key==1)
  79.                 {
  80.                         V=pcf8591_adc();
  81.                         V =  V/2.55*5;
  82.                         if(V>=200)
  83.                         {
  84.                                 if(led_ron==1){led_ron=0;led_ds3s=0;led_ds_sign=1;led_sign=0;}
  85.                                 else
  86.                                 {
  87.                                         if(led_ds_sign==0){led_ds3s=0;led_ds_sign=1;}        
  88.                                 }
  89.                         }
  90.                         else
  91.                         {
  92.                                 if(led_ron==0){led_ron=1;led_ds3s=0;led_ds_sign=1;led_sign=1;}
  93.                                 else
  94.                                 {
  95.                                         if(led_ds_sign==0){led_ds3s=0;led_ds_sign=1;}
  96.                                 }
  97.                         }
  98.                         pcf8591_key=0;
  99.                         led_deal();
  100.                 }
  101.                 //数码管处理
  102.                 dig_deal();
  103.         }
  104. }



  105. void init_ct107d()
  106. {
  107.         P0=0;
  108.         P2=(P2&0X1F)|0XC0;         //数码管
  109.         P2=(P2&0X1F)|0XA0;         //外设
  110.         P2=0;
  111.         P0=0XFF;
  112.         P2=(P2&0X1F)|0X80;                //led
  113.         P2=0;
  114. }

  115. void Timer0Init(void)                //1毫秒@12.000MHz
  116. {
  117.         AUXR &= 0x7F;                //定时器时钟12T模式
  118.         TMOD &= 0xF0;                //设置定时器模式
  119.         TMOD |= 0x01;                //设置定时器模式
  120.         TL0 = 0x18;                //设置定时初值
  121.         TH0 = 0xFC;                //设置定时初值
  122.         TF0 = 0;                //清除TF0标志
  123.         TR0 = 1;                //定时器0开始计时
  124.         ET0=1;
  125.         EA=1;
  126. }


  127. void time0() interrupt 1
  128. {
  129.         TL0 = 0x18;                //设置定时初值
  130.         TH0 = 0xFC;                //设置定时初值
  131.         dig_display();
  132.         //按键读取定时
  133.         key_lock_20ms++;
  134.         if(key_lock_20ms>=20)
  135.         {
  136.                 key_lock_20ms=0;
  137.                 key_lock=1;
  138.         }
  139.         //时钟定时
  140.         if(ds1302_key==0)
  141.         {
  142.                 ds1302_ds200ms++;
  143.                 if(ds1302_ds200ms>=200)
  144.                 {
  145.                         ds1302_ds200ms=0;
  146.                         ds1302_key=1;
  147.                 }        
  148.         }
  149.         //温度定时
  150.         if(ds18b20_key==0)
  151.         {
  152.                 ds18b20_ds1s++;
  153.                 if(ds18b20_ds1s>=1000)
  154.                 {
  155.                         ds18b20_ds1s=0;
  156.                         ds18b20_key=1;
  157.                 }        
  158.         }
  159.         //电压定时
  160.         if(pcf8591_key==0)
  161.         {
  162.                 pcf8591_ds400ms++;
  163.                 if(pcf8591_ds400ms>=400)
  164.                 {
  165.                         pcf8591_ds400ms=0;
  166.                         pcf8591_key=1;
  167.                 }        
  168.         }
  169.         //led3定时
  170.         if(led_ds_sign==1)
  171.         {
  172.                 led_ds3s++;
  173.                 if(led_ds3s>=3000)
  174.                 {
  175.                         led_ds_sign=0;
  176.                         led_ds3s=0;
  177.                         if(led_ron==0)l3_sign=0;
  178.                         else l3_sign=1;
  179.                         led_deal();
  180.                         TR1=0;
  181.                 }        
  182.         }
  183. }


  184. void dig_display()
  185. {
  186.         P0=0xff;P2=(P2&0X1F)|0XE0;P2=0;
  187.         P0=wx[dig_count];P2=(P2&0X1F)|0XC0;P2=0;
  188.         P0=sj[dig_count];P2=(P2&0X1F)|0XE0;P2=0;
  189.         dig_count++;
  190.         if(dig_count>7)dig_count=0;        
  191. }

  192. u8 read_key_val()
  193. {
  194.         static u8 key_state=0;
  195.         u8 key_new;
  196.         u8 key_val=0;
  197.         P44=0;P42=1;P35=1;P34=1;
  198.         key_new=P3;
  199.         P44=1;P42=0;
  200.         key_new=(key_new<<4)|(P3&0x0f);

  201.         switch(key_state)
  202.         {
  203.                 case(0):
  204.                         if(key_new!=0xff){key_state=1;}break;
  205.                 case(1):
  206.                         if(key_new==0xff){key_state=0;}
  207.                         else
  208.                         {
  209.                                 switch(~key_new)
  210.                                 {
  211.                                         case(0x80):key_val=4;break;
  212.                                         case(0x40):key_val=5;break;
  213.                                         case(0x08):key_val=8;break;
  214.                                         case(0x04):key_val=9;break;
  215.                                         default:key_val=0;break;
  216.                                 }
  217.                                 key_state=2;                                
  218.                         } break;
  219.                 case(2):if(key_new==0xff){key_state=0;}break;
  220.         }
  221.         return key_val;
  222. }

  223. void key_deal()
  224. {
  225.         u8 i;
  226.         switch(key_read)
  227.         {
  228.                 case(4):
  229.                         sys_mode=~sys_mode;
  230.                         if(sys_mode==0)for(i=0;i<3;i++){parameter[/font][i][font=Arial]=change_parameter[/font][i][font=Arial];ds18b20_key=1;pcf8591_key=1;ds1302_key=1;}
  231.                         else for(i=0;i<3;i++)change_parameter[/font][i][font=Arial]=parameter[/font][i][font=Arial];
  232.                         show_mode=0;   change_mode=0;
  233.                         break;
  234.                 case(5):
  235.                         if(sys_mode==0)
  236.                         {
  237.                                 show_mode++;
  238.                                 if(show_mode>=3)show_mode=0;
  239.                         }
  240.                         else
  241.                         {
  242.                                 change_mode++;
  243.                                 if(change_mode>=3)change_mode=0;
  244.                         }
  245.                         break;
  246.                 case(8):
  247.                         if(sys_mode==1)
  248.                         {
  249.                                 switch(change_mode)
  250.                                 {
  251.                                         case(0):
  252.                                                 if(change_parameter[0]!=0)change_parameter[0]--;
  253.                                                 else change_parameter[0]=23;
  254.                                                 break;
  255.                                         case(1):
  256.                                                 if(change_parameter[1]!=0)change_parameter[1]--;
  257.                                                 else change_parameter[1]=99;
  258.                                                 break;
  259.                                         case(2):
  260.                                                 if(change_parameter[2]!=4)change_parameter[2]--;
  261.                                                 else change_parameter[2]=8;
  262.                                                 break;
  263.                                 }
  264.                         }
  265.                         break;
  266.                 case(9):
  267.                         if(sys_mode==1)
  268.                         {
  269.                                 switch(change_mode)
  270.                                 {
  271.                                         case(0):
  272.                                                 if(change_parameter[0]!=23)change_parameter[0]++;
  273.                                                 else change_parameter[0]=0;
  274.                                                 break;
  275.                                         case(1):
  276.                                                 if(change_parameter[1]!=99)change_parameter[1]++;
  277.                                                 else change_parameter[1]=0;
  278.                                                 break;
  279.                                         case(2):
  280.                                                 if(change_parameter[2]!=8)change_parameter[2]++;
  281.                                                 else change_parameter[2]=4;
  282.                                                 break;
  283.                                 }
  284.                         }
  285.                         break;
  286.         }
  287. }

  288. void dig_deal()
  289. {
  290.         u8 i;
  291.         if(sys_mode==0)
  292.         {
  293.                 switch(show_mode)
  294.                 {
  295.                         case(0):
  296.                                 sj[0]=dx[hour/10];sj[1]=dx[hour%10];
  297.                                 sj[2]=0xbf;sj[5]=0xbf;
  298.                                 sj[3]=dx[min/10];sj[4]=dx[min%10];
  299.                                 sj[6]=dx[sec/10];sj[7]=dx[sec%10];
  300.                                 break;
  301.                         case(1):
  302.                                 sj[0]=0xc6;
  303.                                 for(i=1;i<5;i++)sj[/font][i][font=Arial]=0xff;
  304.                                 sj[5]=dx[temp%10000/1000];sj[6]=dx[temp%1000/100]&0x7f;
  305.                                 sj[7]=dx[temp%100/10];
  306.                                 break;
  307.                         case(2):
  308.                                 sj[0]=0x86;sj[1]=0xff;sj[5]=0xff;sj[6]=0xff;
  309.                                 sj[2]=dx[V%1000/100]&0x7f;  sj[3]=dx[V%100/10];        sj[4]=dx[V%10];
  310.                                 sj[7]=dx[led_ron];
  311.                                 break;
  312.                 }
  313.         }
  314.         else
  315.         {
  316.                 switch(change_mode)
  317.                 {
  318.                         case(0):
  319.                                 sj[0]=0x8c;sj[1]=dx[1];
  320.                                 for(i=2;i<6;i++)sj[/font][i][font=Arial]=0xff;
  321.                                 sj[6]=dx[change_parameter[0]/10];sj[7]=dx[change_parameter[0]%10];
  322.                                 break;
  323.                         case(1):
  324.                                 sj[0]=0x8c;sj[1]=dx[2];
  325.                                 for(i=2;i<6;i++)sj[/font][i][font=Arial]=0xff;
  326.                                 sj[6]=dx[change_parameter[1]/10];sj[7]=dx[change_parameter[1]%10];
  327.                                 break;
  328.                         case(2):
  329.                                 sj[0]=0x8c;sj[1]=dx[3];
  330.                                 for(i=2;i<6;i++)sj[/font][i][font=Arial]=0xff;
  331.                                 sj[6]=dx[change_parameter[2]/10];sj[7]=dx[change_parameter[2]%10];
  332.                                 break;
  333.                 }
  334.         }
  335. }

  336. void led_deal()
  337. {
  338.         u8 m;
  339.         m=0xff;
  340.         if(led_sign==1)
  341.         {
  342.                 switch(parameter[2])
  343.                 {
  344.                         case(4):m=0xf7;break;
  345.                         case(5):m=0xef;break;
  346.                         case(6):m=0xdf;break;
  347.                         case(7):m=0xbf;break;
  348.                         case(8):m=0x7f;break;
  349.                 }
  350.         }
  351.         if(l1_sign==1)m&=0xfe;
  352.         if(l2_sign==1)m&=0xfd;
  353.         if(l3_sign==1)m&=0xfb;
  354.         P0=m;
  355.         P2=(P2&0X1F)|0X80;
  356.         P2=0;
  357. }
复制代码


2.png

决赛.zip

450.95 KB, 下载次数: 35, 下载积分: 黑币 -5

题目+源程序

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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