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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2063|回復: 4
打印 上一主題 下一主題
收起左側

單片機七彩漸變循環程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:237797 發表于 2021-10-17 16:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用STC15W201S把網上資料用定時器1改成定時器2實現七彩燈漸變。主程序中的while(1),我注解后工作不正常的變化了,變成綠燈閃爍了。我自己的理解沒有while(1),就不循環了,漸變一次就會停止,燈滅。怎么不是我想的那樣?這種現象如何理解?單片機程序如下:
#include"stc15wxx.h"

#define uchar unsigned char
#define uchar unsigned char//字浮型宏定義
#define uint unsigned int//整型宏定義
#define shudu 30//LED漸變速度調整
#define dengji 1//LED變化等級調整
uchar Rout,Bout,Gout;//紅綠蘭3個變量

sbit R1=P3^1; //   輪流七彩變色呼吸   3.0 紅色
sbit G1=P5^5;//                       3.1 綠色
sbit B1=P3^0; //                      3.2 藍色

/***************************************************/
/**********************延時子程序*******************/
/***************************************************/
void delay(uint z)
{
uint x,y;//局部變量定義
for(x=0;x<5;x++)//延時外循環
for(y=0;y<z;y++);//延時內循環
}
/**********************************************/
/**********PWM控制紅綠蘭3種燈亮滅時間**********/
/**********************************************/
void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3個局部變量,些部分為帶參數函數
{
     if(Rou!=0)//如果紅燈變量不等于0就亮紅燈
     {
      R1=1;//紅燈亮
      delay(Rou);//紅燈亮起時間
      R1=0;//紅燈滅
     }
     if(Gou!=0)//如果紅燈變量不等于0就亮綠燈
     {
      G1=1;//綠燈亮
      delay(Gou);//綠燈亮起的時間 
      G1=0;//綠燈滅
     }
     if(Bou!=0)//如果紅燈變量不等于0就亮藍燈
     {
      B1=1;//蘭燈亮
      delay(Bou);//蘭燈亮起的時間
      B1=0;//蘭燈滅
     }
}

/***********************************************/
/********************主程序*********************/
/***********************************************/
void main()
{
//     TMOD=0x01;//選擇定時器在方式1下工作
//     EA=1;//打開總中斷
//     ET0=1;//打開定時器中斷
//     TR0=1;//打開定時器
//     R1=0;//開機將紅燈關閉
//     G1=0;//開機將綠燈關閉
//     B1=0;//開機將蘭燈關閉
//     TH0=(65536-256)/256;//給定時器高8位賦值
//     TL0=(65536-256)%256;//給定時器低8位賦值

        AUXR &= 0xFB;                //定時器時鐘12T模式
        T2L = 0xB4;                //設置定時初始值 FEB4 30us
        T2H = 0xFE;                //設置定時初始值
        AUXR |= 0x10;                //定時器2開始計時
    EA = 1;
    IE2 |= 0X04;
    R1=0;//開機將紅燈關閉
    G1=0;//開機將綠燈關閉
    B1=0;//開機將蘭燈關閉

while(1)//程序主循環:次句注解后現象變成綠燈閃爍,沒有注解漸變正常
{
  RGBpwm(Rout,Gout,Bout);//調用RGBpwm子程序
}
}
/*************************************************/
/*中斷服務子程序(控制LED紅綠蘭亮滅時間占空比例)*/
/*************************************************/
//void zhong() interrupt 1//中斷向量位為1
void zhong() interrupt 12//中斷向量位為12
{
uint num;//定時器計數變量
uint ji;//亮度等級控制變量
// TH0=(65536-256)/256;//給定時器高8位賦值
// TL0=(65536-256)%256;//給定時器低8位賦值

        T2L = 0xB4;                //設置定時初始值 FEB4 30us
        T2H = 0xFE;                //設置定時初始值

num++;//將定時計數變自動增加1
if(num==shudu)//如果速度變量等于定時計數器變量就執行下面大括號語句
{
  num=0;//將計數器清0
  ji++;//將亮度等級控制變量加1
  if((ji>0)&&(ji<100))//如果亮度等級控制變量ji小于100,紅燈亮起時間變量為240
  {
   Rout=240;//紅燈亮起變量為240
   Gout=0;//綠燈亮起變量為0
   Bout=0;//蘭燈亮起變量為0
  }
  if((ji>100)&&(ji<340))/*如果亮度等級控制變量ji大于100小于340(剛好240個等級),
  紅燈亮起時間變量由原來的240,慢慢減小到0,同時綠燈由原來的0慢慢增到240,形成
  紅燈到綠燈的漸變過程*/
  {
   Rout-=dengji;//將紅燈變量減1。因為dengji為亮度變化等級(本程序變化等級為1),
   Gout+=dengji;//將綠燈變量加1
   Bout=0;//蘭燈不變
  }
  if((ji>340)&&(ji<440))/*亮度等級控制變量ji大于340小于440時,讓綠燈變量停一段時間
  這樣就形成了當紅燈過度到綠燈時,綠燈會停一會兒的效果。*/
  {
   Rout=0;//紅燈滅
   Gout=240;//綠燈亮
   Bout=0;//蘭燈滅
  }
  if((ji>440)&&(ji<680))//同理:亮度等級控制變量ji大于440小于680時,由綠燈到蘭燈過度
  {
   Rout=0;//紅燈變量不變
   Gout-=dengji;//將綠燈變量減1
   Bout+=dengji;//將蘭燈變量加1
  }
  if((ji>680)&&(ji<780))//亮度等級控制變量ji大于680小于780時,讓蘭燈變量停一段時間
  {
   Rout=0;//紅燈滅
   Gout=0;//綠燈滅
   Bout=240;//蘭燈亮一會兒
  }
  if((ji>780)&&(ji<1020))//亮度等級控制變量ji大于780小于1020時,由蘭燈到白燈過度
  {
   Rout+=dengji;//將紅燈變量加1
   Gout+=dengji;//綠燈變量加1
   Bout=240;//蘭燈不變
  }
  if((ji>1020)&&(ji<1025))//亮度等級控制變量ji大于1020小于1025時,由蘭燈到白燈過度
  {
   Rout=240;//將紅燈變量加1
   Gout=240;//綠燈變量加1
   Bout=240;//蘭燈不變
  }
  if((ji>1025)&&(ji<1265))//亮度等級控制變量ji大于1025小于1265時,由白光到紅光過度
  {
   Rout=240;//紅燈變量不變
   Gout-=dengji;//綠燈變量自動減1
   Bout-=dengji;//蘭燈變量自動減1
  }
  if(ji>1265)//當亮度等級控制變量ji大于1210時,就將它清0
  ji=0;//將亮度控制等級清0
}
}


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

