#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
#include "temp.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
uchar CNCHAR[6] = "C--";
uchar flag,i,receive,Flag1;
uchar num,speed;
sbit HG=P1^0; //定义人体红外感应模块
sbit pwm1=P3^7; //定义pwm接口1
sbit pwm2=P3^6; //定义pwm接口2
//函数申明
void LcdDisplay(int);
void UsartConfiguration();
void show();
void dianjirun();
void dianjistop();
//主函数
void main(void)
{
LcdInit();
UsartConfiguration();
while(1)
{
show();
LcdDisplay(Ds18b20ReadTemp());
if(HG==1) //感应人体存在和温度过高
dianjirun();
else if(HG==0)
dianjistop();
/*else
{}*/
if(flag==1)
{
switch(receive)
{
case 1: dianjirun(); break; //风扇开
case 2: dianjistop(); break; //风扇关
case 3: TR0=1; speed=17; break; //低速
case 4: TR0=1; speed=15; break; //中速
case 5: TR0=1; speed=12; break; //高速
case 6: dianjirun(); break; //风扇开
case 7: TR0=1; speed=30; break; //停止
}
}
}
}
//电机开
void dianjirun()
{
pwm2=1;
pwm1=0;
}
//电机开
void dianjistop()
{
pwm2=1;
pwm1=1;
}
//显示信息
void show()
{
LcdWriteCom(0x8E);
LcdWriteData('C');
LcdWriteCom(0x80);
LcdWriteData('W');
LcdWriteCom(0x81);
LcdWriteData('e');
LcdWriteCom(0x82);
LcdWriteData('n');
LcdWriteCom(0x83);
LcdWriteData('D');
LcdWriteCom(0x84);
LcdWriteData('u');
LcdWriteCom(0x85);
LcdWriteData(':');
}
//显示停止信息
void showSTOP()
{
LcdWriteCom(0x80+0x40);
LcdWriteData('S');
LcdWriteCom(0x80+0x41);
LcdWriteData('t');
LcdWriteCom(0x80+0x42);
LcdWriteData('o');
LcdWriteCom(0x80+0x43);
LcdWriteData('p');
}
//显示开始信息
void showrun()
{
LcdWriteCom(0x80+0x40);
LcdWriteData('R');
LcdWriteCom(0x80+0x41);
LcdWriteData('u');
LcdWriteCom(0x80+0x42);
LcdWriteData('n');
LcdWriteCom(0x80+0x43);
LcdWriteData('!');
}
void LcdDisplay(int temp) //lcd显示
{
unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0) //当温度值为负数
{
LcdWriteCom(0x87); //写地址 80表示初始地址
SBUF='-'; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
LcdWriteData('-'); //显示负
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
LcdWriteCom(0x87); //写地址 80表示初始地址
LcdWriteData('+'); //显示正
SBUF='+';//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCom(0x88); //写地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
LcdWriteCom(0x89); //写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
LcdWriteCom(0x8A); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
LcdWriteCom(0x8B); //写地址 80表示初始地址
LcdWriteData('.'); //显示 ‘.’
SBUF = '.';//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
LcdWriteCom(0x8C); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
LcdWriteCom(0x8D); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
SBUF = '0'+datas[4]; //将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
for(i=0; i<6; i++)
{
SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器
while (!TI); //等待发送数据完成
TI = 0;
}
if(((temp%1000/100)+10*(temp%10000/1000)>28))
{
showrun();
dianjirun();
}
else
{
showSTOP();
dianjistop();
}
}
//串口初始化
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X21; //设置计数器工作方式2 选择定时器1
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器初始值设置,注意波特率是9600的
TL1=0XFA;
TH0=0XEC; //5ms定时
TL0=0X78;
TR0=0; //默认不启动定时器0
ET0=1;
TR1=1; //打开计数器
ES=1; //打开接收中断
EA=1; //打开总中断
REN=1;
}
//串口中断
void Usart() interrupt 4 //一旦有数据接入,串行口中断触发
{
receive=SBUF-48; //当REN为1时 开始接收数据 将接收到的值赋予receive 这里的是ACSII 所以要减去48
RI=0; //当RI=0 将接收数据存入SBUF寄存器中 清除接收中断标志位 有内部硬件置1,项CPU发出中断请求 在中断服务程序中,必须用软件将其清零, 取消此中断申请
flag=1; //将标志位置1 这个是方便在主程序中查询判断是否已经接收到数据
}
//定时器中断
void timer0 ()interrupt 1
{
TH0=0XEC; //5ms定时
TL0=0X78;
if(num==speed)pwm1=0;
num++;
if(num==20)
{
num=0;
pwm1=1;
}
}
老歪不歪
- 粉丝: 44
- 资源: 4038
最新资源
- Ruby - Ruby 开发 - 常用知识点
- 响应式营销型运动健身器材pbootcms网站模板
- ingress.yaml
- LabVIEW练习44,计算学生三门课(语文,数学,英语)的平均分,并根据平均分划分成绩等级
- densenet模型-基于深度学习对时尚配饰识别-不含数据集图片-含逐行注释和说明文档.zip
- 【C语音期末/课程设计】银行客户管理系统(DevC项目)
- densenet模型-基于深度学习识别电子产品-不含数据集图片-含逐行注释和说明文档.zip
- shufflenet模型-基于卷积神经网络识别地理特征-不含数据集图片-含逐行注释和说明文档.zip
- 西北工业大学编译原理试点班大作业-实现一个能够正常工作的Sysy语法编译器+源代码+文档说明+实验报告
- shufflenet模型-图像分类算法对农作物种类识别-不含数据集图片-含逐行注释和说明文档.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