找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ce单片机综合实验程序

[复制链接]
跳转到指定楼层
楼主
ID:345838 发表于 2018-6-6 00:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机综合实验源程序如下:
  1. #include<reg52.h>
  2. #include "disp.h"
  3. #include "text.h"
  4. #include "readkey.h"
  5. uint  code pulse_tab[100]={//脉冲数
  6.                                                 213, 224, 235, 246, 258, 270, 283, 296, 310, 324,
  7.                                                 339, 354, 370, 387, 404, 421, 439, 458, 477, 497,
  8.                                                 518, 539, 561, 583, 606, 630, 654, 680, 705, 731,
  9.                                                 758, 786, 814, 843, 873, 903, 934, 965, 997,1030,
  10.                                                 1063,1097,1131,1166,1202,1238,1274,1311,1348,1386,
  11.                                                 1424,1463,1502,1542,1581,1621,1662,1702,1743,1784,
  12.                                                 1825,1867,1908,1950,1991,2033,2075,2116,2158,2200,
  13.                                                 2241,2283,2324,2365,2406,2447,2487,2527,2567,2607,
  14.                                                 2646,2686,2724,2763,2801,2838,2876,2913,2949,2985,
  15.                                                 3020,3056,3090,3124,3158,3191,3224,3256,3288,3319};
  16. //uchar code tab[]={0x4f,0xbf,0xdf,0xef,0xf4,0xfb,0xfd,0xfe,0xff};//串行口
  17. void work_0();//时钟模块
  18. void work_1();//时间设置模块
  19. void work_2();//闹钟时间设置模块
  20. void work_3();//温度显示模块
  21. void rkey();//矩阵键盘按键解释
  22. //void work_4();
  23. void init();//初始化函数
  24. void Delay();//延时函数

  25. void init()
  26. {
  27.         TMOD=0x51; //T1作计数器        T0作定时器 工作方式1
  28.         SCON=0X00;
  29. //        TCON=0x00;
  30.         TH0=0xf0;
  31.         TL0=0x60;
  32.         TR0=1;
  33.         msta=0;
  34. //        cnt1=0;
  35.         xs=0;
  36. //        buf0=0;
  37.         num4=1;//时钟显示初始值
  38.         num3=4;
  39.         num2=3;
  40.         num1=0;
  41.         nz4=1; //闹钟初始值
  42.         nz3=4;
  43.         nz2=3;
  44.         nz1=1;

  45. }

  46. void main()
  47. {         
  48.         init();
  49.         while(1)
  50.         {
  51.                 while(!TF0);
  52.                 TH0=0xF0;
  53.                 TL0=0x60;
  54.                 TF0=0;
  55.                 readkey();
  56.                 disp(light,num4,num3,num2,num1);                                       
  57.                 switch(msta)
  58.                 {        
  59.                         case 0:                        
  60.                                 work_0();
  61.                                 break;
  62.                         case 1:                        
  63.                                 work_1();
  64.                                 break;
  65.                         case 2:                        
  66.                                 work_2();
  67.                                 break;
  68.                          case 3:                        
  69.                                 work_3();
  70. //                        case 4:                        
  71. //                                work_4();
  72. //                                break;
  73.                         default:break;
  74.                 }
  75.         }                        
  76. }        

  77. void work_0()  //时钟模块
  78. {
  79.     light=18;

  80.            mcnt1++;
  81.         if(nz1==num1 && nz2==num2 && nz3==num3 && nz3==num3&&dp_1==1)//到设定闹钟的时间
  82.         { //串行数码管显示“三”
  83.          SBUF = 0x6d;
  84. //         flon=1;
  85. //     tzsta++;
  86. //         if(tzsta>=4)
  87. //         tzsta=0;
  88.         }
  89.         else
  90.         {
  91.         SBUF =0xff;
  92. //         flon=0;
  93.         }
  94.         if(mcnt1>=125)//500ms到
  95.                 {
  96.                 dp_1^=1;
  97.                 a++;
  98.                 mcnt1=0;
  99.                 }

  100.                 if(a>120) //1s到
  101.                   {a=0;
  102.                    num1++; //秒满60,秒归零,向分进位
  103.                         if(num1>=0x0a)                        
  104.                         {num1=0;
  105.                          num2++;
  106.                           if(num2>=0x06)
  107.                           {num2=0;                 //分满60,分归零,
  108.                            if(num4<2)        //时的十位在小于2区间,即十位为0或为1时
  109.                                 {num3++;        //时的个位可取0到9,即可以从0加到9
  110.                                  if(num3>=0x0a)
  111.                                  {num3=0;         //时的个位满10,归零,向十位进一
  112.                                  num4++;
  113.                                  }
  114.                                 }
  115.                            else                        //当十位大于等于2时
  116.                                 {num3++;         //时的个位正常增加
  117.                                  if(num3>=0x05)        //直到时的个位因分为60进1,由4变为5的瞬间
  118.                                  {num1=num2=num3=num4=0; //各个显示位都被置零
  119.                                  }
  120.                                 }
  121.                           }
  122.                      }
  123.                    }

  124.       
  125.         if(sw1)//跳转时间设置模块
  126.         {
  127.         msta=1;
  128.         flon=1;
  129.         dp_1=1;
  130.         }
  131.         if(K9) //跳转闹钟设置模块
  132.         {
  133.         msta=2;
  134.         num11=num1;//存储当前时间
  135.         num22=num2;
  136.         num33=num3;
  137.         num44=num4;
  138.         }
  139.         if(sw2)//跳转温度计模块
  140.         {
  141.         msta=3;
  142.         flon=0;        
  143.         dp_1=0;
  144.         num11=num1;        //存储当前时间
  145.         num22=num2;
  146.         num33=num3;
  147.         num44=num4;
  148.         }               
  149.         
  150. }        
  151. void work_1()  //时间设置
  152. {   
  153.         light=19;

  154.         if(sw1)//跳转时钟模块
  155.         {
  156.         msta=0;
  157.         flon=0;
  158.         }
  159.         if(K9) //跳转闹钟设置模块
  160.         {
  161.         msta=2;
  162.         num11=num1;//存储当前时间
  163.         num22=num2;
  164.         num33=num3;
  165.         num44=num4;
  166.         }

  167.         if(K11)//选择闪控位
  168.         {
  169.          tzsta++;
  170.          if(tzsta>=4)
  171.          tzsta=0;               
  172.         }
  173.         if(K10)
  174.         {
  175.          switch(tzsta)//设置
  176.        {
  177.         case 0: num1++;
  178.                                 if(num1>=0x0a)
  179.                                 num1=0;
  180.                        break;
  181.                 case 1: num2++;
  182.                                 if(num2>=0x06)
  183.                                 num2=0;
  184.                        break;
  185.                 case 2: num3++;
  186.                                 if(num3>=0x0a)
  187.                                 num3=0;
  188.                        break;
  189.                 case 3: num4++;
  190.                                 if(num4>=0x06)
  191.                                 num4=0;
  192.                        break;
  193.                 default: break;                                
  194.                 }
  195.     }
  196. }

  197. void work_2() //闹钟设置
  198. {
  199.         light=20;
  200.         num1=nz1;
  201.         num2=nz2;
  202.         num3=nz3;
  203.         num4=nz4;
  204.         if(sw1)        //跳转时钟模块
  205.         {        
  206.          msta=0;
  207.          flon=0;
  208.          num1=num11;
  209.          num2=num22;
  210.          num3=num33;
  211.          num4=num44;
  212.         }
  213.           if(K11)
  214.         {
  215.          tzsta++;
  216.          if(tzsta>=4)
  217.          tzsta=0;               
  218.         }

  219.         rkey();
  220.         switch(tzsta)//设置
  221.        {
  222.         case 0: if(K10)
  223.                                 {nz1=xs;
  224.                                 num1=xs;}
  225.                        break;
  226.                 case 1: if(K10)
  227.                                 {nz2=xs;
  228.                                 num2=xs;}
  229.                        break;
  230.                 case 2: if(K10)
  231.                                 {nz3=xs;
  232.                                 num3=xs;}
  233.                        break;
  234.                 case 3: if(K10)
  235.                                 {nz4=xs;
  236.                                 num4=xs;}
  237.                        break;
  238.                 default: break;                                
  239.                 }
  240. }   

  241. void work_3()//显示温度
  242. {
  243.           uint a,b;
  244.      light=21;

  245.                          pulse_cnt++;//脉冲时间计数
  246.                 if(pulse_cnt>=25)
  247.                 {        
  248.                         pulse_cnt=0;
  249.                         TR1=0;                                                         
  250.                         t_1=TH1;
  251.                         t_0=TL1;
  252.                         TH1=TL1=0;
  253.                         TR1=1;         
  254.                 }
  255.                 tt=(t_1<<8)+t_0;

  256.      if(tt>pulse_tab[x])x++;
  257.          else
  258.      if(tt<=pulse_tab[x-1]&&x!=0)x--;
  259.                         
  260.             a=tt-pulse_tab[x];
  261.             b=pulse_tab[x]-tt;
  262.                
  263.                 if(b<=a)y=x-1;
  264.                 else y=x;
  265.                
  266.                 num4=16;  //显示温度
  267.                 num3=y/10;
  268.                 num2=y%10;
  269.                 num1=12;

  270.                 if(sw2)        //返回时钟模块
  271.                 {
  272.                 msta=0;
  273.                 num1=num11;
  274.                 num2=num22;
  275.                 num3=num33;
  276.                 num4=num44;
  277.                 }
  278. //                if(K0)        //脉冲数测试
  279. //                {
  280. //        num4=buf2/1000;
  281. //        num3=buf2%1000/100;         
  282. //        num2=buf2%100/10;
  283. //        num1=buf2%10;
  284. //        }
  285. }

  286. //void work_4()
  287. //{        mcnt1++;
  288. //        light=18;
  289. //         SBUF = 0x6d;
  290. //        flon=1;
  291. //     tzsta++;
  292. //         if(tzsta>=4)
  293. //         tzsta=0;
  294. //   if(mcnt1>=125)//500ms到
  295. //                {
  296. //                dp_1^=1;
  297. //                a++;
  298. //                mcnt1=0;
  299. //                }
  300. //
  301. //                if(a>120) //1s到
  302. //                  {a=0;
  303. //                   num1++; //秒满60,秒归零,向分进位
  304. //                        if(num1>=0x0a)                        
  305. //                        {num1=0;
  306. //                         num2++;
  307. //                          if(num2>=0x06)
  308. //                          {num2=0;                 //分满60,分归零,
  309. //                           if(num4<2)        //时的十位在小于2区间,即十位为0或为1时
  310. //                                {num3++;        //时的个位可取0到9,即可以从0加到9
  311. //                                 if(num3>=0x0a)
  312. //                                 {num3=0;         //时的个位满10,归零,向十位进一
  313. //                                 num4++;
  314. //                                 }
  315. //                                }
  316. //                           else                        //当十位大于等于2时
  317. //                                {num3++;         //时的个位正常增加
  318. //                                 if(num3>=0x05)        //直到时的个位因分为60进1,由4变为5的瞬间
  319. //                                 {num1=num2=num3=num4=0; //各个显示位都被置零
  320. //                                 }
  321. //                                }
  322. //                          }
  323. //                     }
  324. //                   }
  325. //        if(K8)
  326. //        {
  327. //        msta=0;
  328. //        flon=0;
  329. //        SBUF =0xff;
  330. //        }
  331. //        if(sw1)//跳转时间设置模块
  332. //        {
  333. //        msta=1;
  334. //        flon=1;
  335. //        dp_1=1;
  336. //        }
  337. //        if(K9) //跳转闹钟设置模块
  338. //        {
  339. //        msta=2;
  340. //        num11=num1;//存储当前时间
  341. //        num22=num2;
  342. //        num33=num3;
  343. //        num44=num4;
  344. //        }
  345. //        if(sw2)//跳转温度计模块
  346. //        {
  347. //        msta=3;
  348. //        flon=0;        
  349. //        dp_1=0;
  350. //        num11=num1;        //存储当前时间
  351. //        num22=num2;
  352. //        num33=num3;
  353. //        num44=num4;
  354. //        }
  355. //         
  356. //         
  357. //}

  358. void rkey()        //矩阵键盘扫描按键解释
  359. {
  360.         if(K0)xs=0;
  361.         if(K1)xs=1;
  362.         if(K2)xs=2;
  363.         if(K3)xs=3;
  364.         if(K4)xs=4;
  365.         if(K5)xs=5;
  366.         if(K6)xs=6;
  367.         if(K7)xs=7;
  368.         if(K8)xs=8;
  369.         if(K9)xs=9;
  370. }

  371. void Delay(uint x)
  372. {
  373. uint i,j;
  374. for(i=0;i<x;i++)
  375.    for(j=0;j<100;j++);
  376. }
复制代码

所有资料51hei提供下载:
ce综合.rar (68.45 KB, 下载次数: 5)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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