|
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef char int8;
typedef int int16;
typedef long int32;
// LCD1602
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit BUSY = P0^7;
// KEYS
sbit Key1 = P3^4;
sbit Key2 = P3^5;
sbit Key3 = P3^6;
sbit Key4 = P3^7;
sbit BUZZ = P1^2; //BUZZER
//LED
sbit LED1 = P1^0;
#define KEY_DELAY 5 // 按鍵掃描延時
//鍵值
#define K_ALARM 1
#define K_TL 2
#define K_ADD 3
#define K_SUB 4
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口
/******** 1602函數聲明 ********/
void LCD_Initial();
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
void LCD_Write(bit style, unsigned char input);
//1602程序
//內部等待函數**************************************************************
unsigned char LCD_Wait(void)
{
RS=0;
RW=1; _nop_();
E=1; _nop_();
E=0;
return DBPort;
}
//向LCD寫入命令或數據********************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標返回原點
void LCD_Write(bit style, unsigned char input)
{
E=0;
RS=style;
RW=0; _nop_();
DBPort=input; _nop_();//注意順序
E=1; _nop_();//注意順序
E=0; _nop_();
LCD_Wait();
}
//設置顯示模式************************************************************
#define LCD_SHOW 0x04 //顯示開
#define LCD_HIDE 0x00 //顯示關
#define LCD_CURSOR 0x02 //顯示光標
#define LCD_NO_CURSOR 0x00 //無光標
#define LCD_FLASH 0x01 //光標閃動
#define LCD_NO_FLASH 0x00 //光標不閃動
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//設置輸入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 畫面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
void LCD_Initial()
{
E=0;
LCD_Write(LCD_COMMAND,0x38); //8位數據端口,2行顯示,5*7點陣
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動
}
//液晶字符輸入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//將字符輸出到液晶顯示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
void rece_init(void)
{ EA=1; /*CPU開放所有中斷*/
ES=1; /*允許串行口中斷*/
TMOD=0x20; /*定時器/計時器T1為定時器模式,工作于方式2*/
TH1=0xfd; /*向T1置初值*/
TL1=0xfd;
PCON=0x00; /*SMOD=0*/
SCON=0x50; /*數據串行傳輸工作于方式1,波特率9600bit/s,允許接收*/
TR1=1;/*啟動定時器T1*/
}
receive(void)
{ while(!RI); /*等待等待數據接受*/
RI=0;
return SBUF;
}
// 遠程溫濕度控制
uint32 Count=0;
uint8 Rev_dat[16]=0, Alarm=0, Tl=0;
int8 k_val=0,Top=40, Low=10;
void delay(uint16 n)
{ while (n--);
}
void delay_ms(uint16 m)
{ uint16 n;
for (; m>0; m--)
for (n=125; n>0; n--);
}
void main()
{
unsigned char error; //用于檢驗是否出現錯誤
unsigned char checksum; //CRC
uchar TEMP1[7]; //用于記錄溫度
uchar HUMI1[6]; //用于記錄濕度
delay_ms(500); // 上電延時
LCD_Initial(); //初始化液晶
GotoXY(0,0); //選擇溫度顯示位置
Print("Temp: C"); //5格空格
GotoXY(0,1); //選擇濕度顯示位置
Print("Humi: %RH"); //5格空格
Rev_dat[0]=receive();
GotoXY(5,0); //設置溫度顯示位置
TEMP1[0]= Rev_dat[0]/1000+'0'; //溫度百位
if (TEMP1[0]==0x30) TEMP1[0]=0x20;
TEMP1[1]= Rev_dat[0]%1000/100+'0'; //溫度十位
if (TEMP1[1]==0x30 && TEMP1[0]!=0x30) TEMP1[1]=0x20;
TEMP1[2]= Rev_dat[0]%100/10+'0'; //溫度個位
TEMP1[3]=0x2e; //小數點
TEMP1[4]= Rev_dat[0]%10+'0'; //溫度小數點后第一位
TEMP1[5]=0xdf; //顯示溫度符號℃
Print(TEMP1); //輸出溫度
GotoXY(5,1); //設置濕度顯示位置
HUMI1[0]= Rev_dat[0]/1000+'0'; //濕度百位
if (HUMI1[0]==0x30) HUMI1[0]=0x20;
HUMI1[1]= Rev_dat[0]%1000/100+'0'; //濕度十位
if (HUMI1[1]==0x30 && HUMI1[0]!=0x30) HUMI1[1]=0X20;
HUMI1[2]= Rev_dat[0]%100/10+'0'; //濕度個位
HUMI1[3]=0x2E; //小數點
HUMI1[4]= Rev_dat[0]%10+'0'; //濕度小數點后第一位
Print(HUMI1); //輸出濕度
delay(800); //等待足夠長的時間,以進行下一次轉換
}
發送部分發出溫濕度,幫忙加個報警系統,和怎么在1602顯示屏顯示
|
|