标题: 应广单片机制作的计时器秒表程序 [打印本页]

作者: JiaNg06    时间: 2021-12-27 16:55
标题: 应广单片机制作的计时器秒表程序
芯片:应广 PMS154C
一个按键,一个8位数码管
1位天/2位小时/2位分钟/2位秒/1位0.1秒
我发现论坛上关于 应广单片机 的资料少的可怜,应该是没多少人用过吧。我发一个我以前写的8数码管计时器秒表程序。
因为我直接用的仿真器,所以没有实物,直接拍的开发板照片。如果有其他的需要,我还可以发发其他的应广单片机程序。比如,流水灯,数码管,PWM之类的。

制作出来的实物图如下:


单片机源程序如下:


  1. /*秒表计时显示程序?1个按键、8位数码管
  2.         数码管显示: 1位天/2位小时/2位分钟/2位秒/1位0.1秒
  3.         请用T16计时
  4.         按键按第一次:开始计数显示
  5.         按键按第二次:暂停计数显示
  6.         长按按键1秒:定时器清零,并停止计数。*/


  7. #include        "extern.h"
  8. #define data PB
  9. #define wei_A PA.6//位
  10. #define duan_B PA.7//段
  11. #define key pa.3
  12. word    time,b,n;
  13. byte duan,wei,keysignal,keysignal2,type;
  14. byte second_01,second,second_10,minute,minute_10,hour,hour_10,day,hour_24;
  15. //                0.1s        /1s                /10s         1分         10分        1小时 /10小时/天/小时
  16. word reload_T16;

  17. void        weiTable(void)
  18. {
  19.         _Pcadd
  20.         {
  21.                 ret                0xfe;//第一位         1111 1110
  22.                 ret         0xfd;//第二位         1111 1101
  23.                 ret                0xfb;//3                1111 1011
  24.                 ret         0xf7;//4                1111 0111
  25.                 ret                0xef;//5                1110 1111
  26.                 ret         0xdf;//6                1101 1111
  27.                 ret                0xbf;//7                1011 1111
  28.                 ret         0x7f;//8                 0111 1111
  29.         }
  30. }

  31. void        duanTable(void)//8位共阴极数码管 段码
  32. {
  33.         _Pcadd
  34.         {
  35.                 ret                0x3f;//0                //无小数点
  36.                 ret         0x06;//1
  37.                 ret                0x5b;//2
  38.                 ret         0x4f;//3
  39.                 ret                0x66;//4
  40.                 ret         0x6d;//5
  41.                 ret                0x7d;//6
  42.                 ret         0x07;//7
  43.                 ret                0x7f;//8
  44.                 ret         0x6f;//9

  45.                 ret                0xbf;//0                //带小数点
  46.                 ret         0x86;//1
  47.                 ret                0xdb;//2
  48.                 ret         0xcf;//3
  49.                 ret                0xe6;//4
  50.                 ret         0xed;//5
  51.                 ret                0xfd;//6
  52.                 ret         0x87;//7
  53.                 ret                0xff;//8
  54.                 ret         0xef;//9
  55.                
  56.         }
  57. }

  58. void T16_Init(void)                //t16中断
  59. {
  60.         //        $ T16M IHRC,/16,bit10;        
  61. //        reload_T16 = 1024-1000;        //每次进中断为1ms;
  62.                                 //计算公式为        [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(16M/16)]*(24)=0.001s
  63.         $ T16M IHRC,/16,bit15;        
  64.         reload_T16 = 32768-1000;        //每次进中断为1ms;
  65.         //        设定INTEN、INTRQ的初始值
  66.         INTEN.T16 = 1;                                //开T16中断
  67.         INTRQ.T16 = 0;                                //清零INTRQ寄存器。
  68.         ENGINT;                                                //打开全局中断
  69. }

  70. void leddis(void)                //查表显示
  71. {
  72.         
  73.         data = 0x00;        //去重影
  74.         duan_B = 1;
  75.         duan_B = 0;

  76.         A = wei;                //取位码
  77.         weiTable();
  78.         data = A;
  79.         wei_A = 1;
  80.         wei_A = 0;

  81.         A = duan;                //取段码
  82.         duanTable();
  83.         data = A;
  84.         duan_B = 1;
  85.         duan_B = 0;
  86. }

  87. void keyscan(void)                //按键扫描
  88. {
  89.         if(pa.3==0)                                
  90.         {
  91.                 .delay 10000
  92.                
  93.                 if(pa.3==0)
  94.                 {        if(pa.3==0)
  95.                         {        while(pa.3==0)               
  96.                                 {
  97.                                         n++;
  98.                                         .delay 1000;
  99.                                         if(n>=1000)                //长按1s清零
  100.                                         {        n=0;
  101.                                                 keysignal2=1;
  102.                                                 break;
  103.                                         }
  104.                                 }
  105.                                 keysignal++;        
  106.                                 if(keysignal>2)
  107.                                 {
  108.                                         keysignal=1;
  109.                                 }
  110.                         }
  111.                 }
  112.         }
  113.         if(keysignal==1)                                //按键1开始
  114.         {
  115.                 type=1;
  116.                 n=0;
  117.         }
  118.         if(keysignal==2)                                //按键2暂停        
  119.         {
  120.                 type=0;
  121.                 n=0;
  122.         }
  123.         if(keysignal2==1)                                //长按清零        
  124.         {                keysignal=2;
  125.                         time=0;
  126.                         second_01=1;                        //0.1秒
  127.                         second=1;                                //秒
  128.                         second_10=1;                        //10秒
  129.                         minute=1;                                //分
  130.                         minute_10=1;                        //10分
  131.                         hour=1;                                        //小时
  132.                         hour_10=1;                                //10时
  133.                         day=1;                                        //天
  134.                         hour_24=1;                                //24小时
  135.                         keysignal2=0;
  136.                         type=0;
  137.                         while(pa.3==0){nop;}
  138.         }

  139. }

  140. void        FPPA0 (void)
  141. {
  142.         .ADJUST_IC        SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;
  143.         T16_Init();
  144.         paph=0b1111_1111;                        //启用Pa端口的,上拉电阻
  145.         pac=0b1110_0110;                        //开启pa.0,pa.3,pa.4输入功能
  146.         pbc=0xff;                                //设置Pb口为输出功能
  147.         pb=0xff;                                //设置Pb口全部输出高电平

  148.         time=0;
  149.         wei=8;
  150.         second_01=1;                //0.1秒
  151.         second=1;                        //秒
  152.         second_10=6;                //10秒
  153.         minute=10;                        //分
  154.         minute_10=6;                //10分
  155.         hour=4;                                //小时
  156.         hour_10=3;                        //10时
  157.         day=9;                                //天
  158.         hour_24=23;                        //24小时
  159.         duan=1;
  160.         keysignal=0;
  161.         keysignal2=0;
  162.         n=0;
  163.         type=0;
  164.         
  165.         while (1)
  166.         {        
  167.                 keyscan();
  168.         }
  169. }

  170. void        Interrupt (void)//T16
  171. {
  172.         pushaf;

  173.         if (Intrq.T16)
  174.         {        stt16 reload_T16;                //设定计数器初始值reload_T16
  175.                 if(type==1)                                //按键控制计时启停
  176.                 {
  177.                         time++;
  178.                 }
  179.                 leddis();
  180.                 b++;
  181.                 if(b>8)
  182.                 {b=0;}
  183.                 if(time>=100)//0.1s
  184.                                 {        time=0;
  185.                                         second_01++;
  186.                                         if(second_01>10)                                                        //1s
  187.                                         {        second_01=1;second++;                                        //秒归零,进10s                                                
  188.                                                 if(second>10)//10s
  189.                                                 {        second=1;second_10++;                                //10秒归零,进分钟                                                        
  190.                                                         if(second_10>6)//1M
  191.                                                         {        second_10=1;minute++;                        //分钟归零,进10分                                                               
  192.                                                                 if(minute>10)//10m
  193.                                                                 {        minute=1;minute_10++;                //10分归零,进1h                                                                        
  194.                                                                         if(minute_10>6)//1h
  195.                                                                         {        minute_10=1;        
  196.                                                                                 hour++;
  197.                                                                                 hour_24++;                                //1h归零,进10h                                                                        
  198.                                                                                 if(hour>10)//10h
  199.                                                                                 {        hour=1;        hour_10++;        //10h>20h
  200.                                                                                 }
  201.                                                                                 if(hour_24>=24)//1day        //24小时归零,进天
  202.                                                                                 {        hour_10=1;                        //10小时清零
  203.                                                                                         hour_24=1;                        //24小时清零
  204.                                                                                         hour=1;                                //小时清零
  205.                                                                                         day++;                                //天加
  206.                                                                                         if(day>10)                        //10天清零
  207.                                                                                         {day=1;second_01=1;}//天归零        
  208.                                                                                 }
  209.                                                                         }
  210.                                                                 }
  211.                                                         }
  212.                                                 }
  213.                                         }
  214.                                 }
  215.                 switch(b)
  216.        {                  
  217.           case 0:         
  218.                                 duan=second_01;                //0.1秒
  219.                                 wei=8;
  220.                         break;   
  221.           case 1:
  222.                                 duan=second+10;                //1s
  223.                                 wei=7;
  224.                         break;
  225.           case 2:
  226.                                 duan=second_10;                //10s
  227.                                 wei=6;
  228.                         break;
  229.           case 3:
  230.                                 duan=minute+10;                //分
  231.                                 wei=5;
  232.                         break;
  233.           case 4:
  234.                                 duan=minute_10;                //10分
  235.                                 wei=4;
  236.                         break;
  237.           case 5:
  238.                                 duan=hour+10;                //时
  239.                                 wei=3;
  240.                         break;
  241.           case 6:
  242.                                 duan=hour_10;                //10小时
  243.                                 wei=2;
  244.                         break;
  245.           case 7:
  246.                                 duan=day+10;                //天
  247.                                 wei=1;
  248.                         break;
  249.           default:break;     
  250.          }        
  251.                
  252.                 Intrq.T16        =        0;
  253.         }

  254.         popaf;
  255. }
