1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: 單片機智能路燈控制系統仿真及源程序 [打印本頁]

作者: 51黑ff    時間: 2016-9-26 16:27
標題: 單片機智能路燈控制系統仿真及源程序

單片機智能路燈控制系統仿真工程文件及程序下載:
智能路燈控制系統程序 仿真.rar (185.5 KB, 下載次數: 235)


如果還有不完善的地方,希望大家一起改進

源程序:
  1. #include<reg52.h>    //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
  3. #define AddWr 0x90   //寫數據地址
  4. #define AddRd 0x91   //讀數據地址
  5. #define  _Nop()  _nop_()  //定義空指令                        

  6. sbit IR=P3^2;  //紅外接口標志
  7. sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
  8. sbit LATCH2=P2^3;//                 位鎖存
  9. sbit SDA=P2^1;
  10. sbit SCL=P2^0;

  11. bit irpro_ok,irok;
  12. bit ack;                      //應答標志位
  13. extern bit ack;                 //外部點應答

  14. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  15. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
  16. unsigned char  irtime;//紅外用全局變量
  17. unsigned char IRcord[4];
  18. unsigned char irdata[33];
  19. unsigned char TempData[8]; //存儲顯示值的全局變量
  20. unsigned char  RcvByte();
  21. unsigned char ReadADC(unsigned char Chl);
  22. unsigned char kkk;
  23. long num;

  24. void Ir_work(void);
  25. void Ircordpro(void);
  26. void delay(unsigned int t); //函數聲明
  27. void Display();
  28. void asd(unsigned char t);
  29. void shaomiao(void);
  30. void Start_I2c();
  31. void Stop_I2c();
  32. void  SendByte(unsigned char c);
  33. void NoAck_I2c(void);
  34. void _nop_(void);
  35. void guang(void);
  36. void zhixing(void);
  37. void mjian(void);
  38. void mjia(void);
  39. void hjian(void);
  40. void hjia(void);
  41. void jieshu(void);
  42. void kaiguan(void);

  43. void kaiguan()
  44. {  kkk++;
  45.         while(kkk==2)
  46.         kkk=0;
  47. }

  48. void jieshu()
  49. {        P1=0xff;
  50.         DataPort=0;   //清空數據,防止有交替重影
  51.     LATCH1=1;     //段鎖存
  52.     LATCH1=0;
  53.         kkk++;
  54.         if(kkk==2)
  55.         {kkk=0;}
  56. }

  57. void mjian()
  58. {        num=num-60;
  59.         if(num<=0)
  60.         {num=86400+num;}
  61.         zhixing();
  62. }

  63. void mjia()
  64. {        num=num+60;
  65.         if(num>=86400)
  66.         {num=num-86400;}
  67.         zhixing();
  68. }

  69. void hjian()
  70. {        num=num-3600;
  71.         if(num<=0)
  72.         {num=86400+num;}
  73.         zhixing();
  74. }
  75. void hjia()
  76. {        num=num+3600;
  77.         if(num>=86400)
  78.         {num=num-86400;}
  79.         zhixing();
  80. }
  81. void shaomiao(void)
  82. { if(irok)                        //如果接收好了進行紅外處理
  83.           {   
  84.            Ircordpro();
  85.            irok=0;
  86.             if(irpro_ok)                   //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
  87.           {
  88.            Ir_work();
  89.             }
  90.           }
  91. }

  92. void asd(unsigned char t)
  93. {
  94. num=t*3600 ;
  95. zhixing();
  96. }

  97. void zhixing()
  98. {
  99. unsigned char i;
  100.    while(num>0)
  101.    {for(i=0;i<80;i++)
  102.            {
  103.            TempData[0]=dofly_DuanMa[num/36000];
  104.            TempData[1]=dofly_DuanMa[(num/3600)%10];
  105.            TempData[2]=0x40;
  106.            TempData[3]=dofly_DuanMa[(num%3600)/600];
  107.            TempData[4]=dofly_DuanMa[(num%600)/60];
  108.            TempData[5]=0x40;
  109.            TempData[6]=dofly_DuanMa[(num%60)/10];
  110.            TempData[7]=dofly_DuanMa[(num%60)%10];
  111.            Display();
  112.            }
  113.            shaomiao();
  114.            if(kkk==0)
  115.            {guang();}
  116.            num--;
  117.            }
  118.                 jieshu();      
  119.       }

  120. void Delay(unsigned int t)
  121. {
  122. while(--t);
  123. }
  124. void Display()
  125. {
  126.       unsigned char i;          
  127.           for(i=0;i<8;i++)
  128.            {
  129.            DataPort=0;   //清空數據,防止有交替重影
  130.        LATCH1=1;     //段鎖存
  131.        LATCH1=0;

  132.        DataPort=dofly_WeiMa[i]; //取位碼
  133.        LATCH2=1;     //位鎖存
  134.        LATCH2=0;

  135.        DataPort=TempData[i]; //取顯示數據,段碼
  136.        LATCH1=1;     //段鎖存
  137.        LATCH1=0;
  138.       
  139.            Delay(80); // 掃描間隙延時,時間太長會閃爍,太短會造成重影

  140.        }
  141.            DataPort=0;   //清空數據,防止有交替重影
  142.        LATCH1=1;     //段鎖存
  143.        LATCH1=0;

  144. }

  145. void tim0_isr (void) interrupt 1 using 1
  146. {
  147.   irtime++;  //用于計數2個下降沿之間的時間
  148. }

  149. void EX0_ISR (void) interrupt 0 //外部中斷0服務函數
  150. {
  151.   static unsigned char  i;             //接收紅外信號處理
  152.   static bit startflag;                //是否開始處理標志位

  153. if(startflag)                        
  154.    {
  155.     if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
  156.                         i=0;
  157.                     irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
  158.                     irtime=0;
  159.                     i++;
  160.                             if(i==33)
  161.                               {
  162.                                    irok=1;
  163.                                  i=0;
  164.                                   }
  165.           }
  166.            else
  167.                 {
  168.                 irtime=0;
  169.                 startflag=1;
  170.                 }

  171. }

  172. void TIM0init(void)//定時器0初始化
  173. {

  174.   TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  175.   TH0=0x00; //重載值
  176.   TL0=0x00; //初始化值
  177.   ET0=1;    //開中斷
  178.   TR0=1;   
  179. }
  180. void EX0init(void)
  181. {
  182. IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  183. EX0 = 1;   //使能外部中斷
  184. EA = 1;    //開總中斷
  185. }
  186. void Ir_work(void)//紅外鍵值散轉程序
  187. {
  188.        switch(IRcord[2])//判斷第三個數碼值
  189.                  {
  190.                          case 0x0c:asd(1);break;//1
  191.                          case 0x18:asd(2);break;//2
  192.                          case 0x5e:asd(3);break;//3
  193.                          case 0x08:asd(4);break;//4
  194.                          case 0x1c:asd(5);break;//5
  195.                          case 0x5a:asd(6);break;//6
  196.                          case 0x42:asd(7);break;//7
  197.                          case 0x52:asd(8);break;//8
  198.                          case 0x4a:asd(9);break;//9
  199.                          case 0x07:mjian();break;//9
  200.                          case 0x15:mjia();break;//9
  201.                          case 0x44:hjian();break;//9
  202.                          case 0x40:hjia();break;//9
  203.                          case 0x43:num=0;break;//9
  204.                          case 0x09:kaiguan();break;//9
  205.                          case 0x16:P1=0xff;;break;//9
  206.              default:break;
  207.                          }

  208.                   irpro_ok=0;//處理完成標志

  209.   }
  210. void Ircordpro(void)//紅外碼值處理函數
  211. {
  212.   unsigned char i, j, k;
  213.   unsigned char cord,value;

  214.   k=1;
  215.   for(i=0;i<4;i++)      //處理4個字節
  216.      {
  217.       for(j=1;j<=8;j++) //處理1個字節8位
  218.          {
  219.           cord=irdata[k];
  220.           if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
  221.              value|=0x80;
  222.           if(j<8)
  223.                     {
  224.                          value>>=1;
  225.                         }
  226.            k++;
  227.          }
  228.      IRcord[i]=value;
  229.      value=0;     
  230.      }
  231.          irpro_ok=1;//處理完畢標志位置1
  232. }

  233. unsigned char ReadADC(unsigned char Chl)
  234. {
  235.    unsigned char Val;
  236.    Start_I2c();               //啟動總線
  237.    SendByte(AddWr);             //發送器件地址
  238.      if(ack==0)return(0);
  239.    SendByte(0x40|Chl);            //發送器件子地址
  240.      if(ack==0)return(0);
  241.    Start_I2c();
  242.    SendByte(AddWr+1);
  243.       if(ack==0)return(0);
  244.    Val=RcvByte();
  245.    NoAck_I2c();                 //發送非應位
  246.    Stop_I2c();                  //結束總線
  247.   return(Val);
  248. }
  249. void Start_I2c()
  250. {
  251.   SDA=1;   //發送起始條件的數據信號
  252.   _Nop();
  253.   SCL=1;
  254.   _Nop();    //起始條件建立時間大于4.7us,延時
  255.   _Nop();
  256.   _Nop();
  257.   _Nop();
  258.   _Nop();   
  259.   SDA=0;     //發送起始信號
  260.   _Nop();    //起始條件鎖定時間大于4μ
  261.   _Nop();
  262.   _Nop();
  263.   _Nop();
  264.   _Nop();      
  265.   SCL=0;    //鉗住I2C總線,準備發送或接收數據
  266.   _Nop();
  267.   _Nop();
  268. }
  269. void Stop_I2c()
  270. {
  271.   SDA=0;    //發送結束條件的數據信號
  272.   _Nop();   //發送結束條件的時鐘信號
  273.   SCL=1;    //結束條件建立時間大于4μ
  274.   _Nop();
  275.   _Nop();
  276.   _Nop();
  277.   _Nop();
  278.   _Nop();
  279.   SDA=1;    //發送I2C總線結束信號
  280.   _Nop();
  281.   _Nop();
  282.   _Nop();
  283.   _Nop();
  284. }




  285. void  SendByte(unsigned char c)
  286. {
  287. unsigned char BitCnt;

  288. for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數據長度為8位
  289.     {
  290.      if((c<<BitCnt)&0x80)SDA=1;   //判斷發送位
  291.        else  SDA=0;               
  292.      _Nop();
  293.      SCL=1;               //置時鐘線為高,通知被控器開始接收數據位
  294.       _Nop();
  295.       _Nop();             //保證時鐘高電平周期大于4μ
  296.       _Nop();
  297.       _Nop();
  298.       _Nop();         
  299.      SCL=0;
  300.     }
  301.    
  302.     _Nop();
  303.     _Nop();
  304.     SDA=1;               //8位發送完后釋放數據線,準備接收應答位
  305.     _Nop();
  306.     _Nop();   
  307.     SCL=1;
  308.     _Nop();
  309.     _Nop();
  310.     _Nop();
  311.     if(SDA==1)ack=0;     
  312.        else ack=1;        //判斷是否接收到應答信號
  313.     SCL=0;
  314.     _Nop();
  315.     _Nop();
  316. }


  317. unsigned char  RcvByte()
  318. {
  319.   unsigned char retc;
  320.   unsigned char BitCnt;
  321.   
  322.   retc=0;
  323.   SDA=1;             //置數據線為輸入方式
  324.   for(BitCnt=0;BitCnt<8;BitCnt++)
  325.       {
  326.         _Nop();           
  327.         SCL=0;       //置時鐘線為低,準備接收數據位
  328.         _Nop();
  329.         _Nop();      //時鐘低電平周期大于4.7us
  330.         _Nop();
  331.         _Nop();
  332.         _Nop();
  333.         SCL=1;       //置時鐘線為高使數據線上數據有效
  334.         _Nop();
  335.         _Nop();
  336.         retc=retc<<1;
  337.         if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
  338.         _Nop();
  339.         _Nop();
  340.       }
  341.   SCL=0;   
  342.   _Nop();
  343.   _Nop();
  344.   return(retc);
  345. }



  346. void NoAck_I2c(void)
  347. {
  348.   
  349.   SDA=1;
  350.   _Nop();
  351.   _Nop();
  352.   _Nop();      
  353.   SCL=1;
  354.   _Nop();
  355.   _Nop();              //時鐘低電平周期大于4μ
  356.   _Nop();
  357.   _Nop();
  358.   _Nop();  
  359.   SCL=0;                //清時鐘線,鉗住I2C總線以便繼續接收
  360.   _Nop();
  361.   _Nop();   
  362. }

  363. void guang()
  364. {
  365. unsigned char num1=0;         //主循環
  366.   {
  367. num1=255-ReadADC(0);//值取差值,用于顯示光強越小,數值越小
  368. if(num1 >=70)
  369. {P1=0xff;}
  370. else if(num1>=60)
  371. {P1=0xfe;}
  372. else if(num1>=50)
  373. {P1=0xfc;}
  374. else if(num1>=40)
  375. {P1=0xf8;}
  376. else if(num1>=30)
  377. {P1=0xf0;}
  378. else if(num1>=20)
  379. {P1=0xe0;}
  380. else if(num1>=10)
  381. {P1=0xc0;}
  382. else if(num1>=5)
  383. {P1=0x80;}
  384. else{P1=0x00;}         
  385.   }
  386. }
  387.        
  388.                        
  389. void main(void)
  390. {
  391. EX0init(); //初始化外部中斷
  392. TIM0init();//初始化定時器

  393. while(1)//主循環
  394.    {
  395.     if(kkk==0)
  396.            {guang();}
  397.     if(irok)                        //如果接收好了進行紅外處理
  398.           {   
  399.            Ircordpro();
  400.            irok=0;
  401.           }

  402.     if(irpro_ok)                   //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
  403.           {
  404.            Ir_work();
  405.             }
  406.    }
  407. }
