找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1492|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机智能路灯控制系统仿真程序不显示 求帮助

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. sbit IR=P3^2;  //红外接口标志
  3. #define DataPort P0 //定义数据端口 程序中遇到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};//分别对应相应的数码管点亮,即位码
  14. unsigned char TempData[8]; //存储显示值的全局变量
  15. void delay(unsigned int t); //函数声明
  16. void Display();
  17. void asd(unsigned char t);
  18. void shaomiao(void);
  19. #define AddWr 0x90   //写数据地址
  20. #define AddRd 0x91   //读数据地址
  21. #define  _Nop()  _nop_()  //定义空指令                        
  22. bit ack;                      //应答标志位
  23. sbit SDA=P2^1;
  24. sbit SCL=P2^0;
  25. unsigned char  RcvByte();
  26. extern bit ack;                 //外部点应答
  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;   //清空数据,防止有交替重影
  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<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;   //清空数据,防止有交替重影
  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. }

  142. void tim0_isr (void) interrupt 1 using 1
  143. {
  144.   irtime++;  //用于计数2个下降沿之间的时间
  145. }

  146. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  147. {
  148.   static unsigned char  i;             //接收红外信号处理
  149.   static bit startflag;                //是否开始处理标志位

  150. if(startflag)                        
  151.    {
  152.     if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  153.                         i=0;
  154.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是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下降沿触发,INT0 (P3.2)
  180. EX0 = 1;   //使能外部中断
  181. EA = 1;    //开总中断
  182. }
  183. void Ir_work(void)//红外键值散转程序
  184. {
  185.        switch(IRcord[2])//判断第三个数码值
  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;//处理完成标志

  206.   }
  207. void Ircordpro(void)//红外码值处理函数
  208. {
  209.   unsigned char i, j, k;
  210.   unsigned char cord,value;

  211.   k=1;
  212.   for(i=0;i<4;i++)      //处理4个字节
  213.      {
  214.       for(j=1;j<=8;j++) //处理1个字节8位
  215.          {
  216.           cord=irdata[k];
  217.           if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  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;//处理完毕标志位置1
  229. }

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

  234. while(1)//主循环
  235.    {
  236.     if(kkk==0)
  237.            {guang();}
  238.     if(irok)                        //如果接收好了进行红外处理
  239.           {   
  240.            Ircordpro();
  241.            irok=0;
  242.           }

  243.     if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  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);             //发送器件地址
  254.      if(ack==0)return(0);
  255.    SendByte(0x40|Chl);            //发送器件子地址
  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();                 //发送非应位
  262.    Stop_I2c();                  //结束总线
  263.   return(Val);
  264. }
  265. void Start_I2c()
  266. {
  267.   SDA=1;   //发送起始条件的数据信号
  268.   _Nop();
  269.   SCL=1;
  270.   _Nop();    //起始条件建立时间大于4.7us,延时
  271.   _Nop();
  272.   _Nop();
  273.   _Nop();
  274.   _Nop();   
  275.   SDA=0;     //发送起始信号
  276.   _Nop();    //起始条件锁定时间大于4μ
  277.   _Nop();
  278.   _Nop();
  279.   _Nop();
  280.   _Nop();      
  281.   SCL=0;    //钳住I2C总线,准备发送或接收数据
  282.   _Nop();
  283.   _Nop();
  284. }
  285. void Stop_I2c()
  286. {
  287.   SDA=0;    //发送结束条件的数据信号
  288.   _Nop();   //发送结束条件的时钟信号
  289.   SCL=1;    //结束条件建立时间大于4μ
  290.   _Nop();
  291.   _Nop();
  292.   _Nop();
  293.   _Nop();
  294.   _Nop();
  295.   SDA=1;    //发送I2C总线结束信号
  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++)  //要传送的数据长度为8位
  305.     {
  306.      if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
  307.        else  SDA=0;               
  308.      _Nop();
  309.      SCL=1;               //置时钟线为高,通知被控器开始接收数据位
  310.       _Nop();
  311.       _Nop();             //保证时钟高电平周期大于4μ
  312.       _Nop();
  313.       _Nop();
  314.       _Nop();         
  315.      SCL=0;
  316.     }
  317.    
  318.     _Nop();
  319.     _Nop();
  320.     SDA=1;               //8位发送完后释放数据线,准备接收应答位
  321.     _Nop();
  322.     _Nop();   
  323.     SCL=1;
  324.     _Nop();
  325.     _Nop();
  326.     _Nop();
  327.     if(SDA==1)ack=0;     
  328.        else ack=1;        //判断是否接收到应答信号
  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;             //置数据线为输入方式
  340.   for(BitCnt=0;BitCnt<8;BitCnt++)
  341.       {
  342.         _Nop();           
  343.         SCL=0;       //置时钟线为低,准备接收数据位
  344.         _Nop();
  345.         _Nop();      //时钟低电平周期大于4.7us
  346.         _Nop();
  347.         _Nop();
  348.         _Nop();
  349.         SCL=1;       //置时钟线为高使数据线上数据有效
  350.         _Nop();
  351.         _Nop();
  352.         retc=retc<<1;
  353.         if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入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总线以便继续接收
  376.   _Nop();
  377.   _Nop();   
  378. }

  379. void guang()
  380. {
  381. unsigned char num1=0;         //主循环
  382.   {
  383. num1=255-ReadADC(0);//值取差值,用于显示光强越小,数值越小
  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. }
复制代码

所有资料51hei提供下载:

文档完成品.rar

39.39 KB, 下载次数: 5, 下载积分: 黑币 -5

220V交流变5V直流正确图.rar

17.41 KB, 下载次数: 4, 下载积分: 黑币 -5

红外编码.rar

27.51 KB, 下载次数: 4, 下载积分: 黑币 -5

文档仿真.rar

73.65 KB, 下载次数: 6, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表