找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2702|回复: 0
收起左侧

16*32超级点阵,上位机发送任意汉字到单片机显示(含仿真和源程序)

[复制链接]
ID:290170 发表于 2018-9-17 10:13 | 显示全部楼层 |阅读模式
0.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.jpg

串口32位delphi上位机
0.png 0.png

单片机下位机源程序如下:
  1. #include "reg51.h"
  2. #include "string.h"
  3. sbit P3_2=P3^2;
  4. char receive_data[96];
  5. char flag;
  6. char converse=0;
  7. unsigned char code table[]={
  8. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  9. //串口初始化 晶振为11.0592M 方式1 波特率300-57600
  10. void InitCom(unsigned char BaudRate)
  11. {
  12. unsigned char THTL;
  13. switch (BaudRate)
  14. {
  15. case 1: THTL = 64; break; //波特率300
  16. case 2: THTL = 160; break; //600
  17. case 3: THTL = 208; break; //1200
  18. case 4: THTL = 232; break; //2400
  19. case 5: THTL = 244; break; //4800
  20. case 6: THTL = 250; break; //9600
  21. case 7: THTL = 253; break; //19200
  22. case 8: THTL = 255; break; //57600
  23. default: THTL = 208;
  24. }
  25. SCON = 0x50; //串口方式1,允许接收
  26. TMOD = 0x20; //定时器1定时方式2
  27. TCON = 0x40; //设定时器1开始计数
  28. TH1 = THTL;
  29. TL1 = THTL;
  30. PCON = 0x80; //波特率加倍控制,SMOD位
  31. RI = 0; //清收发标志
  32. TI = 0;
  33. TR1 = 1; //启动定时器
  34. }

  35. //从串口接收一个定长字符串(非中断方式,只用于字符需有一个的idata字符串数组)
  36. //如unsigned char *Str;
  37. //unsigned char i[]="abcd";
  38. //InHandStr = &i;
  39. void ComInStr(unsigned char *Str)
  40. {
  41. while(*Str !='@') //判断是否到了字符串的尾部
  42. {
  43. while(!RI); //空语句判断字符是否收完
  44. *Str = SBUF; //保存字符
  45. RI = 0; //清RI
  46. Str++; //字符串指针加一
  47. converse=1;
  48. }
  49. }

  50. void delay(int c)
  51.     {
  52.     int i,j;
  53.     for(i=0;i<c;i++)
  54.         for(j=0;j<10;j++)
  55.             ;
  56.      }
  57. void delay1s(void)

  58. {

  59.   unsigned char i,j,k;

  60.   for(k=60;k>0;k--)

  61.   for(i=20;i>0;i--)

  62.   for(j=248;j>0;j--);

  63. }
  64. void main()
  65. {
  66.     unsigned char i,j;    //i:每个字的显示循环;j每个字的显示码除以2?
  67.     unsigned int b=0;      //显示偏移控制,char类型最多只能显示14个汉字+一个空白位字符
  68.     unsigned char a;//控制移动间隔时间
  69.    InitCom(6);
  70.       EA=1;
  71.       ES=1;
  72.       ET1=0;
  73.    while(1)
  74.    {  char i;
  75.       ComInStr(receive_data);
  76. while(converse)
  77.     {
  78.     j=0;
  79.     if(a>3) //移动间隔时间;取值0--255
  80.         {
  81.         a=0;
  82.         b+=2;
  83.         if(b>=96)  //显示到最后一个字,回头显示,判断值=字数*32
  84.             {
  85.             b=0;
  86.             }   
  87.         }
  88.      P3_2=1;
  89.      for(i=0;i<16;i++)
  90.         {
  91.         P1=i;
  92.         P0=receive_data[j+b];
  93.         P2=receive_data[j+b+1];
  94.         delay(5);
  95.         P0=0x00;
  96.         P2=0x00;
  97.         j+=2;
  98.         }

  99.      P3_2=0;
  100.      for(i=0;i<16;i++)
  101.         {
  102.         P1=i;
  103.         P0=receive_data[j+b];
  104.         P2=receive_data[j+b+1];
  105.         delay(5);
  106.         P0=0x00;
  107.         P2=0x00;
  108.         j+=2;
  109.         }
  110.         a++;

  111.     }
  112.           
  113.   }


  114. }

  115. //串口接收中断函数
  116. //void serial () interrupt 4 using 3
  117. //{
  118.    //ComInStr(receive_data);
  119.    //flag=1;
  120. //}
复制代码

所有资料51hei提供下载:
led大屏幕点阵屏设计资料.rar (378.82 KB, 下载次数: 78)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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