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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機聲音傳感器控制燈漸亮源程序 數值如何保持?

[復制鏈接]
跳轉到指定樓層
樓主
ID:994927 發表于 2021-12-22 16:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
想要通過光敏傳感器和聲音傳感器控制led漸亮,如果光小于某個值并且檢測到聲音的話,讓led像呼吸燈一樣漸漸亮起來
但是我的代碼只能在串口接收到數值,led不能漸漸亮起來,并且漸亮以后,怎么能在下一次獲得傳感器數值之前保持住呢?

單片機源程序如下:
  1. #include "stc8a.h"                                //頭文件
  2. #include "stdio.h"
  3. #include "intrins.h"

  4. typedef unsigned char u8;                        //別名

  5. u8 Tcount, dutyfactor=0, direct;                //一個PWM周期內的:周期計數,占空比,方向

  6. sbit LED = P2^0;                                        //位定義,led燈引腳
  7. unsigned int dat;
  8. char y=0;
  9. float ftemp1,ftemp2;
  10. float miniftemp=2.0;
  11. float ratio=0.1;
  12. float d_value;
  13. float buf1=0.0,buf2=0.0;
  14. char str[10];
  15. int i,t;

  16. void InterruptInit();                                //中斷初始化配置的函數聲明
  17. void Time0();                                                 //定時器0中斷的函數聲明
  18. void display( );
  19. void breatheLED();                                        //呼吸燈主程序的函數聲明
  20. int dec,inc;

  21. void delay(int b)
  22. {
  23.         while(b--);
  24.         }

  25. void UartInit(void)                //9600bps@11.0592MHz
  26. {
  27.         SCON = 0x50;                //8位數據,可變波特率
  28.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  29.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  30.         TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
  31.         TL1 = 0xE0;                //設定定時初值
  32.         TH1 = 0xFE;                //設定定時初值
  33.         ET1 = 0;                //禁止定時器1中斷
  34.         TR1 = 1;                //啟動定時器1
  35. }

  36. void Delay1000ms()                //@11.0592MHz
  37. {
  38.         unsigned char i, j, k;

  39.         _nop_();
  40.         i = 8;
  41.         j = 1;
  42.         k = 243;
  43.         do
  44.         {
  45.                 do
  46.                 {
  47.                         while (--k);
  48.                 } while (--j);
  49.         } while (--i);
  50. }




  51. //主函數
  52. void main() {
  53.         //InterruptInit();                                //初始化中斷配置
  54.         UartInit();

  55.         //循環實現呼吸燈功能
  56.         //PWM周期:20ms;占空比:0~100;占空比每一份:200us;一次呼吸燈效果(暗->亮->暗):4s
  57.         while(1) {
  58.                  P1M0 = 0x00;                                //設置P1.0為ADC口
  59.      P1M1 = 0x01;

  60.     ADCCFG = 0x2f;                              //設置ADC時鐘為系統時鐘/2/16/16
  61.     ADC_CONTR = 0x80;                           //使能ADC模塊 1000 0000
  62.                 ADC_CONTR |= 0x40;                      //啟動AD轉換 P1.0        1000 0000 || 0100 0000=1100 0000
  63.                 _nop_();
  64.                 _nop_();
  65.                 while (!(ADC_CONTR & 0x20));            //查詢ADC完成標志
  66.                 ADC_CONTR &= ~0x20;                     //清完成標志
  67.                 //ADC_RES(高4位) ADC_RESL(低8位);                           //讀取ADC結果
  68.                 dat=ADC_RES*256+ADC_RESL;
  69.                 buf1=ftemp1;//保存上一次的值
  70.                 ftemp1=dat;
  71.                 ftemp1=ftemp1*3.3/4096;//此時環境的暗亮程度
  72. //                printf("The intensity is ");
  73.                 sprintf(str,"%.2f\r\n\0",ftemp1);
  74.                 i=0;
  75.                 while(str[i]!=0)
  76.                 {
  77.                         SBUF=str[i];
  78.                         while(!TI);
  79.                         TI=0;
  80.                         i++;
  81.                 }
  82.                 Delay1000ms();
  83.                
  84.                 ADC_CONTR = 0x81;                           //使能ADC模塊 1000 0000
  85.                 ADC_CONTR |= 0x40;                      //啟動AD轉換 P1.0        1000 0000 || 0100 0000=1100 0000
  86.                 _nop_();
  87.                 _nop_();
  88.                 while (!(ADC_CONTR & 0x20));            //查詢ADC完成標志
  89.                 ADC_CONTR &= ~0x20;                     //清完成標志
  90.                 //ADC_RES(高4位) ADC_RESL(低8位);                           //讀取ADC結果
  91.                 dat=ADC_RES*256+ADC_RESL;
  92.                 buf2=ftemp2;//保存上一次的值
  93.                 ftemp2=dat;
  94.                 ftemp2=ftemp2*3.3/4096;//此時環境的暗亮程度
  95. //                printf("The noise is ");
  96.                 sprintf(str,"%.2f\r\n\0",ftemp2);
  97.                 i=0;
  98.                 while(str[i]!=0)
  99.                 {
  100.                         SBUF=str[i];
  101.                         while(!TI);
  102.                         TI=0;
  103.                         i++;
  104.                 }
  105.                 Delay1000ms();
  106.                
  107.                
  108.                 if(ftemp1 < miniftemp && ftemp2 > 0.0)
  109.                 {
  110.                         breatheLED();
  111.                 }                        //呼吸燈效果實現
  112.                 else         LED=1;
  113.         }        
  114. }

  115. //中斷初始化配置
  116. void InterruptInit() {
  117.         TMOD &= 0xf0;                                        //定時器0設置清除
  118.         TMOD |= 0x02;                                        //定時器0,8位自動重裝載
  119.         
  120.         //初值
  121.         TH0 = 0x9C;                                                //100us定時,2^8-11.0592M / 12 * 200us
  122.         TL0 = 0x9C;                                                //自動重裝載,低八位等于高八位
  123.         
  124.         ET0 = 1;                                                //打開定時器0中斷允許
  125.         EA  = 1;                                                //打開總中斷
  126.         
  127.         TR0 = 1;                                                //啟動定時器0
  128. }

  129. //定時器0中斷
  130. void Time0() interrupt 1 {
  131.         //200us初值重裝
  132.         TH0 = 0x9C;                                                               
  133.         TL0 = 0x9C;               
  134.         
  135.         Tcount++;                                                //一個PWM周期內,計數
  136. }

  137. //呼吸燈主程序
  138. void breatheLED( ) {
  139.                 if(Tcount >= 100) {                                //一個PWM周期(4000次*100us)
  140.                         Tcount = 0;                                        //下一個PWM周期內,重新計數
  141.                         
  142.                         
  143.                         //根據占空比值判斷方向是否需要改變
  144.                         if(ftemp2 > buf2) {                        //占空比減少到0
  145.                                 direct = 1;                                        //正方向,占空比開始增加
  146.                         } else if(ftemp2 < buf2) {        //占空比增加到100
  147.                                 direct = 0;                                        //負方向,占空比開始減少
  148.                         }
  149.                         
  150.                         //根據方向判斷占空比增加或減少
  151.                         if(direct == 1) {                        //正方向,占空比增
  152.                                 d_value=(ftemp2-buf2)/ratio;
  153.                                 inc=floor(d_value);
  154.                                 dutyfactor=dutyfactor+inc;                                //下一個PWM周期,占空比增加1
  155. //                                dutyfactor++;
  156.                         } else if(direct == 0) {        //負方向,占空比減少
  157.                                 d_value=(buf2-ftemp2)/ratio;
  158.                                 dec=floor(d_value);
  159.                                 dutyfactor=dutyfactor-dec;                        //下一個PWM周期,占空比減少1
  160.                                   dutyfactor--;
  161.                         }
  162.                 }
  163.                
  164.                 //占空比:通電時間相對于總時間所占的比例(此程序中:低電平時間相對于PWM周期所占的比例)
  165.                 //一個PWM周期計數100次,占空比相當于低電平的計數周期次數。即:0~占空比:低電平,燈亮;占空比~100:高電平,燈滅
  166.                 //在一個PWM周期內,根據周期計數是否小于占空比,判斷LED燈的亮滅
  167.                 if(Tcount < dutyfactor) {                //周期計數值<占空比
  168.                         LED = 0;                                        //當前PWM周期的當前計數周期內燈亮
  169.                 } else {
  170.                         LED = 1;                                        //當前PWM周期的當前計數周期內燈滅
  171.                 }

  172. }
