分享

单片机电子广告牌系统设计(原理图+源程序+论文)

 快乐读书法 2016-04-20
基于51单片机制作的电子广告牌系统设计

原理图:



论文预览:





源程序如下:
  1. #include <reg51.h>

  2. #define uint  unsigned int
  3. #define uchar unsigned char
  4. //#define x1    0x80  //第一行坐标
  5. #define x2    0x88        //第三行坐标
  6. #define x3    0x90        //第二行坐标
  7. //#define x4    0x98        //第四行坐标

  8. #define comm  0                //指令标志
  9. #define dat   1                //数据标志

  10. sbit cs   = P0^0;        //高电平为数据,低电平为指令
  11. sbit std  = P0^1;        //数据输出位
  12. sbit sclk = P0^2;        //时钟
  13. sbit psb  = P0^3;   //H=并口; L=串口;
  14. sbit rst  = P0^4;   //Reset Signal 低电平有效


  15. uchar code tab[]={
  16. "计算机发送数据:"
  17. };
  18. uchar code num[]={
  19. "0123456789ABCDEF"
  20. };
  21. uchar buffer[6];        //接收数据缓冲区
  22. uchar display[12];        //显示数据缓冲器
  23. uchar k=0;

  24. void wr_lcd (uchar dat_comm,uchar content);        // 串行传输数据
  25. void delay (uint us);                                                // 延时
  26. void init_lcd(void);                                            //初始化lcd
  27. void init_serial(void);                                                // 初始化串行中断
  28. void chn_disp(uchar code *chn,uchar j);                //显示汉字或字符
  29. void convert(uchar *point);                                        // 数据转换
  30. void chn_disp1(void);                                                // 显示串口送入数据
  31. void clrram(void);                                                        // 清DDRAM


  32. /******************主程序******************/
  33. void main()
  34. {
  35.         SP=0x5f;
  36.         init_serial();      //初始化串口
  37.         init_lcd();                        //初始化LCD
  38.         clrram();                        //清屏
  39.         chn_disp(tab,0);          //显示第1行"计算机发送数据:"
  40.         while(1)
  41.         {
  42.                 if(k==6)                //6个数据已接收到
  43.                 {
  44.                         k=0;
  45.                         convert(buffer);//转换接收数据缓冲区数据
  46.                         chn_disp1();        //显示6个接收数据
  47.                 }        
  48.         }
  49. }

  50. /****************初始化lcd****************/
  51. void init_lcd(void)
  52. {
  53.         rst=1;                                 //液晶复位端无效
  54.         psb=0;                                 //串行输出
  55.         wr_lcd (comm,0x30);  //基本指令动作   
  56.         wr_lcd (comm,0x01);  //清屏,地址指针指向00H
  57.         delay (100);
  58.         wr_lcd (comm,0x06);  //光标的移动方向
  59.         wr_lcd (comm,0x0c);  //开显示,关游标
  60. }
  61. /****************初始化串行中断****************/
  62. void init_serial(void)
  63. {
  64.         SCON = 0x50;                //8位串行口模式1,允许接收,REN=1
  65.         TMOD|= 0x20;                //定时器1工作在模式2
  66.         TH1 = 0xfd;                        //波特率位9600,晶振频率位11.0592MHz
  67.         TL1 = 0xfd;
  68.         ES = 1;             //使能串行口中断
  69.         EA = 1;                                //使能全局中断
  70.         TR1 = 1;                        //启动定时器1
  71. }
  72. /****************串口中断服务程序****************/
  73. void serial_IT(void) interrupt 4
  74. {
  75.         if(RI==1)
  76.         {
  77.                 RI=0;
  78.                 buffer[k++]=SBUF;//将串口接收数据送入接收数据缓冲区
  79.         }
  80. }

  81. /**************显示汉字或字符**************/
  82. void chn_disp(uchar code *chn,uchar j)
  83. {
  84.         uchar i;
  85.         wr_lcd (comm,0x30);  //基本指令动作  
  86.         wr_lcd (comm,0x80);         //设定DDRAM地址至00H
  87.         for (i=0;i<16;i++)
  88.                 wr_lcd (dat,chn[j*16+i]);//显示第j行字符
  89. }

  90. /******************数据转换*******************/
  91. void convert(uchar *point)
  92. {
  93.         uchar i,j1,j2;
  94.         for(i=0;i<6;i++)                        //将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区
  95.         {
  96.                 j1=point[i]/16;                         //高4位
  97.                 j2=point[i]%16;                  //低4位
  98.                 display[2*i]=num[j1];        //换算成显示码
  99.                 display[2*i+1]=num[j2];
  100.         }
  101. }

  102. /**************显示串口送入数据**************/
  103. void chn_disp1(void)
  104. {
  105.         uchar i;
  106.         wr_lcd(comm,0x30);                           //基本指令动作
  107.         wr_lcd(comm,x3);                           //设定DDRAM地址至10H
  108.         for(i=0;i<3;i++)
  109.         {
  110.                 wr_lcd(dat,display[2*i]);  //将显示码送入第二行显示
  111.                 wr_lcd(dat,display[2*i+1]);
  112.                 wr_lcd(comm,x3+2*i+2);
  113.         }
  114.         wr_lcd(comm,x2);                           //设定DDRAM地址至08H
  115.         for(i=0;i<3;i++)
  116.         {
  117.                 wr_lcd(dat,display[2*i+6]);//将显示码送入第三行显示
  118.                 wr_lcd(dat,display[2*i+7]);
  119.                 wr_lcd(comm,x2+2*i+2);
  120.         }
  121. }

  122. /******************清DDRAM******************/
  123. void clrram(void)
  124. {
  125.         wr_lcd (comm,0x30);                           //基本指令动作
  126.         wr_lcd (comm,0x01);                           //清除显示,并将DDRAM清零
  127.         delay (180);
  128. }

  129. /******************       ******************/
  130. void wr_lcd(uchar dat_comm,uchar content)
  131. {
  132.         uchar a,i,j;
  133.         delay(50);
  134.         a=content;                        //指令码或数据码
  135.         cs=1;                                //发送数据
  136.         sclk=0;                                
  137.         std=1;                                //发送5个"1",作为数据起始位
  138.         for(i=0;i<5;i++)
  139.         {
  140.                 sclk=1;
  141.                 sclk=0;
  142.         }
  143.         std=0;                                //发送第6位,R/W=0,写数据
  144.         sclk=1;               
  145.         sclk=0;
  146.         if(dat_comm)                //发送第7位RS
  147.                 std=1;                        //若为高电平,发送数据
  148.         else                                
  149.                 std=0;                        //若为低电平,发送指令
  150.         sclk=1;
  151.         sclk=0;
  152.         std=0;                                //发送第8位"0"
  153.         sclk=1;
  154.         sclk=0;
  155.         for(j=0;j<2;j++)    //将数据位分两个字节发送
  156.         {
  157.                 for(i=0;i<4;i++)//发送数据高4位或低4位
  158.                 {
  159.                         a=a<<1;
  160.                         std=CY;
  161.                         sclk=1;
  162.                         sclk=0;
  163.                 }
  164.                 std=0;
  165.                 for(i=0;i<4;i++)//发送4位"0"
  166.                 {
  167.                         sclk=1;
  168.                         sclk=0;
  169.                 }
  170.         }
  171. }

  172. /******************延时******************/
  173. void delay(uint us)   //delay time
  174. {
  175.         while(us--);
  176. }

复制代码



单片机电子广告牌系统设计(电路原理图+单片机源程序+论文)下载:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多