C51论文.docx
- 文档编号:12789572
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:32
- 大小:313.09KB
C51论文.docx
《C51论文.docx》由会员分享,可在线阅读,更多相关《C51论文.docx(32页珍藏版)》请在冰点文库上搜索。
C51论文
系别:
电子工程系
专业:
电子信息工程
班级:
电信092
姓名:
孙江船(33)李梦婷(20)
组号:
第十三组
学号:
091021028091021015
指导老师:
杭秋丽
日期:
2011年6月12日
目录
1.设计题目…………………………….3
2.设计目的…………………………….4
3.实验器材…………………………….5
4.功能要求…………………………….6
5.DS18B20及LCM1602使用说明…….7
6.程序清单………………………….8
7.仿真图………………………….9
8.程序流程图……………………….10
9.心得………………………….11
一﹑设计题目:
数字温度计
二﹑设计目的:
(1)掌握单片机定时器的编程方法;
(2)熟练运用C语言程序中的数组、字符串等知识;
(3)熟悉单片机C语言体系内容﹑程序设计方法和开发流程;
(4)综合运用所学的理论知识去解决实际问题;
(5)培养动手能力与查阅资料能力;
(6)进一步加深对C语言的认识;
(7)学会用所学的知识去解决现实生活中的问题与困难,将所学的知识应用到社会中去。
三﹑设计器材:
(1)计算机一台;
(2)微控制器采用AT89C51单片机;
(3)温度传感器采用DS18B20;
(4)LCM1602液晶显示温度及时间。
四﹑功能要求:
(1)测量并显示温度值,温度测量误差≤±1℃;
(2)测量温度范围为-55℃~+128℃;
(3)同时显示当前测量时间、温度;
(4)可调整显示时间;
(5)测量温度超过设定的温度上,指示灯报警;
五﹑DS18B20及LCM1602使用说明:
(一)DS18B20使用基本知识
DS18B20数字温度计是Dallas公司生产的1-Wire,即单总线器件,具有线路简单、体积小的特点。
因此用它来组成上一个测温系统,具有线路简单,在一根通信线上,可以挂很多这样的数字温度计,十分方便。
(二)DS18B20产品的特点
(1)只要求一个端口即可实现通信;
(2)在DS18B20中的每一个器件上都有独一无二的序列号;
(3)实际应用中不需要外部任何元器件即可实现测温;
(4)测量温度范围为-55。
C~+128。
C;
(5)数字温度计的分辨率用户可以从9位到12位选择;
(6)内部有温度上,下限报警设置。
(三)DS18B20
0x33若有一片DS18B20读出序列号
0x55多个DS18B20,用于匹配一个给定序列号的芯片,此后的命令就只针对该芯片
0XCC忽略序列号对所有的DS18B20配置
0xf0读出在线的DS18B20序列号
0xec对温度的上限下限读出报警
0x44温度变化0xbe读温度寄存器
0x4e写温度寄存器0x4b复制温度寄存器
0xb8重调0xb4读供电方式
DQ 数字信号输入/输出端
(四)DS18B20的寄存器控制命令
(1)初始化;
(2)ROM操作命令;
(3)存储器操作命令;
(4)执行/数据;
(5)ReadScratchapd(BEh)—该命令读取暂存器的内容;
(6)ConvertT(44h)--该命令启动一次温度转换而无须其他数据;
(五)LCM1602使用基本知识
寄存器选择功能
RS
R/W
操 作
0
0
指令寄存器(IR)写入
0
1
忙标志和地址计数器读出
1
0
数据寄存器(DR)写入
1
1
数据寄存器读出
1602模块引脚功能
引线号
符号
名称
功能
1
Vss
接地
0V
2
VDD
电路电源
5V±10%
3
VEE
液晶驱动电压
保证VDD-VEE=4.5∽5V电压差
4
RS
寄存器选择信号
H:
数据寄存器L:
指令寄存器
5
R/W
读/写信号
H:
读 L:
写
6
E
片选信号
下降沿触发,锁存数据
7
|
14
DB0
|
DB7
数据线
数据传输
DS18B20初始化时序
六、程序清单
#include
#defineucharunsignedchar//宏定义
#defineuintunsignedint
sbitDQ=P3^7;//接DS18B20
sbiten=P3^4;//接液晶1602E
sbitrs=P3^5;//接液晶1602RS
sbitS1=P3^2;//定义开关S1"控制端"
sbitS2=P3^1;//定义开关S2,"加"
sbitS3=P3^0;//定义开关S1"控制端"
sbitred=P1^0;//定义LED黄灯
sbitgreen=P1^1;//定义LED绿灯
sbitK1=P1^2;//定义控制温度开关的"加"
sbitK2=P1^3;//定义控制温度开关的"减"
ucharcodeb1[]="MON";//定义星期一数组
ucharcodeb2[]="TUE";//定义星期二数组
ucharcodeb3[]="WED";//定义星期三数组
ucharcodeb4[]="THU";//定义星期四数组
ucharcodeb5[]="FRI";//定义星期五数组
ucharcodeb6[]="SET";//定义星期六数组
ucharcodeb7[]="SUN";//定义星期七数组
uchars1num;//定义按键次数
ucharcodej[]="23:
59:
50";//定义时间数组
uchard[4]={0,0,0,0};//百位,十位,个位,小数点定义
uchare,a,p,b;//变量定义
uintt,n,tflag;//变量定义
uchars,f,m,count;//定义十,分,秒,计数
ucharcodeh[]="tem:
";//定义温度数组
ucharth=90;//定义温度为90
voiddelay(uintms)//毫秒延时
{uchart;
while(ms--)
{for(t=0;t<120;t++);
}
}
voiddelay_us(unsignedintnum)//微妙延时
{while(--num);}
voidwrite_com(ucharcom)//液晶命令子函数
{rs=0;en=0;P2=com;delay(5);en=1;delay(5);en=0;}
voidwrite_data(uchardate)//液晶数据子函数*
{rs=1;en=0;P2=date;delay(5);en=1;delay(5);en=0;}
voidinit()//LED液晶显示
{s=23;f=59;m=50;
write_com(0x38);//8位数据模式
write_com(0x06);//右移
write_com(0x0c);//光标不显示,不闪烁
write_com(0x01);//清屏
write_com(0x80+0x00);//显示时间位置
for(n=0;n<8;n++)//循环8次
{write_data(j[n]);}
write_com(0x80+0x40);//显示温度
for(n=0;n<4;n++)//循环4次
{write_data(h[n]);}//显示"tem:
"
write_com(0x80+0x09);//显示星期
for(n=0;n<3;n++)
{write_data(b5[n]);}
write_com(0x80+0x0d);//显示星期报警温度的位置
write_data(th/100+0x30);//百位
write_data(th%100/10+0x30);//十位
write_data(th%10+0x30);}//个位
voidzdinit()//中断初始化函数
{TMOD=0x11;//T0,T1工作方式1
TH0=(65536-50000)/256;//赋初值
TL0=(65536-50000)%256;//赋初值
TH1=(65536-50000)/256;//赋初值
TL1=(65536-50000)%256;EA=1;ET0=1;TR0=1;EX0=1;IT0=1;ET1=1,TR1=1;EX1=1;IT1=1;
}
voidtimer0()interrupt1//定时器T0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;//计数值加1
if(count==5)//时间到
{count=0;//计数值从0开始
m++;//秒加1
if(m==60)//如果秒为60
{m=0;//秒从0开始
f++;//分加1
if(f==60)//如果分为60
{f=0;//分从0开始
s++;//时加1
if(s==24)s=0;//如果时为24,则时从0开始
write_com(0x80+0x00);//送时的位置
write_data(0x30+s/10);//时的十位
write_data(0x30+s%10);//时的个位
}
write_com(0x80+0x03);//送分的位置
write_data(0x30+f/10);//分的十位
write_data(0x30+f%10);//分的个位
}
write_com(0x80+0x06);//送秒的位置
write_data(0x30+m/10);//秒的十位
write_data(0x30+m%10);//秒的个位
}
}
voidkeydown()//按键控制
{if(s1num!
=0)
{if(S2==0)//判断是否按下
{delay(5);if(S2==0)//消抖
{switch(s1num)//开关控制
{case1:
m++;if(m>59)m=0;//秒显示
write_com(0x80+0x06);
write_data(0x30+m/10);
write_data(0x30+m%10);break;
case2:
f++;if(f>59)f=0;//分显示
write_com(0x80+0x03);
write_data(0x30+f/10);
write_data(0x30+f%10);break;
case3:
s++;if(s>23)s=0;//时显示
write_com(0x80+0x00);
write_data(0x30+s/10);
write_data(0x30+s%10);break;
case4:
e++;if(e>7)e=0;//星期显示
write_com(0x80+0x09);
switch(e)//选择控制不同的星期的显示
{case0:
for(n=0;n<3;n++){write_data(b1[n]);}break;//显示星期一
case1:
for(n=0;n<3;n++){write_data(b2[n]);}break;//显示星期二
case2:
for(n=0;n<3;n++){write_data(b3[n]);}break;//显示星期三
case3:
for(n=0;n<3;n++){write_data(b4[n]);}break;//显示星期四
case4:
for(n=0;n<3;n++){write_data(b5[n]);}break;//显示星期五
case5:
for(n=0;n<3;n++){write_data(b6[n]);}break;//显示星期六
case6:
for(n=0;n<3;n++){write_data(b7[n]);}break;//显示星期七
}
break;}
while(S2==0);//释放检测
}
}
}
{if(S3==0)//判断是否按下
{delay(5);if(S3==0)//消抖
{switch(s1num)//开关控制
{case1:
m--;if(m==255)m=59;//秒显示
write_com(0x80+0x06);
write_data(0x30+m/10);
write_data(0x30+m%10);break;
case2:
f--;if(f==255)f=59;//分显示
write_com(0x80+0x03);
write_data(0x30+f/10);
write_data(0x30+f%10);break;
case3:
s--;if(s==255)s=23;//时显示
write_com(0x80+0x00);
write_data(0x30+s/10);
write_data(0x30+s%10);break;
case4:
e++;if(e>7)e=0;//星期显示
write_com(0x80+0x09);
switch(e)//选择控制不同的星期的显示
{case0:
for(n=0;n<3;n++){write_data(b1[n]);}break;//显示星期一
case1:
for(n=0;n<3;n++){write_data(b2[n]);}break;//显示星期二
case2:
for(n=0;n<3;n++){write_data(b3[n]);}
break;//显示星期三
case3:
for(n=0;n<3;n++){write_data(b4[n]);}break;//显示星期四
case4:
for(n=0;n<3;n++){write_data(b5[n]);}break;//显示星期五
case5:
for(n=0;n<3;n++){write_data(b6[n]);}break;//显示星期六
case6:
for(n=0;n<3;n++){write_data(b7[n]);}break;//显示星期七
}
break;}
while(S3==0);}//释放检测
}
}
}
voidinit_18B20(void)//初始化DS18B20函数
{DQ=1;//高电平
delay_us(8);//延时8微妙
DQ=0;//低电平
delay_us(90);//延时90微妙
DQ=1;//高电平
delay_us(40);//延时40微妙
}
readchar()//向DS18B20读字节函数
{unsignedchari=0;
unsignedcharadat=0;
for(i=8;i>0;i--)
{DQ=0;//低电平
adat>>=1;//将数据从18B20移出
DQ=1;//高电平
if(DQ==1)
adat|=0x80;//提取移出的数据
delay_us(10);//延时10微妙
}
return(adat);//将提取数值返回给adat变量
}
winchar(unsignedcharbdat)//向DS18B20写字节函数
{unsignedcharx=0;
for(x=8;x>0;x--)
{DQ=0;
DQ=bdat&0x01;//取出数据低位
delay_us(10);
DQ=1;
bdat>>=1;//将数据按位移入DS18B20
}
}
read_18b20()//从DS18B20读取温度函数
{init_18B20();//初始化18B20
winchar(0xcc);//跳过读序列号
winchar(0x44);//启动温度转换
init_18B20();//初始化18B20
winchar(0xcc);
winchar(0xbe);//读取温度寄存器
a=readchar();//低8位温度数据存放区
b=readchar();//高8位温度数据存放区
}
lcd()//温度显示寄存器
{t=b;t<<=8;t=t|a;//T放在高8位与低8位
if(t<0x0fff)tflag=0;//正数标志为0
else
{t=~t+1;tflag=1;}//负数标志为1
t=t*(0.625);//取小数部分,并将其放大10倍
p=((a&0xf0)>>4)|((b&0x0f)<<4);//提取正整数
return(t);
}
voiddisp18B20()//显示温度
{ucharflagdat;
d[0]=t/1000+0x30;//百位显示
d[1]=t%1000/100+0x30;//十位显示
d[2]=t%100/10+0x30;//个位显示
d[3]=t%10+0x30;//小数点位显示
if(tflag==0)flagdat='';//正负显示
elseflagdat='-';//显示负数
if(d[0]==0x30)//百位灭0
{d[0]='';
if(d[1]==0x30)d[1]='';}//十位灭0
write_com(0x80+0x44);
//LED第二行显第五个字符开始显示
write_data(flagdat);//正负显示位
write_data(d[0]);//百位显示
write_data(d[1]);//十位显示
write_data(d[2]);//个位显示
write_data('.');//小数点显示
write_data(d[3]);//小数点位显示
write_data(0xdf);//摄氏度的°显示
write_data('C');//字母C显示
write_com(0x80+0x09);
write_com(0x80+0x06);
}
voidthtz()//按键温度控制
{
if(K1==0)//判断按键是否按下
{delay(5);//延时
if(K1==0)//延时消抖
{th++;
if(th==128)th=0;//温度加加
while(K1==0);//释放检测
}
write_com(0x80+0x0d);
write_data(th/100+0x30);
write_data(th%100/10+0x30);
write_data(th%10+0x30);
}
if(K2==0)//判断按键是否按下
{delay(5);
if(K2==0)//延时消抖
{th--;
if(th==255)th=127;//温度减减
while(K2==0);//释放检测
}
write_com(0x80+0x0d);
write_data(th/100+0x30);
write_data(th%100/10+0x30);
write_data(th%10+0x30);
}
write_com(0x80+0x0d);//给位置,第一行15个
if(th<99)
{write_com(0x80+0x0d);//如果TH小于99,则百位灭“0”,给地址第一行16个
write_data('');};//显示灭
if(th<9)
{write_com(0x80+0x0d);
write_data('');
write_com(0x80+0x0e);
write_data('');};//如果TH小于9,则十位,
百位灭“0”,给地址第一行15,16个
}
voidtimer1()interrupt3//定时中断
{TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
thtz();//按键温度控制
read_18b20();//从DS18B20读取温度函数
disp18B20();//显示温度
lcd();//温度显示寄存器
}
voidtz()interrupt0//外部中断0请求子函数
{delay(5);if(INT0==0)
{write_com(0x0f);//显示光标
s1num++;
TR0=0;TR1=0;
if(s1num==1)write_com(0x80+0x06);//可变秒位
if(s1num==2)write_com(0x80+0x03);//可变分位
if(s1num==3)write_com(0x80+0x00);//可变十位
if(s1num==4)write_com(0x80+0x09);//可变星期
if(s1num==5)
{s1num=0;
TR0=1;TR1=1;//开温度,
write_com(0x0c);}//灭光标
}
}
voidbaojing()//报警函数
{if(p>=th)//温度为大于90
{red=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C51 论文