復制代碼

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区三区中文字幕 | 精品国产91亚洲一区二区三区www | 中文字幕免费视频 | 精品免费国产视频 | 精品国产一级 | 一区二区三区视频在线观看 | 亚洲一二三区av | 九九亚洲 | 国产精品伦一区二区三级视频 | 久久久人成影片一区二区三区 | 日韩免费av网站 | 欧美黄色大片在线观看 | 亚洲视频免费 | 欧美性一区二区三区 | 一区二区视频在线 | 特一级毛片 | 亚洲精视频 | 国产欧美一区二区三区在线看 | 国产乱码一区 | 欧美a∨ | 伊人最新网址 | 亚洲精品一 | 国产精品欧美一区二区三区不卡 | 成人av片在线观看 | 国产一区在线免费观看视频 | 日韩一区和二区 | 午夜视频网 | 成人精品视频99在线观看免费 | 国产精品日韩一区二区 | 欧美群妇大交群中文字幕 | 在线成人av| 日本韩国欧美在线观看 | 国产精品亚洲第一 | 欧美激情精品久久久久久变态 | 视频一二三区 | 永久看片 | 国产视频一区在线 | 中文字幕爱爱视频 | 亚洲欧美综合 | 婷婷久久综合 | 国产高清精品一区二区三区 |