51單片機12864仿真,教室人數監控系統
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- //EDM12864B DRIVE//
- /**************************************
- PAGEADD為頁地址起使
- TIERADD為行地址起使
- DIS_STARTADD為開始命令
- CTABLE為漢字字庫數組
- ETABLE為英文字庫數組
- ***************************************/
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define High 1
- #define Low 0
- #define _nop {}
- #define PAGEADD 0xb8
- #define TIERADD 0x40
- #define DIS_STARADD 0xc0
- #define All_Seat 50
- uint key_value;
- sbit DI=P1^4;
- sbit E=P1^2;
- sbit CS1=P1^1;
- sbit CS2=P1^0;
- sbit RW=P1^3;
- sbit cs=P1^7;
- sbit sclk=P1^6;
- sbit dout=P1^5;
- sbit I2C_SCL = P3^7;
- sbit I2C_SDA = P3^6;
- sbit jin_1 = P2^0; //進來傳感器1
- sbit chu_1 = P2^1; //出去傳感器1
- //uchar ntable[]={61,49,57,60,19,49,62,49,60,63,55,2,0,0,6,22,56,
- //63,68,61,49,57,60,17,51,63,61};//email:analog2006@hotmail.com
- uchar data voltage_display[8];
- void Init_LCD(void);
- void E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp);
- void E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp);
- void C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp);
- void C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp);
- void WRCommand_L(uchar command);
- void WRCommand_R(uchar command);
- void WRdata_L(uchar ucdata);
- void WRdata_R(uchar ucdata);
- void CLR_DisplayRAM();
- /*****************************
- 字符表
- 顯示"Welcome Use"
- ******************************/
- uchar code table1[]={
- 0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00,//0(0)
- 0x00,0x00,0x42,0x7f,0x40,0x00,0x00,0x00,//1
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5, //"度",8
- 0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
- 0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
- 0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,
- 0x10,0x22,0x64,0x0C,0x80,0xFE,0x92,0x92, //"濕",9
- 0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
- 0x04,0x04,0xFE,0x41,0x44,0x48,0x50,0x7F,
- 0x40,0x40,0x7F,0x50,0x48,0x64,0x40,0x00,
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5, //"度",10
- 0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
- 0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
- 0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,
- };
- /********************************
- 顯示用的延時函數
- 延時長度有參數 n 決定
- *********************************/
- void Delay_nms(uchar n)
- { uchar a;
- for(;n>0;n--)
- {
- for(a=0;a<100;a++)
- {
- _nop;
- _nop;
- _nop;
- _nop;
- };
- };
- }
- void FullSeat(int num);
- void Remain(int num);
- void Staff(int num);
- void Temperature(int num);
- void humidity(int num);
- void dst11();
- bit DHT_Start();
- bit DHT_ByteRead(unsigned char *dat);
- void ConfigTimer0(unsigned int ms);
- bit flag1s = 0; //1s定時標志
- unsigned char T0RH = 0; //T0重載值的高字節
- unsigned char T0RL = 0; //T0重載值的低字節
- void main()
- {
- bit tmp;
- uchar a=0,temp=0,b=0,number=0,pagenum=0;
- uchar etable[]={0,0,0,0,0,45,53,60,51,63,61,53,10,69,67,53};//Welcome use
- uchar ttable[]={42,57,61,53,19,10,2,0,0,6,18,1,1,18,0,7};//Time:2006/11/07
- char count_remain=0,count_c=0;
- bit flag=1;
- char temperature_buf[2]={0};
- uchar temperature_display[8]={0};
- //uchar voltage=0; //測試0831時使用
- double voltage=0;
- double temp_buffer=0;
- int New_Number=0;
- unsigned char DHT[5];
- int SD,WD;
- static char number_flag;
- EA = 1; //開總中斷
- Init_LCD();
- ConfigTimer0(10);
- DHT_Start();
- //中文顯示:歡迎使用液晶模塊
- pagenum=0;//在第二行開始顯示
- FullSeat(All_Seat);
- Remain(All_Seat-New_Number);
- Staff(New_Number);
- Temperature(0);
- humidity(0);
- while(1)
- {
- if(flag1s)
- {
- DHT_Start();
- tmp=DHT_ByteRead(&DHT);
- if(tmp==1)
- {
- WD= DHT[2];
- SD=DHT[0];
- Temperature(WD);
- humidity(SD);
- }
- }
- if(jin_1!=1 || chu_1!=1)
- {
- if(number_flag==1 && chu_1==0)
- {
- number_flag=0; //進入一人
- New_Number++;
- if(New_Number>50)
- {
- New_Number=50;
- }
- Remain(All_Seat-New_Number);
- Staff(New_Number);
- while(chu_1==0);
- continue;
- }
- if(number_flag==2 && jin_1==0)
- {
- number_flag=0; //出去一人
- New_Number--;
- if(New_Number<0)
- {
- New_Number=0;
- }
- Remain(All_Seat-New_Number);
- Staff(New_Number);
- while(jin_1==0);
- continue;
- }
- if(number_flag==0)//檢測到有人進入
- {
- if(jin_1==0)
- {
- number_flag=1;
- }
- if(chu_1==0)
- {
- number_flag=2;
- }
- }
-
- }
-
- }
-
- }
- /* 配置并啟動T0,ms-T0定時時間 */
- void ConfigTimer0(unsigned int ms)
- {
- unsigned long tmp; //臨時變量
-
- tmp = 11059200 / 12; //定時器計數頻率
- tmp = (tmp * ms) / 1000; //計算所需的計數值
- tmp = 65536 - tmp; //計算定時器重載值
- tmp = tmp + 12; //補償中斷響應延時造成的誤差
- T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
- T0RL = (unsigned char)tmp;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0為模式1
- TH0 = T0RH; //加載T0重載值
- TL0 = T0RL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動T0
- }
- /* T0中斷服務函數,完成1秒定時 */
- void InterruptTimer0() interrupt 1
- {
- static unsigned char tmr1s = 0;
-
- TH0 = T0RH; //重新加載重載值
- TL0 = T0RL;
- tmr1s++;
- if (tmr1s >= 100) //定時1s
- {
- tmr1s = 0;
- flag1s = 1;
- }
-
- }
- void FullSeat(int num)
- {
- //座位
- C_display_L(0,0*16,0);//0行0列第一個字
- C_display_L(0,1*16,1);
- E_Display_L(1,2*16,19);
- E_Display_L(1,2*16+8,num/10);
- E_Display_L(1,3*16,num%10);
- }
- void Remain(int num)
- {
- //余座
- C_display_L(2,0*16,4);//0行0列第一個字
- C_display_L(2,1*16,5);
- E_Display_L(3,2*16,19);
- E_Display_L(3,2*16+8,num/10);
- E_Display_L(3,3*16,num%10);
- }
- void Staff(int num)
- {
- //人員
- C_display_R(0,0*16,2);//0行0列第一個字
- C_display_R(0,1*16,3);
- E_Display_R(1,2*16,19);
- E_Display_R(1,2*16+8,num/10);
- E_Display_R(1,3*16,num%10);
- }
- void Temperature(int num)
- {
- //溫度
- C_display_R(2,0*16,6);//0行0列第一個字
- C_display_R(2,1*16,7);
- E_Display_R(3,2*16,19);
- E_Display_R(3,2*16+8,num/10);
- E_Display_R(3,3*16,num%10);
- E_Display_R(3,3*16+8,25);
- }
- void humidity(int num)
- {
-
- //濕度
- C_display_L(4,0*16,8);//0行0列第一個字
- C_display_L(4,1*16,9);
- E_Display_L(5,2*16,19);
- E_Display_L(5,2*16+8,num/10);
- E_Display_L(5,3*16,num%10);
- E_Display_L(5,3*16+8,12);
-
- }
- void LCD_Busy()
- {
- uchar busy;
- E=Low;
- DI=Low;
- RW=High;
- while(1)
- {
- E=High;
- _nop;
- _nop;
- busy=P0;//讀狀態標志寄存器
- _nop;
- E=Low;
- if((busy&0x90)==0)//檢測BF和RES位,兩者都為零時表示可進行寫入
- break;
- };
- }
- /*********************************
- 寫指令
- **********************************/
- void WRCommand_L(uchar command)
- {
- CS1=High;
- CS2=Low;
- LCD_Busy();
- DI=Low;
- _nop;
- RW=Low;
- _nop;
- E=High;
- _nop;
- P0=command;
- _nop;
- E=Low;
- _nop;
- }
- void WRCommand_R(uchar command)
- {
- CS1=Low;
- CS2=High;
- LCD_Busy();
- DI=Low;
- _nop;
- RW=Low;
- _nop;
- E=High;
- _nop;
- P0=command;
- _nop;
- E=Low;
- _nop;
- }
- /***********************************
- 寫一個字節的顯示數據
- ************************************/
- void WRdata_L(uchar ucdata)
- {
- CS1=High;
- CS2=Low;
- LCD_Busy();
- DI=High;
- _nop;
- RW=Low;
- _nop;
- E=High;
- _nop;
- P0=ucdata;
- _nop;
- E=Low;
- _nop;
- }
- void WRdata_R(uchar ucdata)
- {
- CS1=Low;
- CS2=High;
- LCD_Busy();
- DI=High;
- _nop;
- RW=Low;
- _nop;
- E=High;
- _nop;
- P0=ucdata;
- _nop;
- E=Low;
- _nop;
- }
- /****************************************************
- 字符為16*16顯示,分為兩個部分寫入32個字節
- 前16個字節寫入第一頁(16*8),后16個字節寫入
- 第二頁(16*8)
- 左側寫入"歡迎",右側寫入"使用"
- *****************************************************/
- void C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
- {
- uchar k;
- C_Pagenum=PAGEADD|C_Pagenum;
- C_Tiernum=TIERADD|C_Tiernum;
- WRCommand_L(C_Pagenum);
- WRCommand_L(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_L(table2[C_Temp*32+k]);
- };
- C_Pagenum=C_Pagenum+1;
- WRCommand_L(C_Pagenum);
- WRCommand_L(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_L(table2[C_Temp*32+k+16]);
- };
- }
- void C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
- {
- uchar k;
- C_Pagenum=PAGEADD|C_Pagenum;
- C_Tiernum=TIERADD|C_Tiernum;
- WRCommand_R(C_Pagenum);
- WRCommand_R(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_R(table2[C_Temp*32+k]);
- };
- C_Pagenum=C_Pagenum+1;
- WRCommand_R(C_Pagenum);
- WRCommand_R(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_R(table2[C_Temp*32+k+16]);
- };
- }
- /****************************************
- 寫入西文字符,共11個字符,左側寫入6個
- 右側寫入5個,左側起始從16開始,右側從
- 0開始
- *****************************************/
- void E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
- {
- uchar k;
- WRCommand_L(PAGEADD|E_Pagenum);
- WRCommand_L(TIERADD|E_Tiernum);
- for(k=0;k<8;k++)
- {
- WRdata_L(table1[E_Temp*8+k]);
- };
- }
- void E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
- {
- uchar k;
- WRCommand_R(PAGEADD|E_Pagenum);
- WRCommand_R(TIERADD|E_Tiernum);
- for(k=0;k<8;k++)
- {
- WRdata_R(table1[E_Temp*8+k]);
- };
- }
- /*********************************
- 清除所有顯示RAM內容
- **********************************/
- void CLR_DisplayRAM()
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
自習室藍牙監控系統仿真程序.zip
(484.31 KB, 下載次數: 86)
2020-2-25 16:18 上傳
點擊文件名下載附件
自習室藍牙監控系統仿真.zip
(22.18 KB, 下載次數: 77)
2020-2-25 16:18 上傳
點擊文件名下載附件
單片機源程序如下:
|