標(biāo)題:
51單片機(jī)教室人數(shù)監(jiān)控系統(tǒng) 12864顯示 Proteus仿真程序
[打印本頁(yè)]
作者:
lhf739181583
時(shí)間:
2020-2-25 16:20
標(biāo)題:
51單片機(jī)教室人數(shù)監(jiān)控系統(tǒng) 12864顯示 Proteus仿真程序
51單片機(jī)12864仿真,教室人數(shù)監(jiān)控系統(tǒng)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei圖片20200225161501.png
(51.06 KB, 下載次數(shù): 91)
下載附件
2020-2-25 16:16 上傳
單片機(jī)源程序如下:
//EDM12864B DRIVE//
/**************************************
PAGEADD為頁(yè)地址起使
TIERADD為行地址起使
DIS_STARTADD為開始命令
CTABLE為漢字字庫(kù)數(shù)組
ETABLE為英文字庫(kù)數(shù)組
***************************************/
#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; //進(jìn)來傳感器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,
};
/********************************
顯示用的延時(shí)函數(shù)
延時(shí)長(zhǎng)度有參數(shù) 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定時(shí)標(biāo)志
unsigned char T0RH = 0; //T0重載值的高字節(jié)
unsigned char T0RL = 0; //T0重載值的低字節(jié)
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; //測(cè)試0831時(shí)使用
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; //進(jìn)入一人
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)//檢測(cè)到有人進(jìn)入
{
if(jin_1==0)
{
number_flag=1;
}
if(chu_1==0)
{
number_flag=2;
}
}
}
}
}
/* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時(shí)變量
tmp = 11059200 / 12; //定時(shí)器計(jì)數(shù)頻率
tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值
tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
tmp = tmp + 12; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = T0RH; //加載T0重載值
TL0 = T0RL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動(dòng)T0
}
/* T0中斷服務(wù)函數(shù),完成1秒定時(shí) */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr1s = 0;
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
tmr1s++;
if (tmr1s >= 100) //定時(shí)1s
{
tmr1s = 0;
flag1s = 1;
}
}
void FullSeat(int num)
{
//座位
C_display_L(0,0*16,0);//0行0列第一個(gè)字
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列第一個(gè)字
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列第一個(gè)字
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列第一個(gè)字
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列第一個(gè)字
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;//讀狀態(tài)標(biāo)志寄存器
_nop;
E=Low;
if((busy&0x90)==0)//檢測(cè)BF和RES位,兩者都為零時(shí)表示可進(jìn)行寫入
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;
}
/***********************************
寫一個(gè)字節(jié)的顯示數(shù)據(jù)
************************************/
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顯示,分為兩個(gè)部分寫入32個(gè)字節(jié)
前16個(gè)字節(jié)寫入第一頁(yè)(16*8),后16個(gè)字節(jié)寫入
第二頁(yè)(16*8)
左側(cè)寫入"歡迎",右側(cè)寫入"使用"
*****************************************************/
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個(gè)字符,左側(cè)寫入6個(gè)
右側(cè)寫入5個(gè),左側(cè)起始從16開始,右側(cè)從
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內(nèi)容
**********************************/
void CLR_DisplayRAM()
{
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
自習(xí)室藍(lán)牙監(jiān)控系統(tǒng)仿真程序.zip
(484.31 KB, 下載次數(shù): 86)
2020-2-25 16:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
自習(xí)室藍(lán)牙監(jiān)控系統(tǒng)仿真.zip
(22.18 KB, 下載次數(shù): 77)
2020-2-25 16:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(jī)源程序如下:
作者:
2500817625
時(shí)間:
2022-4-30 15:44
下載了,仿真LED屏幕亂碼是怎么回事
作者:
cuiyw
時(shí)間:
2022-6-5 15:52
為什么人員只能顯示00或者01
作者:
sheep5618
時(shí)間:
2022-8-14 10:30
人體檢測(cè)有仿真模塊嗎?
作者:
qzyhlf
時(shí)間:
2022-12-9 08:51
下載了,仿真LED屏幕亂碼是怎么回事
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1