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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1963|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)智能路燈控制系統(tǒng)仿真程序不顯示 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


單片機(jī)源程序如下:
  1. #include<reg52.h>    //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. sbit IR=P3^2;  //紅外接口標(biāo)志
  3. #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
  4. sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
  5. sbit LATCH2=P2^3;//                 位鎖存
  6. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  7. unsigned char  irtime;//紅外用全局變量
  8. bit irpro_ok,irok;
  9. unsigned char IRcord[4];
  10. unsigned char irdata[33];
  11. void Ir_work(void);
  12. void Ircordpro(void);
  13. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼
  14. unsigned char TempData[8]; //存儲顯示值的全局變量
  15. void delay(unsigned int t); //函數(shù)聲明
  16. void Display();
  17. void asd(unsigned char t);
  18. void shaomiao(void);
  19. #define AddWr 0x90   //寫數(shù)據(jù)地址
  20. #define AddRd 0x91   //讀數(shù)據(jù)地址
  21. #define  _Nop()  _nop_()  //定義空指令                        
  22. bit ack;                      //應(yīng)答標(biāo)志位
  23. sbit SDA=P2^1;
  24. sbit SCL=P2^0;
  25. unsigned char  RcvByte();
  26. extern bit ack;                 //外部點(diǎn)應(yīng)答
  27. unsigned char ReadADC(unsigned char Chl);
  28. void Start_I2c();
  29. void Stop_I2c();
  30. void  SendByte(unsigned char c);
  31. void NoAck_I2c(void);
  32. void _nop_(void);
  33. void guang(void);
  34. void zhixing(void);
  35. long num;
  36. unsigned char kkk;
  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;   //清空數(shù)據(jù),防止有交替重影
  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)                        //如果接收好了進(jìn)行紅外處理
  83.           {   
  84.            Ircordpro();
  85.            irok=0;
  86.             if(irpro_ok)                   //如果處理好后進(jìn)行工作處理,如按對應(yīng)的按鍵后顯示對應(yīng)的數(shù)字等
  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<82;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;   //清空數(shù)據(jù),防止有交替重影
  130.        LATCH1=1;     //段鎖存
  131.        LATCH1=0;

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

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

  140.        }

  141. }

  142. void tim0_isr (void) interrupt 1 using 1
  143. {
  144.   irtime++;  //用于計(jì)數(shù)2個下降沿之間的時間
  145. }

  146. void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
  147. {
  148.   static unsigned char  i;             //接收紅外信號處理
  149.   static bit startflag;                //是否開始處理標(biāo)志位

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

  168. }

  169. void TIM0init(void)//定時器0初始化
  170. {

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

  205.                   irpro_ok=0;//處理完成標(biāo)志

  206.   }
  207. void Ircordpro(void)//紅外碼值處理函數(shù)
  208. {
  209.   unsigned char i, j, k;
  210.   unsigned char cord,value;

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

  230. void main(void)
  231. {
  232. EX0init(); //初始化外部中斷
  233. TIM0init();//初始化定時器

  234. while(1)//主循環(huán)
  235.    {
  236.     if(kkk==0)
  237.            {guang();}
  238.     if(irok)                        //如果接收好了進(jìn)行紅外處理
  239.           {   
  240.            Ircordpro();
  241.            irok=0;
  242.           }

  243.     if(irpro_ok)                   //如果處理好后進(jìn)行工作處理,如按對應(yīng)的按鍵后顯示對應(yīng)的數(shù)字等
  244.           {
  245.            Ir_work();
  246.             }
  247.    }
  248. }  
  249. unsigned char ReadADC(unsigned char Chl)
  250. {
  251.    unsigned char Val;
  252.    Start_I2c();               //啟動總線
  253.    SendByte(AddWr);             //發(fā)送器件地址
  254.      if(ack==0)return(0);
  255.    SendByte(0x40|Chl);            //發(fā)送器件子地址
  256.      if(ack==0)return(0);
  257.    Start_I2c();
  258.    SendByte(AddWr+1);
  259.       if(ack==0)return(0);
  260.    Val=RcvByte();
  261.    NoAck_I2c();                 //發(fā)送非應(yīng)位
  262.    Stop_I2c();                  //結(jié)束總線
  263.   return(Val);
  264. }
  265. void Start_I2c()
  266. {
  267.   SDA=1;   //發(fā)送起始條件的數(shù)據(jù)信號
  268.   _Nop();
  269.   SCL=1;
  270.   _Nop();    //起始條件建立時間大于4.7us,延時
  271.   _Nop();
  272.   _Nop();
  273.   _Nop();
  274.   _Nop();   
  275.   SDA=0;     //發(fā)送起始信號
  276.   _Nop();    //起始條件鎖定時間大于4μ
  277.   _Nop();
  278.   _Nop();
  279.   _Nop();
  280.   _Nop();      
  281.   SCL=0;    //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  282.   _Nop();
  283.   _Nop();
  284. }
  285. void Stop_I2c()
  286. {
  287.   SDA=0;    //發(fā)送結(jié)束條件的數(shù)據(jù)信號
  288.   _Nop();   //發(fā)送結(jié)束條件的時鐘信號
  289.   SCL=1;    //結(jié)束條件建立時間大于4μ
  290.   _Nop();
  291.   _Nop();
  292.   _Nop();
  293.   _Nop();
  294.   _Nop();
  295.   SDA=1;    //發(fā)送I2C總線結(jié)束信號
  296.   _Nop();
  297.   _Nop();
  298.   _Nop();
  299.   _Nop();
  300. }




  301. void  SendByte(unsigned char c)
  302. {
  303. unsigned char BitCnt;

  304. for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數(shù)據(jù)長度為8位
  305.     {
  306.      if((c<<BitCnt)&0x80)SDA=1;   //判斷發(fā)送位
  307.        else  SDA=0;               
  308.      _Nop();
  309.      SCL=1;               //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
  310.       _Nop();
  311.       _Nop();             //保證時鐘高電平周期大于4μ
  312.       _Nop();
  313.       _Nop();
  314.       _Nop();         
  315.      SCL=0;
  316.     }
  317.    
  318.     _Nop();
  319.     _Nop();
  320.     SDA=1;               //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
  321.     _Nop();
  322.     _Nop();   
  323.     SCL=1;
  324.     _Nop();
  325.     _Nop();
  326.     _Nop();
  327.     if(SDA==1)ack=0;     
  328.        else ack=1;        //判斷是否接收到應(yīng)答信號
  329.     SCL=0;
  330.     _Nop();
  331.     _Nop();
  332. }


  333. unsigned char  RcvByte()
  334. {
  335.   unsigned char retc;
  336.   unsigned char BitCnt;
  337.   
  338.   retc=0;
  339.   SDA=1;             //置數(shù)據(jù)線為輸入方式
  340.   for(BitCnt=0;BitCnt<8;BitCnt++)
  341.       {
  342.         _Nop();           
  343.         SCL=0;       //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
  344.         _Nop();
  345.         _Nop();      //時鐘低電平周期大于4.7us
  346.         _Nop();
  347.         _Nop();
  348.         _Nop();
  349.         SCL=1;       //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  350.         _Nop();
  351.         _Nop();
  352.         retc=retc<<1;
  353.         if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  354.         _Nop();
  355.         _Nop();
  356.       }
  357.   SCL=0;   
  358.   _Nop();
  359.   _Nop();
  360.   return(retc);
  361. }



  362. void NoAck_I2c(void)
  363. {
  364.   
  365.   SDA=1;
  366.   _Nop();
  367.   _Nop();
  368.   _Nop();      
  369.   SCL=1;
  370.   _Nop();
  371.   _Nop();              //時鐘低電平周期大于4μ
  372.   _Nop();
  373.   _Nop();
  374.   _Nop();  
  375.   SCL=0;                //清時鐘線,鉗住I2C總線以便繼續(xù)接收
  376.   _Nop();
  377.   _Nop();   
  378. }

  379. void guang()
  380. {
  381. unsigned char num1=0;         //主循環(huán)
  382.   {
  383. num1=255-ReadADC(0);//值取差值,用于顯示光強(qiáng)越小,數(shù)值越小
  384. if(num1 >=70)
  385. {P1=0xff;}
  386. else if(num1>=60)
  387. {P1=0xfe;}
  388. else if(num1>=50)
  389. {P1=0xfc;}
  390. else if(num1>=40)
  391. {P1=0xf8;}
  392. else if(num1>=30)
  393. {P1=0xf0;}
  394. else if(num1>=20)
  395. {P1=0xe0;}
  396. else if(num1>=10)
  397. {P1=0xc0;}
  398. else if(num1>=5)
  399. {P1=0x80;}
  400. else{P1=0x00;}         
  401.   }
  402. }
復(fù)制代碼

所有資料51hei提供下載:

文檔完成品.rar

39.39 KB, 下載次數(shù): 5, 下載積分: 黑幣 -5

220V交流變5V直流正確圖.rar

17.41 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

紅外編碼.rar

27.51 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

文檔仿真.rar

73.65 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: www.久| 九九热九九 | 国产精品波多野结衣 | 天天拍天天色 | 91精品国产美女在线观看 | 午夜理伦三级理论三级在线观看 | 中文字幕视频在线看 | 亚洲vs天堂 | 一级免费毛片 | 国产精品a一区二区三区网址 | 亚洲精品在线观看视频 | 天天天天天天天干 | 成人欧美一区二区三区在线观看 | 欧美极品视频在线观看 | 亚洲a在线观看 | 免费国产一区二区 | 激情五月综合网 | 国产精品高潮呻吟久久 | 中文字幕高清 | 日韩精品一区二区久久 | 中文字幕在线一区二区三区 | 波多野结衣中文字幕一区二区三区 | 在线一区视频 | 国产在线视频一区二区 | 久久久爽爽爽美女图片 | 日韩中文av在线 | 国产精品精品3d动漫 | 91精品国产91| 欧美精品一区在线 | 国产乱精品一区二区三区 | 男女精品网站 | 欧美日韩一区二区在线播放 | 人干人人| 欧美不卡一区二区 | 国产精品大片 | 国产小视频在线观看 | 玖玖玖在线观看 | 人妖一区| 在线国产一区 | www.99热.com| 亚洲a在线观看 |