找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2239|回复: 1
打印 上一主题 下一主题
收起左侧

谁帮我改一下这个程序啊 改成12864显示

[复制链接]
跳转到指定楼层
楼主
ID:86621 发表于 2015-8-7 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
//#include<temp.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P2^5;
sbit jidianqi=P2^7;
sbit s1=P3^4;//功能键
sbit s2=P3^5;//增加键
sbit s3=P3^6;//减小键
sbit beep=P2^3;//蜂鸣器
sbit led1=P1^3;
sbit led2=P1^4;
sbit ds=P2^2; //温度传感器
uint warnl=20;           //下限温度
uint warnh=40;           //上限温度
uint temp;                        //整形温度数据
float f_temp;                //浮点型温度数据
uchar count,stop,s1num,s2num;//其它变量定义
char miao,shi,fen;
uchar code table[]="   :  :   T:    ";//液晶固定显示内容
uchar code table1[]=" L:      H:     ";

void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=124;y>0;y--)
;
}
void di() //蜂鸣器报警声音
{
beep=0;
delay(100);
beep=1;                           
}
/*================液晶操作============*/
void write_com(uchar com)
{//写液晶命令函数
rs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;       
}
void write_date(uchar date)
{//写液晶数据函数
rs=1;
lcden=0;
P0=date;
delay(3);
lcden=1;
delay(3);
lcden=0;       
}
void write_sfm(uchar add,char date)                //1602液晶刷新时分秒函数1为时,4为分,7为秒
{                                       
char shiwei,gewei;
shiwei=date/10;
gewei=date%10;
write_com(0x80+add);
write_date(0x30+shiwei);
write_date(0x30+gewei);
}
void write_nyr(uchar add,char date)
{//1602液晶刷新年月日函数3为年,6为分,9为秒
char shiwei,gewei;
shiwei=date/10;
gewei=date%10;
write_com(0xc0+add);
write_date(0x30+shiwei);
write_date(0x30+gewei);
}
/*==================================================*/
/*==============ds18B20程序=========================*/
void dsreset(void)    //18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)   //读1位函数
{
uint i;
bit dat;
ds=0;i++;          //i++ 起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void)   //读1个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat)   //向18B20写一个字节数据
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)     //写 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;       //写 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void)  //DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);  // 写跳过读ROM指令
tempwritebyte(0x44);  // 写温度转换指令
}
uint get_temp()         //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();         //读低8位
b=tempread();         //读高8位
temp=b;
temp<<=8;            //两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625;      //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp+0.5;    //加0.5是四舍五入
return temp;         //temp是浮点型
}
/*=========================================================================*/
/*========================温度处理========================*/
void deal(uint t)
{
if (t>warnh)
{
jidianqi=0;
TR0=0;
led1=0;
di();
delay(200);
di();
delay(100);
}
if (t>warnl&&t<=warnh)
{
led2=0;
di();
delay(400);
di();
delay(100);
}
}
/*=========================液晶处理=============*/  
void init()
{//初始化函数
uchar num;
s1num=0;
count=0;
fen=0;
miao=0;
shi=0;
lcden=0;
jidianqi=1;
led1=1;
led2=1;
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)//写入液晶固定部分显示
{
write_date(table[num]);
delay(1);
}
write_sfm(7,miao);//分别送去液晶显示
write_sfm(4,fen);
write_sfm(1,shi);
write_com(0x8e);
write_date(0xdf);
write_date(0x43);
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delay(1);
}
write_com(0xc5);
write_date(0xdf);
write_date(0x43);
write_com(0xcd);
write_date(0xdf);
write_date(0x43);
TMOD=0x01;//设置定时器0工作模式1
TH0=(65536-50000)/256;//定时器装初值
TL0=(65536-50000)%256;
EA=1;        //开总中断
ET0=1;        //开定时器0中断
TR0=1;        //启动定时器0
}
/*==================按键处理=============*/
void keyscan()//按键扫描函数
{
if(s1==0)       
{
delay(5);
if(s1==0)//确认功能键被按下
{        s1num++;//功能键按下次数记录
while(!s1);//释放确认
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//第一次被按下时
{
TR0=0;  //关闭定时器
write_com(0x80+7);//光标定位到秒位置
write_com(0x0f); //光标开始闪烁
}
if(s1num==2)//第二次按下光标闪烁定位到分钟位置
{
write_com(0x80+4);
}
if(s1num==3)//第三次按下光标闪烁定位到小时位置
{
write_com(0x80+1);

}
if(s1num==4)
{

write_com(0xc0+3);
}
if(s1num==5)
{
write_com(0xc0+11);
}                                               
if(s1num==6)//第四次按下
{
s1num=0;//记录按键数清零
write_com(0x0c);//取消光标闪烁
TR0=1;        //启动定时器使时钟开始走
}               
}
}
if(s1num!=0)//只有功能键被按下后,增加和减小键才有效
{
if(s2==0)
{
delay(5);
if(s2==0)//增加键确认被按下
{
while(!s2);//按键释放
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//若功能键第一次按下
{
miao++; //则调整秒加1
if(miao==60)//若满60后将清零
miao=0;
write_sfm(7,miao);//每调节一次送液晶显示一下
write_com(0x80+7);//显示位置重新回到调节处
}
if(s1num==2)//若功能键第二次按下
{
fen++;//则调整分钟加1
if(fen==60)//若满60后将清零
fen=0;
write_sfm(4,fen);//每调节一次送液晶显示一下
write_com(0x80+4);//显示位置重新回到调节处
}
if(s1num==3)//若功能键第三次按下
{
shi++;//则调整小时加1
if(shi==24)//若满24后将清零
shi=0;
write_sfm(1,shi);;//每调节一次送液晶显示一下
write_com(0x80+1);//显示位置重新回到调节处
}
if(s1num==4)
{
warnl++;
write_nyr(3,warnl);
write_com(0xc0+3);
}
if(s1num==5)
{
warnh++;
write_nyr(11,warnh);
write_com(0xc0+11);
}                                                       
}
}
if(s3==0)
{
delay(5);
if(s3==0)//确认减小键被按下
{
while(!s3);//按键释放
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//若功能键第一次按下
{
miao--;//则调整秒减1
if(miao==-1)//若减到负数则将其重新设置为59
miao=59;
write_sfm(7,miao);//每调节一次送液晶显示一下
write_com(0x80+7);//显示位置重新回到调节处
}
if(s1num==2)//若功能键第二次按下
{
fen--;//则调整分钟减1
if(fen==-1)//若减到负数则将其重新设置为59
fen=59;
write_sfm(4,fen);//每调节一次送液晶显示一下
write_com(0x80+4);//显示位置重新回到调节处
}
if(s1num==3)//若功能键第二次按下
{
shi--;//则调整小时减1
if(shi==-1)//若减到负数则将其重新设置为23
shi=23;
write_sfm(1,shi);//每调节一次送液晶显示一下
write_com(0x80+1);//显示位置重新回到调节处
}
if(s1num==4)
{
warnl--;
write_nyr(3,warnl);
write_com(0xc0+3);
}
if(s1num==5)
{
warnh--;
write_nyr(11,warnh);
write_com(0xc0+11);
}                                       
}
}
}
}
/*=====================主函数=================*/
void main()
{         
init();//调用初始化函数
while(1)
{       
if (stop>=60)
deal(temp);       
keyscan();//按键扫描                                                       
}
}
void timer0() interrupt 1//定时器0中断服务程序
{
TH0=(65536-50000)/256;//再次装定时器初值
TL0=(65536-50000)%256;
stop++;
if(stop>=100)
stop--;
count++;                //中断次数累加
if(count==20) //20次50毫秒为1秒
{
count=0;
miao++;
if(miao==60)//秒加到60则进位分钟
{
miao=0;//同时秒数清零
fen++;
if(fen==60)//分钟加到60则进位小时
{
fen=0;//同时分钟数清零
shi++;
if(shi==24)//小时加到24则小时清零
{
shi=0;
}
write_sfm(1,shi);//小时若变化则重新写入
}
write_sfm(4,fen);//分钟若变化则重新写入
}
write_sfm(7,miao);//秒若变化则重新写入
tempchange();
write_sfm(12,get_temp());
write_nyr(3,warnl);
write_nyr(11,warnh);       
}       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96218 发表于 2017-11-19 08:33 | 只看该作者
这个比较麻烦哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表