久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1804|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 嫩草视频在线看 | 黄色毛片在线观看 | 玖玖国产精品视频 | 欧美成人hd| 亚欧洲精品在线视频免费观看 | 九九av| 99精品久久久国产一区二区三 | 精品国产高清一区二区三区 | 色一情一乱一伦一区二区三区 | 欧美日韩专区 | 亚洲女优在线播放 | 91免费观看在线 | 日韩一区二区三区av | 亚洲视频在线观看 | 91亚洲国产成人精品一区二三 | 日韩福利一区 | 午夜精品久久久久久 | 在线精品一区 | 紧缚调教一区二区三区视频 | 91在线第一页 | 成人精品毛片国产亚洲av十九禁 | 在线观看视频一区二区三区 | 婷婷不卡 | 欧美另类视频 | 中文在线观看视频 | 美国一级黄色片 | 国产一级片精品 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 欧美性视频在线播放 | 91精产国品一二三区 | 香蕉久久网 | 蜜臀久久99精品久久久久久宅男 | 日韩有码在线播放 | 亚洲成人免费 | 天天综合久久 | 欧美一区2区三区3区公司 | 伊人网在线播放 | 在线日韩精品视频 | 久草新在线| 成人在线不卡 | 一区二区在线 |