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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2519|回復: 9
收起左側

51單片機定時器C語言宏定義為什么設置這樣?

[復制鏈接]
ID:1055345 發表于 2022-12-11 17:55 | 顯示全部樓層 |閱讀模式
一個51單片機的定時器C語言程序,想問一下,為什么時間和鬧鐘的時分秒是這樣定義的,還有這個99沒看懂
#define SHISHE shi,99,99
#define FENSHE 99,fen,99
#define MIAOSHE 99,99,miao
#define NAO_S nao_s,99,99         
#define NAO_F 99,nao_f,99
#define NAO_M 99,99,nao_m

圖像 001.png
回復

使用道具 舉報

ID:883242 發表于 2022-12-12 12:59 | 顯示全部樓層
這里面什么都也看不出來,要看引用這些宏定義的代碼。
回復

使用道具 舉報

ID:1055345 發表于 2022-12-12 21:11 | 顯示全部樓層
Hephaestus 發表于 2022-12-12 12:59
這里面什么都也看不出來,要看引用這些宏定義的代碼。

代碼是這些,麻煩看一下
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #define ulong unsigned long
  5. #define XIANSHI shi,fen,miao  
  6. #define SHISHE shi,99,99         //99是任意一個數,用于后面條件檢測
  7. #define FENSHE 99,fen,99
  8. #define MIAOSHE 99,99,miao
  9. #define NAO_S nao_s,99,99           //鬧鐘的宏
  10. #define NAO_F 99,nao_f,99
  11. #define NAO_M 99,99,nao_m     //宏定義結束

  12. sbit key1=P3^0;                                   //定義按鍵所連51單片機的引腳
  13. sbit key2=P3^1;
  14. sbit key3=P3^2;

  15. sbit duan_1 =P2^0;                   //雖然聲明是duan但是其實是用來位選的
  16. sbit duan_2 =P2^1;
  17. sbit duan_3 =P2^2;
  18. sbit duan_4 =P2^3;
  19. sbit duan_5 =P2^4;
  20. sbit duan_6 =P2^5;
  21. sbit huxiled=P2^6;                  //呼吸燈
  22. sbit nzled=P3^3;                  //D2燈用來指示設置的鬧鐘時間到

  23. sbit BEEP=P1^5;

  24. uchar shijian[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};         

  25. uchar shi,fen,miao,nao_s=0,nao_f=0,nao_m=15,num_1=0,num_2=0,b=1,c=0;
  26. uchar a=0,n=0;

  27.                                           
  28.                        
  29. void delayms(uint x)                        
  30. {
  31.         uint a,b;
  32.         for(a=x;a>0;a--)
  33.                 for(b=110;b>0;b--);            //延時1ms   
  34. }

  35. void xianshi(uchar S,F,M)                   //時間和鬧鐘顯示函數
  36. {
  37.         uchar shi_1,shi_2,fen_1,fen_2,miao_1,miao_2;

  38.         shi_1=S/10;shi_2=S%10;
  39.         fen_1=F/10;fen_2=F%10;
  40.         miao_1=M/10;miao_2=M%10;
  41.        
  42.         if(S==99) {shi_1=10;shi_2=10;}//和設置按鍵有關,為了單獨顯示某一時或者分、秒。
  43.         if(F==99) {fen_1=10;fen_2=10;}
  44.         if(M==99) {miao_1=10;miao_2=10;}

  45.         duan_1=1;P0=shijian[shi_1];delayms(5);duan_1=0;          //位選
  46.         duan_2=1;P0=shijian[shi_2];delayms(5);duan_2=0;
  47.         duan_3=1;P0=shijian[fen_1];delayms(5);duan_3=0;
  48.         duan_4=1;P0=shijian[fen_2];delayms(5);duan_4=0;
  49.         duan_5=1;P0=shijian[miao_1];delayms(5);duan_5=0;
  50.         duan_6=1;P0=shijian[miao_2];delayms(5);duan_6=0;


  51. }

  52. void keyscan()
  53. {
  54.         uint time=0;
  55.         if(key1==0)
  56.         {
  57.                 while(!key1)
  58.                 {
  59.                         time++;
  60.                         if(time>40000){a=5;break;} //這是一個長按進入鬧鐘模式設置鍵
  61.                 }
  62.                 if(time<39999)       
  63.                 a++;
  64.         }
  65.         if(key2==0)                                                   //key2控制時間加
  66.         {

  67.                 delayms(90);

  68.                 if(key2==0)
  69.                 {
  70.                         if(a==1) {delayms(90);shi++;if(shi==24) shi=0;}       
  71.                         if(a==2) {delayms(90);fen++;if(fen==60) fen=0;}
  72.                         if(a==3) {delayms(90);miao++;if(miao==60) miao=0;}

  73.                         if(a==6) {delayms(90);nao_s++;if(nao_s==24) nao_s=0;}
  74.                         if(a==7) {delayms(90);nao_f++;if(nao_f==60) nao_f=0;}
  75.                         if(a==8) {delayms(90);nao_m++;if(nao_m==60) nao_m=0;}
  76.                 }while(!key2);
  77.         }
  78.         if(key3==0)                                                  //key3控制時間減
  79.         {
  80.                 delayms(90);
  81.                 if(key3==0)
  82.                 {
  83.                         if(a==1) {delayms(90);shi--;if(shi>=0&&shi<24);else shi=23;}
  84.                         if(a==2) {delayms(90);fen--;if(fen>=0&&fen<60);else fen=59;}
  85.                         if(a==3) {delayms(90);miao--;if(miao>=0&&miao<60);else miao=59;}

  86.                         if(a==6) {delayms(90);nao_s--;if(nao_s>=0&&nao_s<24);else nao_s=23;}
  87.                         if(a==7) {delayms(90);nao_f--;if(nao_f>=0&&nao_f<60);else nao_f=59;}
  88.                         if(a==8) {delayms(90);nao_m--;if(nao_m>=0&&nao_m<60);else nao_m=59;}       
  89.                 }while(!key3);
  90.         }
  91.         if(a==4||a==9){a=0;}                         //歸零
  92. }

  93. void init()
  94. {
  95.         nzled=0;   //給D2燈一個預設熄滅
  96.         TMOD=0x01; //工作方式1

  97.         TH0=0x4C;  //定時器T0  定時19ms
  98.         TL0=0x00;
  99.         ET0=1;
  100.         ET1=1;

  101.         TH1=0xc0; //定時器T1   定時56ms
  102.         TL1=0x00;
  103.         ET0=1;
  104.         ET1=1;
  105.         TR1=1;

  106.         EA=1;         //總中斷
  107. }

  108. void nzhongled()                          //鬧鐘和時間一致時讓數碼管和D2一起在將近10秒內頻閃不斷
  109. {
  110.         uint g;
  111.         for(g=0;g<23;g++)
  112.         {
  113.                 nzled=1;                                  //鬧鐘顯示燈開始閃爍
  114.                 delayms(200);
  115.                 xianshi(XIANSHI);
  116.             nzled=0;
  117.                 delayms(200);
  118.                 xianshi(XIANSHI);
  119.                 BEEP=~BEEP;              //取反輸出到喇叭的信號
  120.                        
  121.                
  122.         }       
  123. }

  124. void main()
  125. {
  126.        
  127.         init();
  128.         while(1)
  129.         {       
  130.                 switch(a)
  131.                 {       
  132.                         case 0:TR0=1;keyscan();xianshi(XIANSHI);break;
  133.                         case 1:TR0=0;keyscan();xianshi(SHISHE);break;//中斷關閉,時間停止
  134.                         case 2:keyscan();xianshi(FENSHE);break;
  135.                         case 3:keyscan();xianshi(MIAOSHE);break;
  136.                         case 5:;
  137.                         case 6:keyscan();xianshi(NAO_S);break;
  138.                         case 7:keyscan();xianshi(NAO_F);break;
  139.                         case 8:keyscan();xianshi(NAO_M);break;
  140.                 }
  141.                 if(a==0&&(nao_s==shi&&nao_f==fen&&nao_m==miao))
  142.                 {
  143.                         nzhongled();         //鬧鐘與時間一致進入nzhongled函數
  144.                        
  145.                 }

  146.         }
  147. }

  148. void zhongduan1() interrupt 1                //精確計時           定時器中斷T0
  149. {
  150.         TH0=0x4C;
  151.         TL0=0x00;
  152.         num_1++;
  153.         if(num_1==20)
  154.         {
  155.                 num_1=0;
  156.                 miao++;
  157.                 if(miao==60)
  158.                 {
  159.                         miao=0;
  160.                         fen++;
  161.                         if(fen==60)
  162.                         {
  163.                                 fen=0;
  164.                                 shi++;
  165.                                 if(shi==24) shi=0;       
  166.                         }
  167.                 }
  168.         }
  169. }

  170. void zhongduan2() interrupt 3       
  171. //呼吸燈程序,具體體現為D1燈,
  172. //在proteus中無呼吸效果猜測是因為proteus模擬時每次刷新每幀是0.05秒太久

  173. {
  174.         TH1=0xc0;
  175.         TL1=0x00;
  176.         num_2++;
  177.         if(b<=6)
  178.         {
  179.                 if(num_2<b) huxiled=1;
  180.                 else huxiled=0;
  181.         }
  182.         else
  183.         {
  184.                 if((num_2+6)<b) huxiled=0;
  185.                 else huxiled=1;       
  186.         }
  187.         if(num_2==6)
  188.         {
  189.                 num_2=0;c++;
  190.                 if(c==4)
  191.                 {
  192.                         b++;c=0;
  193.                         if(b==13) b=0;
  194.                 }
  195.         }
  196. }
