找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3712|回复: 4
收起左侧

51单片机教室人数监控系统 12864显示 Proteus仿真程序

[复制链接]
ID:276361 发表于 2020-2-25 16:20 | 显示全部楼层 |阅读模式
51单片机12864仿真,教室人数监控系统
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei图片20200225161501.png

单片机源程序如下:
  1. //EDM12864B DRIVE//
  2. /**************************************
  3.    PAGEADD为页地址起使
  4.    TIERADD为行地址起使
  5.    DIS_STARTADD为开始命令
  6.    CTABLE为汉字字库数组
  7.    ETABLE为英文字库数组
  8. ***************************************/
  9. #include <reg51.h>

  10. #define        uchar unsigned char
  11. #define uint unsigned int
  12. #define High 1
  13. #define Low        0
  14. #define _nop {}
  15. #define PAGEADD 0xb8
  16. #define TIERADD 0x40
  17. #define DIS_STARADD 0xc0
  18. #define All_Seat 50
  19. uint key_value;
  20. sbit DI=P1^4;
  21. sbit E=P1^2;
  22. sbit CS1=P1^1;
  23. sbit CS2=P1^0;
  24. sbit RW=P1^3;
  25. sbit cs=P1^7;
  26. sbit sclk=P1^6;
  27. sbit dout=P1^5;
  28. sbit I2C_SCL = P3^7;
  29. sbit I2C_SDA = P3^6;
  30. sbit jin_1 = P2^0;          //进来传感器1
  31. sbit chu_1 = P2^1;          //出去传感器1

  32. //uchar ntable[]={61,49,57,60,19,49,62,49,60,63,55,2,0,0,6,22,56,
  33. //63,68,61,49,57,60,17,51,63,61};//email:analog2006@hotmail.com
  34. uchar data voltage_display[8];
  35. void Init_LCD(void);
  36. void E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp);
  37. void E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp);
  38. void C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp);
  39. void C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp);
  40. void WRCommand_L(uchar command);
  41. void WRCommand_R(uchar command);
  42. void WRdata_L(uchar ucdata);
  43. void WRdata_R(uchar ucdata);
  44. void CLR_DisplayRAM();
  45. /*****************************
  46.           字符表
  47.          显示"Welcome Use"
  48. ******************************/
  49. uchar code table1[]={
  50. 0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00,//0(0)
  51. 0x00,0x00,0x42,0x7f,0x40,0x00,0x00,0x00,//1


  52. 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,        //"度",8
  53. 0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
  54. 0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
  55. 0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,

  56. 0x10,0x22,0x64,0x0C,0x80,0xFE,0x92,0x92,        //"湿",9
  57. 0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
  58. 0x04,0x04,0xFE,0x41,0x44,0x48,0x50,0x7F,
  59. 0x40,0x40,0x7F,0x50,0x48,0x64,0x40,0x00,

  60. 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,        //"度",10
  61. 0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
  62. 0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
  63. 0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,
  64. };

  65. /********************************
  66.        显示用的延时函数
  67.          延时长度有参数 n 决定
  68. *********************************/


  69. void Delay_nms(uchar n)
  70. { uchar a;
  71.    for(;n>0;n--)
  72.       {
  73.            for(a=0;a<100;a++)
  74.               {
  75.                    _nop;
  76.                    _nop;
  77.                    _nop;
  78.                    _nop;
  79.                    };
  80.            };
  81. }
  82. void FullSeat(int num);
  83. void Remain(int num);
  84. void Staff(int num);
  85. void Temperature(int num);
  86. void humidity(int num);
  87. void dst11();
  88. bit DHT_Start();
  89. bit DHT_ByteRead(unsigned char *dat);
  90. void ConfigTimer0(unsigned int ms);
  91. bit flag1s = 0;          //1s定时标志
  92. unsigned char T0RH = 0;  //T0重载值的高字节
  93. unsigned char T0RL = 0;  //T0重载值的低字节

  94. void main()
  95. {
  96.         bit tmp;
  97.    uchar a=0,temp=0,b=0,number=0,pagenum=0;
  98.    uchar etable[]={0,0,0,0,0,45,53,60,51,63,61,53,10,69,67,53};//Welcome use
  99.    uchar ttable[]={42,57,61,53,19,10,2,0,0,6,18,1,1,18,0,7};//Time:2006/11/07
  100.    char count_remain=0,count_c=0;
  101.    bit flag=1;
  102.    char temperature_buf[2]={0};
  103.    uchar temperature_display[8]={0};
  104.    //uchar voltage=0; //测试0831时使用
  105.    double voltage=0;
  106.    double temp_buffer=0;
  107.    int New_Number=0;
  108.    unsigned char DHT[5];
  109.    int SD,WD;
  110.    static char number_flag;
  111.    EA = 1;            //开总中断
  112.    Init_LCD();
  113.    ConfigTimer0(10);
  114.    DHT_Start();
  115.         //中文显示:欢迎使用液晶模块
  116.    pagenum=0;//在第二行开始显示
  117.    FullSeat(All_Seat);
  118.    Remain(All_Seat-New_Number);
  119.    Staff(New_Number);
  120.    Temperature(0);
  121.    humidity(0);
  122.         while(1)
  123.         {
  124.                 if(flag1s)
  125.                 {
  126.                         DHT_Start();
  127.                         tmp=DHT_ByteRead(&DHT);
  128.                          if(tmp==1)
  129.                            {
  130.                                    WD= DHT[2];
  131.                                    SD=DHT[0];
  132.                                         Temperature(WD);
  133.                                         humidity(SD);
  134.                            }
  135.                 }
  136.                 if(jin_1!=1 || chu_1!=1)
  137.                 {
  138.                         if(number_flag==1 && chu_1==0)
  139.                         {
  140.                                 number_flag=0;  //进入一人
  141.                                 New_Number++;
  142.                                 if(New_Number>50)
  143.                                 {
  144.                                         New_Number=50;
  145.                                 }
  146.                                 Remain(All_Seat-New_Number);
  147.                                 Staff(New_Number);
  148.                                 while(chu_1==0);
  149.                                 continue;
  150.                         }
  151.                         if(number_flag==2 && jin_1==0)
  152.                         {
  153.                                 number_flag=0;  //出去一人
  154.                                 New_Number--;
  155.                                 if(New_Number<0)
  156.                                 {
  157.                                         New_Number=0;
  158.                                 }
  159.                                 Remain(All_Seat-New_Number);
  160.                                 Staff(New_Number);
  161.                                 while(jin_1==0);
  162.                                 continue;
  163.                         }
  164.                         if(number_flag==0)//检测到有人进入
  165.                         {
  166.                                 if(jin_1==0)
  167.                                 {
  168.                                         number_flag=1;
  169.                                 }
  170.                                 if(chu_1==0)
  171.                                 {
  172.                                         number_flag=2;
  173.                                 }
  174.                         }
  175.                        
  176.                 }
  177.                
  178.         }
  179.                
  180. }

  181. /* 配置并启动T0,ms-T0定时时间 */
  182. void ConfigTimer0(unsigned int ms)
  183. {
  184.     unsigned long tmp;  //临时变量
  185.    
  186.     tmp = 11059200 / 12;      //定时器计数频率
  187.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  188.     tmp = 65536 - tmp;        //计算定时器重载值
  189.     tmp = tmp + 12;           //补偿中断响应延时造成的误差
  190.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  191.     T0RL = (unsigned char)tmp;
  192.     TMOD &= 0xF0;   //清零T0的控制位
  193.     TMOD |= 0x01;   //配置T0为模式1
  194.     TH0 = T0RH;     //加载T0重载值
  195.     TL0 = T0RL;
  196.     ET0 = 1;        //使能T0中断
  197.     TR0 = 1;        //启动T0
  198. }

  199. /* T0中断服务函数,完成1秒定时 */
  200. void InterruptTimer0() interrupt 1
  201. {
  202.     static unsigned char tmr1s = 0;
  203.    
  204.     TH0 = T0RH;  //重新加载重载值
  205.     TL0 = T0RL;
  206.     tmr1s++;
  207.     if (tmr1s >= 100)  //定时1s
  208.     {
  209.         tmr1s = 0;
  210.         flag1s = 1;
  211.         }

  212.    
  213. }
  214. void FullSeat(int num)
  215. {
  216.         //座位
  217.         C_display_L(0,0*16,0);//0行0列第一个字
  218.         C_display_L(0,1*16,1);
  219.         E_Display_L(1,2*16,19);
  220.         E_Display_L(1,2*16+8,num/10);
  221.         E_Display_L(1,3*16,num%10);
  222. }
  223. void Remain(int num)
  224. {
  225.         //余座
  226.         C_display_L(2,0*16,4);//0行0列第一个字
  227.         C_display_L(2,1*16,5);
  228.         E_Display_L(3,2*16,19);
  229.         E_Display_L(3,2*16+8,num/10);
  230.         E_Display_L(3,3*16,num%10);
  231. }
  232. void Staff(int num)
  233. {
  234.                 //人员
  235.         C_display_R(0,0*16,2);//0行0列第一个字
  236.         C_display_R(0,1*16,3);
  237.         E_Display_R(1,2*16,19);
  238.         E_Display_R(1,2*16+8,num/10);
  239.         E_Display_R(1,3*16,num%10);
  240. }
  241. void Temperature(int num)
  242. {
  243.         //温度
  244.         C_display_R(2,0*16,6);//0行0列第一个字
  245.         C_display_R(2,1*16,7);
  246.         E_Display_R(3,2*16,19);
  247.         E_Display_R(3,2*16+8,num/10);
  248.         E_Display_R(3,3*16,num%10);
  249.         E_Display_R(3,3*16+8,25);
  250. }
  251. void humidity(int num)
  252. {

  253. //湿度
  254.         C_display_L(4,0*16,8);//0行0列第一个字
  255.         C_display_L(4,1*16,9);
  256.         E_Display_L(5,2*16,19);
  257.         E_Display_L(5,2*16+8,num/10);
  258.         E_Display_L(5,3*16,num%10);
  259.         E_Display_L(5,3*16+8,12);

  260. }
  261. void LCD_Busy()
  262. {
  263.   uchar busy;
  264.   E=Low;
  265.   DI=Low;
  266.   RW=High;
  267.   while(1)
  268.   {
  269.     E=High;
  270.     _nop;
  271.         _nop;
  272.     busy=P0;//读状态标志寄存器
  273.         _nop;
  274.     E=Low;
  275.     if((busy&0x90)==0)//检测BF和RES位,两者都为零时表示可进行写入
  276.     break;
  277.   };
  278. }

  279. /*********************************
  280.         写指令
  281. **********************************/
  282. void WRCommand_L(uchar command)
  283. {
  284.         CS1=High;
  285.         CS2=Low;
  286.         LCD_Busy();
  287.         DI=Low;
  288.         _nop;
  289.         RW=Low;
  290.         _nop;
  291.         E=High;
  292.         _nop;
  293.         P0=command;
  294.         _nop;
  295.         E=Low;
  296.         _nop;
  297. }


  298. void WRCommand_R(uchar command)
  299. {
  300.         CS1=Low;
  301.         CS2=High;
  302.         LCD_Busy();
  303.         DI=Low;
  304.         _nop;
  305.         RW=Low;
  306.         _nop;
  307.         E=High;
  308.         _nop;
  309.         P0=command;
  310.         _nop;
  311.         E=Low;
  312.         _nop;
  313. }


  314. /***********************************
  315.        写一个字节的显示数据
  316. ************************************/
  317. void WRdata_L(uchar ucdata)
  318.   {
  319.    CS1=High;
  320.    CS2=Low;
  321.    LCD_Busy();
  322.    DI=High;
  323.    _nop;
  324.    RW=Low;
  325.    _nop;
  326.    E=High;
  327.    _nop;
  328.    P0=ucdata;
  329.    _nop;
  330.    E=Low;
  331.    _nop;
  332.   }


  333. void WRdata_R(uchar ucdata)
  334.   {
  335.    CS1=Low;
  336.    CS2=High;
  337.    LCD_Busy();  
  338.    DI=High;
  339.    _nop;
  340.    RW=Low;
  341.    _nop;
  342.    E=High;
  343.    _nop;
  344.    P0=ucdata;
  345.    _nop;
  346.    E=Low;
  347.    _nop;
  348.   }

  349. /****************************************************
  350.        字符为16*16显示,分为两个部分写入32个字节
  351.        前16个字节写入第一页(16*8),后16个字节写入
  352.            第二页(16*8)
  353.            左侧写入"欢迎",右侧写入"使用"
  354. *****************************************************/
  355. void C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
  356. {
  357.    uchar k;
  358.    C_Pagenum=PAGEADD|C_Pagenum;
  359.    C_Tiernum=TIERADD|C_Tiernum;
  360.    WRCommand_L(C_Pagenum);
  361.    WRCommand_L(C_Tiernum);
  362.    for(k=0;k<16;k++)
  363.       {
  364.        WRdata_L(table2[C_Temp*32+k]);
  365.           };
  366.    C_Pagenum=C_Pagenum+1;
  367.    WRCommand_L(C_Pagenum);
  368.    WRCommand_L(C_Tiernum);
  369.    for(k=0;k<16;k++)
  370.    {
  371.        WRdata_L(table2[C_Temp*32+k+16]);
  372.    };
  373. }

  374. void C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
  375.   {
  376.    uchar k;
  377.    C_Pagenum=PAGEADD|C_Pagenum;
  378.    C_Tiernum=TIERADD|C_Tiernum;
  379.    WRCommand_R(C_Pagenum);
  380.    WRCommand_R(C_Tiernum);
  381.    for(k=0;k<16;k++)
  382.       {
  383.        WRdata_R(table2[C_Temp*32+k]);
  384.            };
  385.    C_Pagenum=C_Pagenum+1;
  386.    WRCommand_R(C_Pagenum);
  387.    WRCommand_R(C_Tiernum);
  388.    for(k=0;k<16;k++)
  389.       {
  390.        WRdata_R(table2[C_Temp*32+k+16]);
  391.              };
  392.   }

  393. /****************************************
  394.    写入西文字符,共11个字符,左侧写入6个
  395.    右侧写入5个,左侧起始从16开始,右侧从
  396.    0开始
  397. *****************************************/

  398. void E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
  399.   {
  400.    uchar k;
  401.    WRCommand_L(PAGEADD|E_Pagenum);
  402.    WRCommand_L(TIERADD|E_Tiernum);
  403.    for(k=0;k<8;k++)
  404.           {
  405.            WRdata_L(table1[E_Temp*8+k]);
  406.            };
  407.    }   
  408. void E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
  409.    {
  410.    uchar k;
  411.    WRCommand_R(PAGEADD|E_Pagenum);
  412.    WRCommand_R(TIERADD|E_Tiernum);
  413.    for(k=0;k<8;k++)
  414.           {
  415.            WRdata_R(table1[E_Temp*8+k]);
  416.            };
  417.            }

  418. /*********************************
  419.            清除所有显示RAM内容
  420. **********************************/

  421. void CLR_DisplayRAM()
  422.    {
  423. ……………………

  424. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


全部资料51hei下载地址:
自习室蓝牙监控系统仿真程序.zip (484.31 KB, 下载次数: 86)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:976691 发表于 2022-4-30 15:44 | 显示全部楼层
下载了,仿真LED屏幕乱码是怎么回事
回复

使用道具 举报

ID:1026908 发表于 2022-6-5 15:52 | 显示全部楼层
为什么人员只能显示00或者01
回复

使用道具 举报

ID:1042050 发表于 2022-8-14 10:30 | 显示全部楼层
人体检测有仿真模块吗?
回复

使用道具 举报

ID:3802 发表于 2022-12-9 08:51 | 显示全部楼层
下载了,仿真LED屏幕乱码是怎么回事
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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