51单片机课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
数字时钟设计
福州大学
题 目: 数字时钟
姓 名:
学 号:
学 院: 电气
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
与自动化学院
专 业: 电机电器 年 级: 2009 起讫日期: 2012.04.10 ~2012.5.8 指导教师: 蔡逢煌
目 录
1、课程设计目的 ................................................................................... 2 2、课程设计题目和实现目标 ................................................................ 2 3、设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
........................................................................................... 3 4、Proteus仿真原理图 ........................................................................... 5 5、程序流程图 ....................................................................................... 5 6、程序代码 ........................................................................................... 5 7、调试
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
......................................................................................... 35 8、设计心得体会 ................................................................................. 35 9、参考文献 ......................................................................................... 35
1
1、课程设计目的
《MCS-51单片机》课程设计是与《MCS,51单片机》课程相配套的实践教学环节。《MCS,51单片机》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。培养大胆发明创造的设计理念,为今后就业打下良好的基础。
通过课程设计,掌握以下知识和技能:
1( 单片机应用系统的总体方案的设计;
2( 单片机应用系统的硬件设计;
3( 单片机应用系统的软件程序设计;
4( 单片机开发系统的应用和调试能力
2、课程设计题目和实现目标
2.1课程设计题目
.智能电子钟设计
要求:1.能正确显示日期、时间,并且可修该;
2.具有闹铃的功能;
3、秒表功能;
4、数码显示当前温度;
2.2实现目标
使用时钟芯片ds1302实现对时间、日期的计时功能。
使用lcd1602液晶显示屏来显示时钟芯片内部的计时情况。同时闹钟、温度显示、秒表功能也使用液晶屏显示。最终实现的效果是显示屏第一行显示年月日和星期,第二行显示小时、分钟、秒,以及温度值。在经行闹钟设置时,闹钟显示在显示屏第二行,同样秒表功能也显示在第二行。正常时间、闹钟和秒表三个功能通过按键切换,分别显示于显示屏第二行。
闹钟通过闹钟程序实现,当所设闹钟与计时时间相同时,蜂鸣器发出滴滴声。
秒表的设计是通过使用芯片内部定时器0作为计时时基,结合中断程序和按键实现秒表启动、停止和清零的效果。
2
温度测量使用芯片ds18b20,读出的温度在lcd上显示,且具有实时显示测量的功能。能实现显示两位的正温度,并可以在程序内部设置一个温度最大值,当所测温度超过最大值时,LED小灯闪亮以作为报警提示。
3、设计方案
设计的总体思路是时钟芯片1302的数据采集出来以后送入单片机,经过转码以后再送入lcd液晶屏显示。同理18b20所测量的温度通过但数据线送入单片机,经过转码以后送入显示屏,与时间日期同时显示在显示屏上。
具体的设计方案如下:
1602由两行每行十六个显示点阵组成,有八根数据传输线,三根控制线分别为选通位RS,使能位E,读状态位WR。另外还需外接电源线和地线。
在操作过程中首先要注意的一点是由于只有一根指令传输的接线,因此指令数据是一位一位经行传输的。在对显示屏经行操作时,首先要对显示屏经行初始化,设置基本参数。之后再程序中经行操作就可以只写控制字和数据。每显示一个数据都需要先给出数据要显示的地址,之后再传输数据。对显示屏经行写指令操作时要保持RS低电平RW低电平、E高脉冲。而在写入数据时要保持RS高电平、RW低电平、E高脉冲。
将时钟芯片里的每一位数据送入单片机内部寄存器ACC中的地位,然后每取一位数据ACC左移一位,这样去除一个八位数据为一次读取时间。同样向时钟芯片送数据时也是通过将要写入的内容先存入ACC然后每次写入地位数据,写完一位就右移一位。初始化完成后,每次与时钟芯片通信都先写入要通信的地址,再读写数据。
从时钟芯片中读出或者写入的数据是BCD码,因此需要有一个转码过程。这里我在写入数据时设计了一个十六进制数转为BCD码的程序“bcd()”,转码完成后可以使用一个传输写入的程序writeto1302来写入数据,而读出时,在读出程序readfrom1302中直接加入了BCD转十六进制的语句。
转码结束后数据存入数组time[]以便经行进一步的处理。因为lcd显示的是ASC码,且每一位显示一个数字,因此这里要对十六进制数分离并变成ASC码的相应值。
与上述过程相对的是,在每次修改时间的时候,因为此时始终芯片还在工作,因此这个时候需要先停止读入时钟值,我在程序中通过设置一个标志位flag来实现控制,判断标志位的值来控制时间数据的读入。同时在更改数据结束后需要先将更改的结果送入到时钟芯片中,此过程相当于对时钟芯片再次赋值,然后时钟芯片就会在所赋值的基础
3
上继续工作,这样就达到了我们想要的修改时间的效果。
对于温度的处理类似于时间的处理。温度芯片18b20也只有一条数据线,因此使用时间传输时同样的方式,每次读写八位数据组成一字节的数据。通过阅读温度测量芯片的数据手册,可以发现温度转化完成后从芯片中读出两个字节的数据,两字节数据组成了十六位的温度数字值。该值中高五位表示温度的正负,第四位表示温度的小数值。因为在我设计的程序中我只要求显示两位的正温度值,因此这里我将高四位和第四位舍去然后重新组合为一个八位数据,用上边叙述过的同样的方法处理此八位数据然后送入lcd经行显示。
闹钟功能,在这里我定义了三个变量,通过对此三个变量的设置,然后将变量与存储着从时钟芯片中读出的时分秒数据经行对比,当两者相同时,将接有蜂鸣器的引脚置高,再通过一个循环程序时的蜂鸣器发出滴滴的声音。
秒表功能我是用到了单片机内部计时器T0和中断功能。用以前曾经写过的方法,让程序每50MS中断一次并在中断程序中经行循环,当到达一秒时秒位加一。并结合键盘设置有秒表开秒表关和秒表清零功能。
键盘作为整个程序的主要操作点,设有留个独立键盘。K1为位选功能,选中要修改的位;K2是增值功能,是算选中的值加一;K3是减值功能;K4是正常时钟、闹钟、秒表切换的功能位;K5在普通模式下表示闹钟开关,在秒表模式下作为秒表的开关;K6为秒表模式下的清零位,只有在秒表停止时才能动作。
4
4、Proteus仿真原理图
5、程序流程
首先程序开始运行后,可以按下K1键选择要操作的位。每次按下会换一个操作位,位顺序为:秒、分、时、日、月、年、星期。选中星期后,再次按下K1键后程序回到正常运行模式。在选中每一位的时候可以通过K2、K3键来增减数值,内部已经设置好,因此分秒只能在0到59增减变化,时的范围是0到23,而日期则与月份值有关,有大小月份之分。
按下K4键后第二行显示全零,此时为闹钟设置模式,依然用K1选中位,K2K3增减数值,K5控制闹钟开启和关闭。再次按下K4键进入秒表模式,此时按下K5秒表开始运转,再次按下K5秒表停止。在秒表停止的情况下按下K6,秒表清零。
程序内设置温度报警值为35度,当温度高过该值后小灯会闪烁报警。
闹钟时间到以后蜂鸣器发出滴滴的声音。
6、程序代码
#include
#include
#define uchar unsigned char
5
#define uint unsigned int
sbit SCLK=P3^6; //时钟芯片端口设置
sbit IO=P3^4;
sbit CE=P3^5;
sbit ACC0=ACC^0; //定义ACC寄存器中的第1位
sbit ACC7=ACC^7; //定义ACC寄存器中的第八位
sbit LCDE=P2^6; //液晶显示控制端口设置
sbit LCDRS=P2^5;
sbit LCDWR=P2^4;
sbit DQ=P3^7;
sbit BF=P0^7;
sbit K1=P2^0; //独立按键端口设置,mode
sbit K2=P2^1; //add
sbit K3=P2^2; //subtraction sbit K4=P2^3;
sbit K5=P3^0;
sbit K6=P3^1;
sbit LED=P2^7;
sbit ring=P3^2; //alarm pin uchar table[]=" 2012-05-01 MON"; uchar table1[]=" 00:00:00";
uchar code table2[]={32,29,32,31,32,31,32,32,31,32,31,32};
char table3[]={"MON TUE WEN THU FRI SAT SUN"};
char time[]={0x00,0x00,0x00,0x01,0x05,0x06,0x0c};
uchar LED_DIS[]={0,0,0,0,0,0,0,0}; uchar LED_DIS1[]={0,0,0,0,0,0,0,0}; uchar K1_num,flag,temph,templ,timee,K4_num,K5_num;
uchar temp,T,c_miao,c_fen,c_shi,count; char shi,fen,miao;
void delay(uint);
6
void ds1302display(); //*****************NOT USE DIRECTLY
void writebyte(uchar ucDa)
{
uchar i=0;
ACC=ucDa;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
ACC=ACC>>1;
}
}
uchar readbyte(void) {
uchar i=0;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
return(ACC);
}
7
//************
void writeto1302(uchar addr,uchar dat)
{
CE=0;
SCLK=0;
CE=1;
writebyte(addr);
_nop_();
_nop_();
writebyte(dat); //tips the code type of dat is bcd
SCLK=1;
CE=0;
}
uchar readfrom1302(uchar addr) {
uchar dat1,temp;
CE=0;
SCLK=0;
CE=1;
writebyte(addr);
_nop_();
_nop_();
dat1=readbyte();
CE=0;
temp=_cror_(dat1&0xf0,4);
dat1=temp*10+(dat1&0x0f)*10/10;
return(dat1); //将读出的BCD码转为十六进制码 }
//*********lcd read&write bit BusyTest()
8
{
bit result;
LCDRS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
LCDWR=1;
LCDE=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
LCDE=0; //将E恢复低电平
return result; }
void write_com(uchar com) {
while(BusyTest()==1);
LCDRS=0;
LCDWR=0;
LCDE=0;
P0=com;
delay(5);
LCDE=1;
delay(5);
LCDE=0;
}
void write_data(uchar dat) {
while(BusyTest()==1);
LCDRS=1;
LCDWR=0;
9
LCDE=0;
P0=dat;
delay(5);
LCDE=1;
delay(5);
LCDE=0;
}
//********************* //**********************
void bcd() //bcd转码
{
uint i,tmp;
for(i=0;i<7;i++)
{tmp=time[i]/10;
time[i]=time[i]%10;
time[i]=time[i]+tmp*16;
}
}
void writetime() {
writeto1302(0x8e,0x00);//清清除写保护
writeto1302(0x80,time[0]);//秒
writeto1302(0x82,time[1]);//分
writeto1302(0x84,time[2]);//时
writeto1302(0x86,time[3]);//日
writeto1302(0x88,time[4]);//月
writeto1302(0x8a,time[5]);//星期
writeto1302(0x8c,time[6]);//年
writeto1302(0x8e,0x80);//写保护 不允许写入
10
}
void readtime()
{
time[6]=readfrom1302(0x8d);
time[5]=readfrom1302(0x8b);
time[4]=readfrom1302(0x89);
time[3]=readfrom1302(0x87);
time[2]=readfrom1302(0x85);
time[1]=readfrom1302(0x83);
time[0]=readfrom1302(0x81); }
void into()
{
LED_DIS[0]=time[2]/10+0x30;
LED_DIS[1]=time[2]%10+0x30;
LED_DIS[2]=':';
LED_DIS[3]=time[1]/10+0x30;
LED_DIS[4]=time[1]%10+0x30;
LED_DIS[5]=':';
LED_DIS[6]=time[0]/10+0x30;
LED_DIS[7]=time[0]%10+0x30;
LED_DIS1[0]=time[6]/10+0x30;
LED_DIS1[1]=time[6]%10+0x30;
LED_DIS1[2]='-';
LED_DIS1[3]=time[4]/10+0x30;
LED_DIS1[4]=time[4]%10+0x30;
LED_DIS1[5]='-';
LED_DIS1[6]=time[3]/10+0x30;
LED_DIS1[7]=time[3]%10+0x30; }
11
//**************************** //****************************keyscan
void write_lcdline_1(uchar addr,uchar dat) //sfm
{
uchar shiwei,gewei;
shiwei=dat/10;
gewei=dat%10;
write_com(0x80+addr);
write_data(0x30+shiwei);
write_data(0x30+gewei); }
void write_lcdline_2(uchar addr,uchar dat) //sfm
{
uchar shiwei,gewei;
shiwei=dat/10;
gewei=dat%10;
write_com(0x80+0x40+addr);
write_data(0x30+shiwei);
write_data(0x30+gewei); }
void keyscan()
{
if(K6==0)
{
delay(5);
if(K6==0)
{
while(!K6);
if((K4_num==2)&(K5_num==0))
{
12
write_lcdline_2(7,0);
write_lcdline_2(4,0);
write_lcdline_2(1,0);
c_miao=0;
c_fen=0;
c_shi=0;
}
}
}
if(K5==0)
{
delay(5);
if(K5==0)
{
K5_num++;
while(!K5);
if(K5_num==2)
K5_num=0;
}
}
if(K4==0)
{
uint tmp;
uchar s,f,m;
delay(5);
if(K4==0)
{
K4_num++;
while(!K4);
flag=1;
13
s=time[2];
f=time[1];
m=time[0];
if(K4_num==1)
{
uchar i;
write_com(0x80+0x40);
for(i=0;i<9;i++)
{
write_data(table1[i]);
}
}
if(K4_num==2)
{
uchar i;
write_com(0x80+0x40);
for(i=0;i<9;i++)
{
write_data(table1[i]);
}
}
if(K4_num==3)
{
K4_num=0;
tmp=m/10;
m=m%10;
m=m+tmp*16;
tmp=f/10;
f=f%10;
f=f+tmp*16;
14
tmp=s/10;
s=s%10;
s=s+tmp*16;
writeto1302(0x8e,0x00);//清清除写保护
writeto1302(0x80,m);//秒
writeto1302(0x82,f);//分
writeto1302(0x84,s);//时
flag=0;
}
}
}
if(K1==0)
{
delay(5);
if(K1==0)
{
K1_num++;
flag=1;
while(!K1);
if(K1_num==1)
{
write_com(0x80+0x40+7);
write_com(0x0f); //开显示,显示光标,光标闪烁
}
if(K1_num==2)
{
write_com(0x80+0x40+4);
}
if(K1_num==3)
{
15
write_com(0x80+0x40+1);
}
if(K1_num==4)
{
write_com(0x80+9);
}
if(K1_num==5)
{
write_com(0x80+6);
}
if(K1_num==6)
{
write_com(0x80+3);
}
if(K1_num==7)
{
write_com(0x80+12);
}
if(K1_num==8)
{
K1_num=0;
bcd();
writetime();
write_com(0x0c); //关光标,关光标闪烁
flag=0;
}
}
}
if(K1_num!=0)
{
16
if(K2==0)
{
delay(5);
if(K2==0)
{
while(!K2);
if(K1_num==1)
{
if(K4_num==0)
{
time[0]++;
if(time[0]==60)
time[0]=0;
write_lcdline_2(7,time[0]);
write_com(0x80+0x40+7);
}
if(K4_num==1)
{
miao++;
if(miao==60)
miao=0;
write_lcdline_2(7,miao);
write_com(0x80+0x40+7);
}
}
if(K1_num==2)
{
if(K4_num==0)
{
time[1]++;
17
if(time[1]==60)
time[1]=0;
write_lcdline_2(4,time[1]);
write_com(0x80+0x40+4);
}
if(K4_num==1)
{
fen++;
if(fen==60)
fen=0;
write_lcdline_2(4,fen);
write_com(0x80+0x40+4);
}
}
if(K1_num==3)
{
if(K4_num==0)
{
time[2]++;
if(time[2]==24)
time[2]=0;
write_lcdline_2(1,time[2]);
write_com(0x80+0x40+1);
}
if(K4_num==1)
{
shi++;
if(shi==24)
shi=0;
write_lcdline_2(1,shi);
18
write_com(0x80+0x40+1);
}
}
if(K1_num==4)
{
time[3]++;
if(time[3]==table2[time[4]-1])
time[3]=1;
write_lcdline_1(9,time[3]);
write_com(0x80+9);
}
if(K1_num==5)
{
time[4]++;
if(time[4]==13)
time[4]=1;
write_lcdline_1(6,time[4]);
write_com(0x80+6);
}
if(K1_num==6)
{
time[6]++;
if(time[6]==99)
time[6]=0;
write_lcdline_1(3,time[6]);
write_com(0x80+3);
}
if(K1_num==7)
{
time[5]++;
19
if(time[5]==7)
time[5]=0;
if(time[5]==0)
{
write_com(0x80+12);
write_data(table3[time[5]]);
write_data(table3[time[5]+1]);
write_data(table3[time[5]+2]);
}
if(time[5]==1)
{
write_com(0x80+12);
write_data(table3[4]);
write_data(table3[5]);
write_data(table3[6]);
}
if(time[5]==2)
{
write_com(0x80+12);
write_data(table3[8]);
write_data(table3[9]);
write_data(table3[10]);
}
if(time[5]==3)
{
write_com(0x80+12);
write_data(table3[12]);
write_data(table3[13]);
write_data(table3[14]);
}
20
if(time[5]==4)
{
write_com(0x80+12);
write_data(table3[16]);
write_data(table3[17]);
write_data(table3[18]);
}
if(time[5]==5)
{
write_com(0x80+12);
write_data(table3[20]);
write_data(table3[21]);
write_data(table3[22]);
}
if(time[5]==6)
{
write_com(0x80+12);
write_data(table3[24]);
write_data(table3[25]);
write_data(table3[26]);
}
write_com(0x80+12);
}
}
}
if(K3==0)
{
delay(5);
if(K3==0)
{
21
while(!K3);
if(K1_num==1)
{
if(K4_num==0)
{
time[0]--;
if(time[0]==-1)
time[0]=59;
write_lcdline_2(7,time[0]);
write_com(0x80+0x40+7);
}
if(K4_num==1)
{
miao--;
if(miao==-1)
miao=59;
write_lcdline_2(7,miao);
write_com(0x80+0x40+7);
}
}
if(K1_num==2)
{
if(K4_num==0)
{
time[1]--;
if(time[1]==-1)
time[1]=59;
write_lcdline_2(4,time[1]);
write_com(0x80+0x40+4);
}
22
if(K4_num==1)
{
fen--;
if(fen==-1)
fen=59;
write_lcdline_2(4,fen);
write_com(0x80+0x40+4);
}
}
if(K1_num==3)
{
if(K4_num==0)
{
time[2]--;
if(time[2]==-1)
time[2]=23;
write_lcdline_2(1,time[2]);
write_com(0x80+0x40+1);
}
if(K4_num==1)
{
shi--;
if(shi==-1)
shi=23;
write_lcdline_2(1,shi);
write_com(0x80+0x40+1);
}
}
if(K1_num==4)
{
23
time[3]--;
if(time[3]==0)
time[3]=(table2[time[4]-1]-1);
write_lcdline_1(9,time[3]);
write_com(0x80+9);
}
if(K1_num==5)
{
; time[4]--
if(time[4]==0)
time[4]=12;
write_lcdline_1(6,time[4]);
write_com(0x80+6);
}
if(K1_num==6)
{
time[6]--;
if(time[6]==-1)
time[6]=99;
write_lcdline_1(3,time[6]);
write_com(0x80+3);
}
if(K1_num==7) //星期设置
{
time[5]--;
if(time[5]==-1)
time[5]=6;
if(time[5]==0)
{
write_com(0x80+12);
24
write_data(table3[time[5]]);
write_data(table3[time[5]+1]);
write_data(table3[time[5]+2]);
}
if(time[5]==1)
{
write_com(0x80+12);
write_data(table3[4]);
write_data(table3[5]);
write_data(table3[6]);
}
if(time[5]==2)
{
write_com(0x80+12);
write_data(table3[8]);
write_data(table3[9]);
write_data(table3[10]);
}
if(time[5]==3)
{
write_com(0x80+12);
write_data(table3[12]);
write_data(table3[13]);
write_data(table3[14]);
}
if(time[5]==4)
{
write_com(0x80+12);
write_data(table3[16]);
write_data(table3[17]);
25
write_data(table3[18]);
}
if(time[5]==5)
{
write_com(0x80+12);
write_data(table3[20]);
write_data(table3[21]);
write_data(table3[22]);
}
if(time[5]==6)
{
write_com(0x80+12);
write_data(table3[24]);
write_data(table3[25]);
write_data(table3[26]);
}
write_com(0x80+12);
}
}
}
}
}
//***************************** //**************************temprature chip 18b20
bit init18b20()
{
bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表
示不存在
DQ = 1; //先将数据线拉高
26
for(timee=0;timee<2;timee++); //略微延时约6微秒
DQ = 0; //再将数据线从高拉低,要求保持480~960us
for(timee=0;timee<200;timee++); //略微延时约600微秒 ,以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1; //释放数据线(将数据线拉高)
for(timee=0;timee<10;timee++);//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(timee=0;timee<200;timee++); //延时足够长时间,等待存在脉冲输出完毕
return (flag); //返回检测成功标志
}
uchar read_18b20byte()
{
uchar i=0;
uchar dat; //储存读出的一个字节数据
for (i=0;i<8;i++)
{
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ = 0; //单片机从DS18B20读
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
据时,将数据线从高拉低即启动读时序
_nop_(); //等待一个机器周期
DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
for(timee=0;timee<2;timee++); //延时约6us,使主机在15us内采样
dat>>=1;
if(DQ==1)
dat|=0x80; //如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
for(timee=0;timee<8;timee++); //延时3us,两个读时序之间必须有
27
大于1us的恢复期
}
return(dat); //返回读出的十六进制数据
}
void write_18b20byte(uchar dat) //向DS18B20写一个字节数据// {
uchar i=0;
for (i=0; i<8; i++)
{
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat&0x01;
for(timee=0;timee<10;timee++) ;//延时约30us,DS18B20在拉低后的约15~60us
期间从数据线上采样
DQ=1; //释放数据线
for(timee=0;timee<1;timee++);//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; //将dat中的各二进制位数据右移1位
}
for(timee=0;timee<4;timee++);//稍作延时,给硬件一点反应时间 }
//******************************* void get_temp()
{
uchar temph,templ;
init18b20();
write_18b20byte(0xcc); //跳过读ROM指令
write_18b20byte(0x44); //写温度转换指令
delay(200);
init18b20();
28
write_18b20byte(0xcc); //跳过读ROM指令
write_18b20byte(0xbe); //读指令
templ=read_18b20byte(); //低八位
temph=read_18b20byte(); //高八位
if((temph&0xf8)!=0x00)//判断高五位 得到温度正负标志
{
templ=((~templ)+1); //取反
temph=~temph; //取反
if(templ>255) temph++; //如果低8位大于255,向高8位进1
temp=((temph<<4)|(templ>>4)); //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16,遗弃小数部分
}
else
{
temp=((temph<<4)|(templ>>4)); //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16,遗弃小数部分
}
}
void dis18b20()
{
uchar b,c;
b=temp/10; //温度数据处理显示,只取两位,不取负温度值
c=temp%10;
write_com(0x80+0x40+12);
write_data(0x30+b);
write_data(0x30+c);
write_data(0xdf);
write_data(0x43);
}
//**********************************
29
void init()
{
uchar i=0;
ring=0;
T=35;
flag=0;
P0=0;
LCDWR=0;
LCDE=0;
delay(15);
write_com(0x38);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x06);
delay(5);
write_com(0x01);
delay(5);
write_com(0x80+1);
write_data(0x32);
write_data(0x30);
write_com(0x80);
for(i=0;i<15;i++)
{
write_data(table[i]);
}
write_com(0x80+0x40);
for(i=0;i<9;i++)
{
write_data(table1[i]);
30
}
}
void ds1302display() {
uchar i=0;
readtime();
into();
write_com(0x80+0x40+1);
for(i=0;i<8;i++)
{
write_data(LED_DIS[i]);
delay(1);
}
write_com(0x80+3);
for(i=0;i<8;i++)
{
write_data(LED_DIS1[i]);
delay(1);
}
}
void delay(uint n) {
uchar x,y;
for(x=n;x>0;x--)
for(y=100;y>0;y--); }
void alarm() //闹铃函数
{
uchar i;
31
if((shi==time[2])&(fen==time[1])&(miao==time[0]))
{
for(i=0;i<100;i++)
{
ring=~ring;
delay(5);
}
}
ring=0;
}
void miaobiao() //秒表定时器 {
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
bcd();
writetime();
while(1)
{
if(flag==0)
{
if(K4_num==0)
32
ds1302display();
get_temp();
dis18b20();
if(K5_num==1)
alarm();
}
keyscan();
if((K5_num==1)&(K4_num==2))
{ miaobiao();
while(K5_num==1)
{
write_lcdline_2(7,c_miao);
write_lcdline_2(4,c_fen);
write_lcdline_2(1,c_shi);
keyscan();
}
}
else
{
EA=0;
TR0=0;
}
if(temp>T)
{
LED=1;
delay(100);
LED=0;
delay(100);
}
else
33
LED=0;
}
}
void miaobiao_int() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
count++; //长度加1
if(count==2)
{
count=0;
c_miao++;
if(c_miao==11)
{
c_miao=0;
c_fen++;
if(c_fen==60)
{
c_fen=0;
c_shi++;
if(c_shi==60)
{
c_shi=0;
}
}
}
}
}
34
7、调试总结
通过调试,在仿真条件下满足所涉及的要求,达到了预期的设想。
在调试过程中,通过摸索,感受到,将程序写成一个一个的模块更有利于调试。可以对每个模块功能经行单独调试,这样就能够准确地定位问题可能出现的位置,有利于程序的修改。
8、设计心得体会
通过此次单片机课程设计,我取得了很多经验。首先,我学会了如何阅读器件的数据手册。在设计时很重要的一点就是学习使用一些芯片器件,因此对于数据手册的阅读和学习十分必要。通过这次设计我的经验是阅读数据手册首先要初步了解芯片的工作过程皆为时序图。要了解芯片的初始化程序有哪些内容,芯片在工作时如何对其经行操作。其次就是要了解到芯片的数据格式,比如本次设计中用到的1302芯片,其数据为BCD码。另外还有了解芯片如何与单片机本身经行联系产生联系。做到此三点,一个芯片的基本功能就可以利用起来了。
第二点,通过此次课设,我对于调试程序也有了一定的心得认识。我更加深刻地意识到了模块化程序的必要性和便捷之处。通过将程序分函数书写,使得主程序内容非常简练,并且使得主函数里的程序结构十分明确,优化了整个程序的结构和逻辑联系。另外一点,模块化的函数程序对于程序一步一步的调试有着巨大的意义,大幅降低了程序调试的难度,更加便于寻找程序错误点。
第三点是在写程序之前应该构建一个大概的程序流程,脑子里有一个简单的结构,明确每一个功能通过怎样的方式来实现。这个总体的结构对于一个程序的顺利书写是非常重要的。
第四点是通过之前一些练习熟悉了一些写程序的惯用写法和技巧,这对于书写程序中避免错误大有裨益。同时在出现错误时,通过软件编译的提示能很快反应出来错误的类型,并很快找到错误。
参考文献
[1] DS1302数据手册(
[2] DS18B20数据手册(
[3]LCD1602数据手册.
35