使用道具 舉報

沙發
ID:624769 發表于 2021-10-17 20:39 | 只看該作者
一般,主程序不能沒有while(1), 不然程序不會停,反而會亂跑,如果你學過匯編會知道,程序結束必須要有一個SJMP $ 讓程序停下來。你如果要確保運行一次就停,就在主程序的末尾,加一個 while(1);  讓程序停在那里。或者主程序最后用: PCON = 0x02; 來關機。
回復

使用道具 舉報

板凳
ID:237797 發表于 2021-10-18 08:15 | 只看該作者
188610329 發表于 2021-10-17 20:39
一般,主程序不能沒有while(1), 不然程序不會停,反而會亂跑,如果你學過匯編會知道,程序結束必須要有一個 ...

我在程序末尾加個while(1);程序下載到單片機里,直接就沒有反應了,不亮燈了。
回復

使用道具 舉報

地板
ID:161164 發表于 2021-10-18 17:40 | 只看該作者
lclbf 發表于 2021-10-18 08:15
我在程序末尾加個while(1);程序下載到單片機里,直接就沒有反應了,不亮燈了。

因為漸變是一個從零到255的過程
你只運行一次當然不會亮
如想只漸變一次就停止,
可用188610329總的代碼PCON = 0x02;
放到完成一次漸變的地方

提示:ji>XXXX
回復

使用道具 舉報

5#
ID:237797 發表于 2021-10-19 09:01 | 只看該作者
lkc8210 發表于 2021-10-18 17:40
因為漸變是一個從零到255的過程
你只運行一次當然不會亮
如想只漸變一次就停止,

謝謝你的回復,根據你的提示我改成:
if(ji<1265)
RGBpwm(Rout,Gout,Bout);

能注意看出漸變的效果。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品大全 | 欧美日日| 99pao成人国产永久免费视频 | 日韩视频一区 | 精品91久久| 日韩在线视频精品 | 99精品欧美一区二区三区综合在线 | 久久久久久精 | 天天影视网天天综合色在线播放 | 亚洲精品一区中文字幕乱码 | 999久久久久久久久6666 | 日韩色图在线观看 | 日韩欧美三级 | 黑人久久 | 亚洲va中文字幕 | 亚洲欧洲精品成人久久奇米网 | 久久久天堂 | 黄色毛片在线看 | 欧美精品在线一区二区三区 | 国产美女精品 | 午夜国产一级 | 91久久久久久久久久久久久 | 成人性视频在线播放 | 亚洲成人一区二区 | 欧美在线国产精品 | 久草新在线| 国产亚洲一区二区三区 | 国产精品福利在线观看 | 欧美激情欧美激情在线五月 | 精品欧美一区二区三区久久久 | 91精品国产91久久综合桃花 | 国产高清av免费观看 | 久久天堂网 | 精品网站999www | 中文字幕 亚洲一区 | 中文二区 | 免费一区二区三区 | 久久久久久久久久久91 | 人人干人人干人人 | 国产视频精品区 | 成人精品久久久 |