复制代码
以上代码下载: T0510 1个按键、8位数码管秒表计时.7z (13.84 KB, 下载次数: 47)

作者: electmo    时间: 2023-6-2 23:18
楼主,也在学习应广的单片机,我想pms150c写一个程序,如软件检测系统:当第3脚检测到高电平后,第6脚输出高电平,在6脚输出高后,第5脚检测NTC,温度检测功能,若5脚检测到温度高于57度后,第6脚由高电平变低电平,当温度降低到45度后,第6脚再输出高电平。当第3脚为低电平时,关闭所有功能。

51hei截图20230602231639.jpg (50.37 KB, 下载次数: 45)

51hei截图20230602231639.jpg

作者: 量子工业    时间: 2023-6-16 08:49
时分秒,6位数码管,实现倒计时调整,调整好时间后,I接收信号开始倒计时,倒计时至00.00.00结束,O端输出一个信号带继电器负载;当输入端再次接收到信号,倒计时重新开始,不用再次调整时间;
用最小系统方便弄吗
作者: yangnay    时间: 2023-12-2 10:21
electmo 发表于 2023-6-2 23:18
楼主,也在学习应广的单片机,我想pms150c写一个程序,如软件检测系统:当第3脚检测到高电平后,第6脚输出 ...

这个是proteus吧,能仿真应广的单片机吗?
作者: yangnay    时间: 2023-12-2 11:02
electmo 发表于 2023-6-2 23:18
楼主,也在学习应广的单片机,我想pms150c写一个程序,如软件检测系统:当第3脚检测到高电平后,第6脚输出 ...

这个是proteus吧?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1