復制代碼





作者: 517949772    時間: 2018-1-16 14:19
厲害了
作者: 我解抒情    時間: 2018-1-16 17:03
學習了,厲害

作者: nieqijuen    時間: 2018-1-18 08:56
這個燈是通過時間來控制開關的嗎?還是通過光感
作者: yilinghai    時間: 2018-5-2 12:50
樓主,有沒有相關原理說明
作者: 時光ning    時間: 2018-12-13 09:38
有報告嗎?
作者: gsdaigdhqwjkqwa    時間: 2019-1-14 15:11
厲害了老哥

作者: gsdaigdhqwjkqwa    時間: 2019-1-14 15:14
有原理或者實現的功能介紹嗎?

作者: Banner    時間: 2019-1-29 12:25
有具體的功能介紹嗎?我新手,還不知道怎么控制等多個單片機一起工作
作者: a1027211708    時間: 2019-4-23 11:47
樓主厲害
作者: a1027211708    時間: 2019-4-23 11:47
牛逼牛逼
作者: 易白鹿    時間: 2019-4-25 15:42
想問問都實現了什么功能?
作者: lililili123456    時間: 2019-11-28 18:51
作者寫的特別好
作者: lililili123456    時間: 2019-11-29 07:25
為社么圖下載不了?

作者: 1243785926    時間: 2019-11-29 12:03
不錯的資源
作者: 哈哈長老    時間: 2020-11-5 10:59
請問那個示波器怎么調波形




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1