找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助:4片595加51想做99:59的倒数计时器 单片机程序问题

[复制链接]
跳转到指定楼层
楼主
汇编不会写 仿照999改了个99:59的倒数计时器 也没用keil 课上一直只讲汇编 生成hex装载单片机在proteus仿真 结果也不对 我也不知道从何下手改程序 求大神帮改改程序!或者有汇编版的倒数计时器带注释能看懂的share一下也行!不知道咱们这里可不可以悬赏!

单片机源程序如下:
  1. #include <reg51.h>  
  2. sbit RCK=P1^7;
  3. sbit K1=P1^6;
  4. sbit K2=P1^5;     
  5. sbit K3=P1^4;     
  6. bit  K0=0;
  7. unsigned char ms05=0;
  8. unsigned int s=0;
  9. unsigned char code c[10]=
  10. {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
  11. void disp4();
  12. void up()
  13. {
  14.   unsigned char n=0;
  15.   unsigned int t;
  16.   if(s!=9959)s++;
  17.   else s=0;
  18.   disp4();
  19.   for(t=0;t<2000;t++);
  20.   while (K2==0){
  21.     for(t=0;t<2000;t++)
  22.     n++;
  23.     if (n==10){ n=9;
  24.       if (s!=999)s++;
  25.       else s=0;
  26.       disp3();}}
  27. }
  28. void down()
  29. {
  30.   unsigned char n=0;
  31.   unsigned int t;
  32.   if(s!=0)s--;
  33.   else s=999;
  34.   disp3();
  35.   for(t=0;t<20000;t++);
  36.   while (K3==0){
  37.     for(t=0;t<2000;t++)
  38.     n++;
  39.     if (n==10){ n=9;
  40.       if (s!=0)s--;
  41.       else s=999;
  42.       disp4();}}
  43. }
  44. void main()
  45. {
  46. TMOD=0x02;
  47. SCON=0;
  48. TH0=0x06;TL0=0x06;
  49. IP=0x01;
  50. IT0=1;
  51. IE=0x83;
  52. disp4();
  53. while(1){
  54. while(K1==1);
  55. if((K2==0)&(K3!=0))
  56.   up();
  57. if((K3==0)&(K2!=0))
  58.   down();}
  59. }
  60. void t0()interrupt 1{
  61. ms05++;
  62. if(ms05==200){ms05=0;
  63.   if(s!=0)s--;
  64. else{s=0;
  65.   TR0=0;}
  66.   disp4();}}
  67. void int0()interrupt 0{
  68. if(K1!=0){
  69. K0=!K0;
  70. if(K0==1)TR0=1;
  71. else TR0=0;}
  72. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2019-11-18 14:19 | 只看该作者
你的disp4()和disp3()是什么鬼
回复

使用道具 举报

板凳
ID:245004 发表于 2019-11-18 18:06 | 只看该作者
想问下你们都是从哪里学习的写c语言代码?




这些明显的漏洞本该通过良好的书写习惯避免。

好像应该先把代码整理一遍,该注释的地方注释一下,然后弄不明白的话再和网友交流互相学习,可能比较快解决问题。

回复

使用道具 举报

地板
ID:213173 发表于 2019-11-19 14:37 | 只看该作者
设置范围00分01秒~99分59秒倒计时
99:59倒计时+仿真.zip (117.12 KB, 下载次数: 14)



  1. #include <reg51.h>
  2. #include <intrins.h>
  3. //宏定义
  4. #define uchar  unsigned char
  5. #define uint   unsigned int
  6. #define key_S 20                                        //宏定义短按(20ms)
  7. #define key_L 500                                        //宏定义长按(0.5s)
  8. #define key_M 300                                        //宏定义连按间隔(0.2s)

  9. sbit P_HC595_SER   = P2^0;
  10. sbit P_HC595_SRCLK = P2^1;
  11. sbit P_HC595_RCLK  = P2^2;
  12. sbit k1=P1^0;
  13. sbit k2=P1^1;
  14. sbit k3=P1^2;
  15. sbit k4=P1^3;
  16. sbit OUT=P3^7;
  17. sbit buzz=P3^5;

  18. unsigned char code SEG7[]={//共阴数码管段码"0~f-."
  19.                 0x3f,0x06,0x5b,0x4f,
  20.                 0x66,0x6d,0x7d,0x07,
  21.                 0x7f,0x6f,0x77,0x7c,
  22.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  23. uchar num[]={1,2,3,4};
  24. uint Cnt_1ms=0,flash=0,count=0;
  25. uchar Choice,Cnt250us=0;
  26. uchar set=0;
  27. char Cnt_sec=0,Cnt_min=0,sec=0,min=0;
  28. bit sign=0,buzzer=0;
  29. bit flag=0;

  30. void Timer0Init()//250微秒@12.000MHz
  31. {
  32.         TMOD |= 0x02;                //设置定时器模式
  33.         TL0 = 0x06;                //设置定时初值
  34.         TH0 = 0x06;                //设置定时重载值
  35.         TR0 = 1;                //定时器0开始计时
  36.         EA  = 1;
  37.         ET0 = 1;
  38. }
  39. //显示控制
  40. void dispaly()
  41. {
  42.         if(set==0)//正常显示
  43.         {
  44.                 num[3]=SEG7[min/10%10];//显示分十位
  45.                 num[2]=SEG7[min%10]|0x80;//显示分个位加点
  46.                 num[1]=SEG7[sec/10%10];//显示秒十位
  47.                 num[0]=SEG7[sec%10];//显示秒个位
  48.         }
  49.         else        //设置显示
  50.         {
  51.                 num[3]=SEG7[Cnt_min/10%10];//显示分十位
  52.                 if(flag==1 && set==1)
  53.                         num[2]=SEG7[Cnt_min%10]|0x80;//显示分个位加点
  54.                 else
  55.                         num[2]=SEG7[Cnt_min%10];//显示分个位
  56.                 num[1]=SEG7[Cnt_sec/10%10];//显示秒十位
  57.                 if(flag==1 && set==2)
  58.                         num[0]=SEG7[Cnt_sec%10]|0x80;//显示秒个位加点
  59.                 else
  60.                         num[0]=SEG7[Cnt_sec%10];//显示秒个位
  61.         }
  62. }
  63. /**************** 向HC595发送一个字节函数 ******************/
  64. void Send_595(uchar dat)
  65. {               
  66.         uchar i;
  67.         for(i=0;i<8;i++)
  68.         {
  69.                 dat <<= 1;
  70.                 P_HC595_SER  = CY; //溢出位赋值数据输出端
  71.                 P_HC595_SRCLK = 1; //移位时钟
  72.                 P_HC595_SRCLK = 0;
  73.         }
  74. }
  75. /**************** 向HC595发送四个字节函数 ******************/
  76. void DisplayScan()
  77. {       
  78.         uchar j;
  79.         for(j=0;j<4;j++)
  80.         {
  81.                 Send_595(num[j]);//向HC595发送一个字节
  82.         }
  83.         P_HC595_RCLK = 1;//锁存输出数据
  84.         P_HC595_RCLK = 0;
  85. }

  86. //按键扫描
  87. void key_scan()
  88. {
  89.         static bit key1_sign,key4_sign;                        //按键自锁标志变量
  90.         static uint count1,count2,count3=0,count4=0;//消抖计数变量                       

  91.         if(k1==0 && Choice==0)                                                //检测按键1按下与K4互锁
  92.         {
  93.                 count1++;                                        //消抖计数1自+1
  94.                 if((count1>=key_S)&&(key1_sign==0))//检测消抖计数与按键1自锁标志
  95.                 {                       
  96.                         key1_sign=1;                        //按键1自锁标志置1
  97.                         set++;
  98.                         if(set==3)                        //0:正常倒计时 1:设置分钟 2:设置秒钟
  99.                         {
  100.                                 set=0;
  101.                                 Cnt250us=0;
  102.                                 Cnt_1ms=0;
  103.                                 sec=Cnt_sec;
  104.                                 min=Cnt_min;
  105.                         }
  106.                 }
  107.         }
  108.         else
  109.         {
  110.                 key1_sign=0;                                //按键1自锁标志清0
  111.                 count1=0;                                        //消抖计数count1清0
  112.         }

  113.         if(set!=0)                                                //调整时间
  114.         {                               
  115.                 if(!k2)                                                        //检测按键2按下   
  116.                 {  
  117.                         count2++;  
  118.                         if(count2>=key_L)                        //长按快调
  119.                         {
  120.                                 if(set==1)
  121.                                 {
  122.                                         if(Cnt_min<99)
  123.                                                 Cnt_min++;
  124.                                 }
  125.                                 if(set==2)
  126.                                 {
  127.                                         if(Cnt_sec<59)
  128.                                                 Cnt_sec++;
  129.                                 }
  130.                                 count2=key_M;
  131.                         }
  132.                 }  
  133.                 else                                                        //按键抬起
  134.                 {  
  135.                         if(count2>key_S && count2<key_L)//短按
  136.                         {
  137.                                 if(set==1)
  138.                                 {
  139.                                         if(Cnt_min<99)
  140.                                                 Cnt_min++;
  141.                                 }
  142.                                 if(set==2)
  143.                                 {
  144.                                         if(Cnt_sec<59)
  145.                                                 Cnt_sec++;
  146.                                 }
  147.                         }
  148.                         count2=0;                                        //count2清0
  149.                 }   
  150.                 if(!k3)                                                        //检测按键3按下
  151.                 {  
  152.                         count3++;  
  153.                         if(count3>=key_L)                        //长按快调
  154.                         {
  155.                                 if(set==1)
  156.                                 {
  157.                                         if(Cnt_min>0)
  158.                                                 Cnt_min--;
  159.                                 }
  160.                                 if(set==2)
  161.                                 {
  162.                                         if(Cnt_sec>0)
  163.                                                 Cnt_sec--;
  164.                                 }
  165.                                 count3=key_M;
  166.                         }
  167.                 }  
  168.                 else                                                        //按键抬起
  169.                 {  
  170.                         if(count3>key_S && count3<key_L)//短按
  171.                         {
  172.                                 if(set==1)
  173.                                 {
  174.                                         if(Cnt_min>0)
  175.                                                 Cnt_min--;
  176.                                 }
  177.                                 if(set==2)
  178.                                 {
  179.                                         if(Cnt_sec>0)
  180.                                                 Cnt_sec--;
  181.                                 }
  182.                         }
  183.                         count3=0;                                        //count3清0
  184.                 }   
  185.         }
  186.         if(k4==0 && set==0)                        //检测按键4按下与k1互锁
  187.         {
  188.                 count4++;                                        //消抖计数4自+1
  189.                 if((count4>=key_S)&&(key4_sign==0))//检测消抖计数与按键4自锁标志                               
  190.                 {                       
  191.                         key4_sign=1;                        //按键4自锁标志置1
  192.                         if(sec|min!=0)                        //设置的时间必须大于0秒,否则不启动
  193.                         {
  194.                                 Choice++;
  195.                                 if(Choice==1)                        //开始       
  196.                                 {
  197.                                         OUT=0;
  198.                                         Cnt_1ms=0;
  199.                                 }
  200.                                 if(Choice==2)                        //停止
  201.                                         OUT=1;
  202.                                 if(Choice>=3)                        //复位
  203.                                 {
  204.                                         Choice=0;
  205.                                         Cnt250us=0;
  206.                                         Cnt_1ms=0;
  207.                                         sec=Cnt_sec;
  208.                                         min=Cnt_min;
  209.                                 }
  210.                         }
  211.                 }
  212.         }
  213.         else
  214.         {
  215.                 key4_sign=0;                                //按键4自锁标志清0
  216.                 count4=0;                                        //消抖计数count4清0
  217.         }
  218. }

  219. void Alarm()//报警
  220. {
  221.         if(sign==1 && min==0 && sec==0)
  222.         {
  223.                 sign=0;
  224.                 OUT=1;//停止输出
  225.                 Choice=0;
  226.                 buzzer=1;
  227.         }
  228.         if(buzzer)
  229.         {
  230.                 buzz=~buzz;//蜂鸣器取反
  231.                 count++;
  232.                 if(count>=3000)
  233.                 {
  234.                         count=0;
  235.                         buzzer=0;
  236.                         buzz=1;
  237.                         Cnt_1ms=0;
  238.                         sec=Cnt_sec;
  239.                         min=Cnt_min;
  240.                 }
  241.         }
  242. }

  243. //-----------------------
  244. void main()   
  245. {       
  246.         Timer0Init();
  247.         sec=Cnt_sec;
  248.         min=Cnt_min;
  249.         OUT=1;
  250.         buzz=1;
  251.         while(1)
  252.         {
  253.                 dispaly();//显示控制
  254.                 DisplayScan();//显示刷新       
  255.         }
  256. }
  257. void Timer0Interrupt(void) interrupt 1
  258. {
  259.         Alarm();//报警
  260.         if(++flash>=1000)
  261.         {
  262.                 flash=0;
  263.                 flag=~flag;//闪烁标志取反
  264.         }
  265.         if(++Cnt250us>=4)//1ms
  266.         {
  267.                 Cnt250us=0;
  268.                 key_scan();        //按键扫描                         

  269.                 if(Choice==1)//启动倒计时
  270.                 {
  271.                         Cnt_1ms++;               
  272.                         if(Cnt_1ms>=1000)
  273.                         {
  274.                                 Cnt_1ms=0;
  275.                                 sec--;
  276.                                 if(sec<0)
  277.                                 {
  278.                                         min--;
  279.                                         sec=59;
  280.                                 }
  281.                                 if(min==0)
  282.                                         sign=1;
  283.                         }
  284.                 }
  285.         }
  286. }
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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