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

QQ登錄

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

帖子
查看: 1174|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)程序 想要加兩個(gè)按鍵切換流水燈模式,沒(méi)加明白,請(qǐng)高人指點(diǎn),謝謝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1105755 發(fā)表于 2024-4-14 16:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
新手求助:有兩種流水燈形式,想要在單片機(jī)P1^5和P1^4口加兩個(gè)按鍵切換流水燈模式,按鍵程序搞半天也沒(méi)整明白,請(qǐng)高人指點(diǎn),謝謝!第一個(gè):
  1. #include <reg51.h>                        //包含頭文件
  2. #include <stdlib.h>                        //庫(kù)文件,使用隨機(jī)數(shù)發(fā)生函數(shù)

  3. typedef unsigned char uchar; //無(wú)符號(hào)字符型數(shù)據(jù)
  4. typedef unsigned int  uint;         //無(wú)符號(hào)整型數(shù)據(jù)

  5. sbit ST=P3^2;        //74HC595寄存器輸入端口
  6. sbit Key1=P1^6;        //按鍵開(kāi)始
  7. sbit Key2=P1^7;        //按鍵停止

  8. bit flag=0;                //定時(shí)時(shí)間標(biāo)志位
  9. uchar num[5];        //產(chǎn)生的隨機(jī)數(shù)
  10. uchar num1[2];
  11. uchar cnt;                //計(jì)數(shù)變量
  12. uchar str[5]= {0xff,0xff,0xff,0xff,0xff};         //定義數(shù)組存放35個(gè)LED數(shù)據(jù)
  13. uchar str1[2]= {0xff,0xff};                                        //定義數(shù)組存放12個(gè)LED數(shù)據(jù)

  14. void Delay_Us(int i);                //延時(shí)函數(shù)
  15. void Timer_Init(void);                //定時(shí)器初始化
  16. void UART_Init(void);                //串口初始化
  17. void UART_Send(uchar dat);        //串口發(fā)送數(shù)據(jù)
  18. //主函數(shù)
  19. void main(void)
  20. {
  21.     uchar i,j,k;                        //定義變量
  22.     UART_Init();                           //串口初始化
  23.     Timer_Init();                           //定時(shí)器初始化
  24.     for(i=0; i<5; i++)          //循環(huán)5次發(fā)送數(shù)據(jù)
  25.     {   //35個(gè)LED初始狀態(tài),全部熄滅
  26.         UART_Send(str[i]);
  27.     }
  28.     P1=0xff;                          //12個(gè)LED初始狀態(tài),全部熄滅
  29.     P2=0xff;
  30.     while(1)
  31.     {
  32.         if(flag)         //定時(shí)時(shí)間到
  33.         {
  34.             flag=0;         //標(biāo)志位清零
  35.             /*----35抽取5個(gè)LED-----*/
  36.             for(i=0; i<5; i++)         //所有燈熄滅
  37.             {
  38.                 str[i]=0xff;
  39.             }
  40.             for(i=0; i<5; i++)
  41.             {
  42.                 k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
  43.                 for(j=0; j<i ; j++)
  44.                 {
  45.                     while(num[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  46.                     {
  47.                         k=rand()%35;
  48.                     }
  49.                 }
  50.                 num[i]=k;
  51.                 str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  52.             }
  53.             for(i=0; i<5; i++)          //循環(huán)5次發(fā)送數(shù)據(jù)
  54.             {
  55.                 UART_Send(str[i]);
  56.             }
  57.             /*----12抽取2個(gè)LED-----*/
  58.             str1[0]=0xff;                          //12個(gè)LED全部熄滅
  59.             str1[1]=0xff;
  60.             for(i=0; i<2; i++)
  61.             {
  62.                 k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
  63.                 for(j=0; j<i ; j++)
  64.                 {
  65.                     while(num1[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  66.                     {
  67.                         k=rand()%12;
  68.                     }
  69.                 }
  70.                 num1[i]=k;
  71.                 str1[num1[i]/8]&=~(0x01<<(num1[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  72.             }
  73.             P1=str1[1];                          //控制12個(gè)LED點(diǎn)亮
  74.             P2=str1[0];
  75.         }
  76.         if(Key1==0)        //按鍵開(kāi)始
  77.         {
  78.             Delay_Us(1000);        //延時(shí)消抖
  79.             if(Key1==0)
  80.             {
  81.                 TR0=1;
  82.             }
  83.             while(Key2==0);        //按鍵松手檢測(cè)
  84.         }
  85.         if(Key2==0)        //按鍵停止
  86.         {
  87.             Delay_Us(1000);        //延時(shí)消抖
  88.             if(Key2==0)
  89.             {
  90.                 TR0=0;
  91.                 /*----35抽取5個(gè)LED-----*/
  92.                 for(i=0; i<5; i++) //所有燈熄滅
  93.                 {
  94.                     str[i]=0xff;
  95.                 }
  96.                 for(i=0; i<5; i++)
  97.                 {
  98.                     k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
  99.                     for(j=0; j<i ; j++)
  100.                     {
  101.                         while(num[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  102.                         {
  103.                             k=rand()%35;
  104.                         }
  105.                     }
  106.                     num[i]=k;
  107.                     str[num[i]/8]&=~(0x01<<(num[i]%8));        //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  108.                 }
  109.                 for(i=0; i<5; i++)          //循環(huán)5次發(fā)送數(shù)據(jù)
  110.                 {
  111.                     UART_Send(str[i]);
  112.                 }
  113.                 /*----12抽取2個(gè)LED-----*/
  114.                 str1[0]=0xff;                          //12個(gè)LED全部熄滅
  115.                     str1[1]=0xff;
  116.                 for(i=0; i<2; i++)
  117.                 {
  118.                     k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
  119.                     for(j=0; j<i ; j++)
  120.                     {
  121.                         while(num1[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  122.                         {
  123.                             k=rand()%12;
  124.                         }
  125.                     }
  126.                     num1[i]=k;
  127.                     str1[num1[i]/8]&=~(0x01<<(num1[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  128.                 }
  129.                 P1=str1[1];                          //控制12個(gè)LED點(diǎn)亮
  130.                 P2=str1[0];
  131.             }
  132.             while(Key2==0);        //按鍵松手檢測(cè)
  133.         }
  134.     }
  135. }
  136. //延時(shí)函數(shù)
  137. void Delay_Us(int i)
  138. {
  139.     while(i--);
  140. }
  141. //定時(shí)器初始化
  142. void Timer_Init(void)
  143. {
  144.     TMOD|=0x01; //打開(kāi)定時(shí)器0,1,工作方式1。
  145.     TH0=0x3c;        //給定時(shí)器0賦初值,定時(shí)50ms
  146.     TL0=0xb0;
  147.     ET0=1;      //打開(kāi)定時(shí)器0中斷允許
  148.     TR0=0;                //打開(kāi)定時(shí)器
  149.     PS=1;
  150.     EA=1;       //打開(kāi)總中斷
  151. }
  152. //串口初始化
  153. void UART_Init(void)
  154. {
  155.     SM0=0;                //串口模式0:同步移位寄存器方式
  156.     SM1=0;
  157.     TI=0;                //發(fā)送中斷清零
  158. }
  159. //串口發(fā)送數(shù)據(jù),移位寄存器模式
  160. void UART_Send(uchar dat)
  161. {
  162.     ST=0;
  163.     SBUF=dat;          //LED數(shù)據(jù)
  164.     while(~TI);                 //等待發(fā)送完成
  165.     TI=0;                        //標(biāo)志位清零
  166.     ST=1;
  167.     ST=0;
  168. }
  169. //定時(shí)器0中斷函數(shù)
  170. void Timer0() interrupt 1
  171. {
  172.     TH0=0x3c;   //定時(shí)50ms
  173.     TL0=0xb0;
  174.     cnt++;                //中斷計(jì)數(shù)
  175.     if(cnt==6)
  176.     {
  177.         cnt=0;
  178.         flag=1;        //標(biāo)志位置1
  179.     }
  180. }
復(fù)制代碼

第二個(gè):
  1. #include <reg51.h>                        //包含頭文件
  2. #include <stdlib.h>                        //庫(kù)文件,使用隨機(jī)數(shù)發(fā)生函數(shù)

  3. typedef unsigned char uchar; //無(wú)符號(hào)字符型數(shù)據(jù)
  4. typedef unsigned int  uint;         //無(wú)符號(hào)整型數(shù)據(jù)

  5. sbit ST=P3^2;        //74HC595寄存器輸入端口
  6. sbit Key1=P1^6;        //按鍵開(kāi)始
  7. sbit Key2=P1^7;        //按鍵停止

  8. bit flag=0;                //定時(shí)時(shí)間標(biāo)志位
  9. uchar num[7];        //產(chǎn)生的隨機(jī)數(shù)
  10. uchar num1[2];
  11. uchar cnt;                //計(jì)數(shù)變量
  12. uchar str[5]= {0xff,0xff,0xff,0xff,0xff};         //定義數(shù)組存放35個(gè)LED數(shù)據(jù)
  13. uchar str1[2]= {0xff,0xff};                                        //定義數(shù)組存放12個(gè)LED數(shù)據(jù)

  14. void Delay_Us(int i);                //延時(shí)函數(shù)
  15. void Timer_Init(void);                //定時(shí)器初始化
  16. void UART_Init(void);                //串口初始化
  17. void UART_Send(uchar dat);        //串口發(fā)送數(shù)據(jù)
  18. //主函數(shù)
  19. void main(void)
  20. {
  21.     uchar i,j,k;                        //定義變量
  22.     UART_Init();                           //串口初始化
  23.     Timer_Init();                           //定時(shí)器初始化
  24.     for(i=0; i<5; i++)          //循環(huán)5次發(fā)送數(shù)據(jù)
  25.     {   //35個(gè)LED初始狀態(tài),全部熄滅
  26.         UART_Send(str[i]);
  27.     }
  28.     P1=0xff;                          //12個(gè)LED初始狀態(tài),全部熄滅
  29.     P2=0xff;
  30.     while(1)
  31.     {
  32.         if(flag)         //定時(shí)時(shí)間到
  33.         {
  34.             flag=0;         //標(biāo)志位清零
  35.             /*----35抽取5個(gè)LED-----*/
  36.             for(i=0; i<5; i++)         //所有燈熄滅
  37.             {
  38.                 str[i]=0xff;
  39.             }
  40.             for(i=0; i<7; i++)
  41.             {
  42.                 k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
  43.                 for(j=0; j<i ; j++)
  44.                 {
  45.                     while(num[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  46.                     {
  47.                         k=rand()%35;
  48.                     }
  49.                 }
  50.                 num[i]=k;
  51.                 str[num[i]/8]&=~(0x01<<(num[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  52.             }
  53.             for(i=0; i<5; i++)          //循環(huán)5次發(fā)送數(shù)據(jù)
  54.             {
  55.                 UART_Send(str[i]);
  56.             }
  57.             /*----12抽取2個(gè)LED-----*/
  58.             str1[0]=0xff;                          //12個(gè)LED全部熄滅
  59.             str1[1]=0xff;
  60.             for(i=0; i<2; i++)
  61.             {
  62.                 k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
  63.                 for(j=0; j<i ; j++)
  64.                 {
  65.                     while(num1[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  66.                     {
  67.                         k=rand()%12;
  68.                     }
  69.                 }
  70.                 num1[i]=k;
  71.                 str1[num1[i]/8]&=~(0x01<<(num1[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  72.             }
  73.             P1=str1[1];                          //控制12個(gè)LED點(diǎn)亮
  74.             P2=str1[0];
  75.         }
  76.         if(Key1==0)        //按鍵開(kāi)始
  77.         {
  78.             Delay_Us(1000);        //延時(shí)消抖
  79.             if(Key1==0)
  80.             {
  81.                 TR0=1;
  82.             }
  83.             while(Key2==0);        //按鍵松手檢測(cè)
  84.         }
  85.         if(Key2==0)        //按鍵停止
  86.         {
  87.             Delay_Us(1000);        //延時(shí)消抖
  88.             if(Key2==0)
  89.             {
  90.                 TR0=0;
  91.                 /*----35抽取5個(gè)LED-----*/
  92.                 for(i=0; i<5; i++) //所有燈熄滅
  93.                 {
  94.                     str[i]=0xff;
  95.                 }
  96.                 for(i=0; i<7; i++)
  97.                 {
  98.                     k=rand()%35; //產(chǎn)生隨機(jī)數(shù)0-34
  99.                     for(j=0; j<i ; j++)
  100.                     {
  101.                         while(num[j]==k)//如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  102.                         {
  103.                             k=rand()%35;
  104.                         }
  105.                     }
  106.                     num[i]=k;
  107.                     str[num[i]/8]&=~(0x01<<(num[i]%8));        //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  108.                 }
  109.                 for(i=0; i<5; i++)          //循環(huán)5次發(fā)送數(shù)據(jù)
  110.                 {
  111.                     UART_Send(str[i]);
  112.                 }
  113.                 /*----12抽取2個(gè)LED-----*/
  114.                 str1[0]=0xff;                          //12個(gè)LED全部熄滅
  115.                     str1[1]=0xff;
  116.                 for(i=0; i<2; i++)
  117.                 {
  118.                     k=rand()%12; //產(chǎn)生隨機(jī)數(shù)0-11
  119.                     for(j=0; j<i ; j++)
  120.                     {
  121.                         while(num1[j]==k)         //如果產(chǎn)生的隨機(jī)數(shù)與之前的相同,則重新生成
  122.                         {
  123.                             k=rand()%12;
  124.                         }
  125.                     }
  126.                     num1[i]=k;
  127.                     str1[num1[i]/8]&=~(0x01<<(num1[i]%8));         //將隨機(jī)數(shù)轉(zhuǎn)換為對(duì)應(yīng)的LED數(shù)據(jù)
  128.                 }
  129.                 P1=str1[1];                          //控制12個(gè)LED點(diǎn)亮
  130.                 P2=str1[0];
  131.             }
  132.             while(Key2==0);        //按鍵松手檢測(cè)
  133.         }
  134.     }
  135. }
  136. //延時(shí)函數(shù)
  137. void Delay_Us(int i)
  138. {
  139.     while(i--);
  140. }
  141. //定時(shí)器初始化
  142. void Timer_Init(void)
  143. {
  144.     TMOD|=0x01; //打開(kāi)定時(shí)器0,1,工作方式1。
  145.     TH0=0x3c;        //給定時(shí)器0賦初值,定時(shí)50ms
  146.     TL0=0xb0;
  147.     ET0=1;      //打開(kāi)定時(shí)器0中斷允許
  148.     TR0=0;                //打開(kāi)定時(shí)器
  149.     PS=1;
  150.     EA=1;       //打開(kāi)總中斷
  151. }
  152. //串口初始化
  153. void UART_Init(void)
  154. {
  155.     SM0=0;                //串口模式0:同步移位寄存器方式
  156.     SM1=0;
  157.     TI=0;                //發(fā)送中斷清零
  158. }
  159. //串口發(fā)送數(shù)據(jù),移位寄存器模式
  160. void UART_Send(uchar dat)
  161. {
  162.     ST=0;
  163.     SBUF=dat;          //LED數(shù)據(jù)
  164.     while(~TI);                 //等待發(fā)送完成
  165.     TI=0;                        //標(biāo)志位清零
  166.     ST=1;
  167.     ST=0;
  168. }
  169. //定時(shí)器0中斷函數(shù)
  170. void Timer0() interrupt 1
  171. {
  172.     TH0=0x3c;   //定時(shí)50ms
  173.     TL0=0xb0;
  174.     cnt++;                //中斷計(jì)數(shù)
  175.     if(cnt==6)
  176.     {
  177.         cnt=0;
  178.         flag=1;        //標(biāo)志位置1
  179.     }
  180. }
復(fù)制代碼

請(qǐng)指點(diǎn),謝謝!


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1105755 發(fā)表于 2024-4-14 16:07 | 只看該作者
就是按P1^4口按鍵執(zhí)行第一種流水燈程序,按P1^5口按鍵執(zhí)行第二種流水燈程序,按鍵調(diào)換順序也沒(méi)關(guān)系
回復(fù)

使用道具 舉報(bào)

板凳
ID:619259 發(fā)表于 2024-4-18 16:59 | 只看該作者
流水燈是入門(mén)級(jí),沒(méi)必要搞這么復(fù)雜的程序,思路才是重要的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表