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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2519|回復(fù): 9
收起左側(cè)

51單片機(jī)定時(shí)器C語(yǔ)言宏定義為什么設(shè)置這樣?

[復(fù)制鏈接]
ID:1055345 發(fā)表于 2022-12-11 17:55 | 顯示全部樓層 |閱讀模式
一個(gè)51單片機(jī)的定時(shí)器C語(yǔ)言程序,想問(wèn)一下,為什么時(shí)間和鬧鐘的時(shí)分秒是這樣定義的,還有這個(gè)99沒(méi)看懂
#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
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

代碼是這些,麻煩看一下
  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是任意一個(gè)數(shù),用于后面條件檢測(cè)
  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     //宏定義結(jié)束

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

  15. sbit duan_1 =P2^0;                   //雖然聲明是duan但是其實(shí)是用來(lái)位選的
  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燈用來(lái)指示設(shè)置的鬧鐘時(shí)間到

  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--);            //延時(shí)1ms   
  34. }

  35. void xianshi(uchar S,F,M)                   //時(shí)間和鬧鐘顯示函數(shù)
  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;}//和設(shè)置按鍵有關(guān),為了單獨(dú)顯示某一時(shí)或者分、秒。
  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;} //這是一個(gè)長(zhǎng)按進(jìn)入鬧鐘模式設(shè)置鍵
  61.                 }
  62.                 if(time<39999)       
  63.                 a++;
  64.         }
  65.         if(key2==0)                                                   //key2控制時(shí)間加
  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控制時(shí)間減
  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燈一個(gè)預(yù)設(shè)熄滅
  96.         TMOD=0x01; //工作方式1

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

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

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

  108. void nzhongled()                          //鬧鐘和時(shí)間一致時(shí)讓數(shù)碼管和D2一起在將近10秒內(nèi)頻閃不斷
  109. {
  110.         uint g;
  111.         for(g=0;g<23;g++)
  112.         {
  113.                 nzled=1;                                  //鬧鐘顯示燈開(kāi)始閃爍
  114.                 delayms(200);
  115.                 xianshi(XIANSHI);
  116.             nzled=0;
  117.                 delayms(200);
  118.                 xianshi(XIANSHI);
  119.                 BEEP=~BEEP;              //取反輸出到喇叭的信號(hào)
  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;//中斷關(guān)閉,時(shí)間停止
  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();         //鬧鐘與時(shí)間一致進(jìn)入nzhongled函數(shù)
  144.                        
  145.                 }

  146.         }
  147. }

  148. void zhongduan1() interrupt 1                //精確計(jì)時(shí)           定時(shí)器中斷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. //呼吸燈程序,具體體現(xiàn)為D1燈,
  172. //在proteus中無(wú)呼吸效果猜測(cè)是因?yàn)閜roteus模擬時(shí)每次刷新每幀是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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:332130 發(fā)表于 2022-12-13 12:27 | 顯示全部樓層
說(shuō)實(shí)話,寫(xiě)了好幾年的單片機(jī)了,這種宏定義頭一次見(jiàn),NB,學(xué)到了!之前都是用結(jié)構(gòu)體寫(xiě)的
回復(fù)

使用道具 舉報(bào)

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

你好,我還想問(wèn)一下,這段代碼是如何讓數(shù)碼管單獨(dú)顯示某一時(shí),或者分,或者秒的
回復(fù)

使用道具 舉報(bào)

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

2022-12-13_133403.png
回復(fù)

使用道具 舉報(bào)

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

我網(wǎng)上查了,這個(gè)P0的調(diào)用是對(duì)數(shù)碼管進(jìn)行消影用的,我還是沒(méi)搞清楚他如何使時(shí),分,秒單獨(dú)顯示
回復(fù)

使用道具 舉報(bào)

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

感謝回復(fù)講解
回復(fù)

使用道具 舉報(bào)

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

謝謝回復(fù),剛看懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人在线网址 | 中文一区二区 | 欧美一区二区三区小说 | 怡红院成人在线视频 | 国产精品区一区二区三 | 精品一区二区免费视频 | 三级在线观看 | 亚洲欧洲在线视频 | 黄色免费av | 久久国产欧美一区二区三区精品 | 91大神新作在线观看 | 日韩成人高清 | 国产精品视频入口 | 人妖一区 | 色伊人网 | 久久亚洲一区二区三区四区 | 美女天天操 | 午夜影视免费片在线观看 | 精品欧美乱码久久久久久 | 91亚洲欧美 | 91精品国产综合久久婷婷香蕉 | 国产午夜视频 | 另类 综合 日韩 欧美 亚洲 | 夜夜艹天天干 | 天天综合网天天综合 | 丁香六月激情 | 一区二区三区欧美 | 国产亚洲人成a在线v网站 | 久久久一区二区三区 | 蜜臀91视频| 久久黄色网 | 精品国产一区二区三区免费 | 国产 日韩 欧美 制服 另类 | 亚洲欧洲成人在线 | 在线国产一区 | 久久久2o19精品| 色视频在线观看 | 中文字幕免费在线 | 免费看91| ririsao久久精品一区 | 国产伦精品一区二区 |