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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4971|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产色网 | 最新中文字幕第一页视频 | 特黄特色大片免费视频观看 | 91视视频在线观看入口直接观看 | 国产高清免费 | 午夜精品一区二区三区免费视频 | 午夜日韩 | 正在播放一区二区 | 蜜桃久久| 天堂资源最新在线 | 韩日免费视频 | 四虎精品在线 | 噜噜噜噜狠狠狠7777视频 | 中文字幕视频网 | 国产精品一区一区三区 | 中文字幕精品一区久久久久 | 精品国产伦一区二区三区观看体验 | 国产精品夜夜春夜夜爽久久电影 | 国产精品久久久久久久岛一牛影视 | 亚洲综合在 | 91在线观看 | 日韩在线视频一区 | 久久久国产精品 | 日日日日日日bbbbb视频 | 一二区成人影院电影网 | 国产女人与拘做受免费视频 | 亚洲精品2区 | www国产成人免费观看视频,深夜成人网 | 精品国产乱码久久久久久1区2区 | 亚洲一区电影 | 国产精品1区 | 精品一区二区三区在线播放 | 欧美中文字幕一区 | 91视频观看 | 二区三区视频 | 亚洲电影一区二区三区 | 六月色婷 | 亚洲精品免费在线观看 | 一级女毛片 | 午夜精品久久久久久久星辰影院 | 久草视频观看 |