復制代碼
回復

使用道具 舉報

ID:77589 發表于 2022-12-13 10:53 | 顯示全部樓層
首先,要明白宏是在編譯之前,編譯器按照宏定義作替換。既然是這樣,去替換一下就明白了啊!
把xianshi(XIANSHI);替換下就成了xianshi(shi,fen,miao); 其中shi,fen,miao不是程序中定義的全局變量嗎?這就是正常顯示時間啊。
把xianshi(SHISHE);替換下就成了xianshi(shi,99,99); 一下就明白是正常顯示小時,把分鐘和秒鐘顯示成99。
剩下的自己分析..........
回復

使用道具 舉報

ID:332130 發表于 2022-12-13 12:27 | 顯示全部樓層
說實話,寫了好幾年的單片機了,這種宏定義頭一次見,NB,學到了!之前都是用結構體寫的
回復

使用道具 舉報

ID:1055345 發表于 2022-12-13 13:06 | 顯示全部樓層
Longan.Wang 發表于 2022-12-13 10:53
首先,要明白宏是在編譯之前,編譯器按照宏定義作替換。既然是這樣,去替換一下就明白了啊!
把xianshi(XI ...
  1. if(S==99) {shi_1=10;shi_2=10;}//和設置按鍵有關,為了單獨顯示某一時或者分、秒。
  2.         if(F==99) {fen_1=10;fen_2=10;}
  3.         if(M==99) {miao_1=10;miao_2=10;}
復制代碼

你好,我還想問一下,這段代碼是如何讓數碼管單獨顯示某一時,或者分,或者秒的
回復

使用道具 舉報

ID:161164 發表于 2022-12-13 13:35 | 顯示全部樓層
muchenxi 發表于 2022-12-13 13:06
你好,我還想問一下,這段代碼是如何讓數碼管單獨顯示某一時,或者分,或者秒的

2022-12-13_133403.png
回復

使用道具 舉報

ID:1055345 發表于 2022-12-13 19:35 | 顯示全部樓層

我網上查了,這個P0的調用是對數碼管進行消影用的,我還是沒搞清楚他如何使時,分,秒單獨顯示
回復

使用道具 舉報

ID:1055345 發表于 2022-12-14 14:43 | 顯示全部樓層
Longan.Wang 發表于 2022-12-13 10:53
首先,要明白宏是在編譯之前,編譯器按照宏定義作替換。既然是這樣,去替換一下就明白了啊!
把xianshi(XI ...

感謝回復講解
回復

使用道具 舉報

ID:1055345 發表于 2022-12-14 14:45 | 顯示全部樓層

謝謝回復,剛看懂
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人精品 | 中文字幕在线一区 | 天天av综合| 亚洲天堂一区二区 | 欧美极品视频 | 三级视频网站 | 国产高清视频一区 | 黄色片网站国产 | 中文字幕在线免费观看 | 亚洲精品久久久一区二区三区 | 毛片99| 一区欧美 | 欧美日韩精品在线一区 | 在线视频91| 欧美三级电影在线播放 | 国产精品不卡 | 日韩视频1 | 日本免费一区二区三区 | 在线免费观看欧美 | 精品国产一区二区三区久久久四川 | 在线观看av网站永久 | 欧美日韩亚 | av一级一片| 97国产在线视频 | 日韩av在线一区二区 | 免费观看av| 日韩精品在线一区 | 在线欧美小视频 | 在线观看国产wwwa级羞羞视频 | 特黄毛片视频 | 国产精品看片 | 一级大片免费 | 国产精品夜色一区二区三区 | 欧美午夜一区 | 男人的天堂一级片 | 久久久久国产一区二区三区不卡 | 久久性色 | 欧美激情精品久久久久 | 国产视频中文字幕在线观看 | 成人精品网 | 日本韩国电影免费观看 |