课程设计报告 - 万年历++温度 - 图文

更新时间:2024-04-06 16:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

天津职业技术师范大学电子工程学院

电子信息工程 课程设计报告

课程设计题目: 基于单片机的电子万年历设计 同组学生姓名(学号):王珂09900120405、王飞龙09900120402

班 级: 电信12技术1班

任务分工: 王 珂:编写程序、软件调试、整理报告

王飞龙:查找资料、硬件连接、整理报告 设计时间: 2013年1月7 日 —— 2013 年 1月18日

指导教师: 姜德宁、王天慧

目 录

题目:基于单片机的电子万年历设计

目 录 ........................................... 1 一、 课程设计的目的与要求(含设计指标) ............ 1 二、 方案论证及选择 ................................ 1 1. 单片机芯片的选择方案和论证 ................... 1 2. 显示模块选择方案和论证 ....................... 1 3. 时钟芯片的选择方案和论证 ..................... 1 4. 电路设计最终方案决定 ......................... 2 三、 原理设计(或基本原理) ........................ 2 1. 基本原理: ................................... 2 2. 总体框图..................................... 2 3. 单元电路设计 ................................. 2 4. 元件列表..................................... 4 四、 方案实现与测试(或调试) ...................... 5 五、 总结 ......................................... 6 六、 个人总结 ..................................... 6 七、 参考书目: .................................... 6

附录:C程序

一、 课程设计的目的与要求(含设计指标)

1. 要有完整的设计过程及设计图 2. 最终的设计结果。 3. 个人总结不少于1000字。

二、 方案论证及选择

1. 单片机芯片的选择方案和论证

方案一:

采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二:

采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,所以选择采用AT89S52作为主控制系统。

2. 显示模块选择方案和论证

方案一:

采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。 方案二:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。 方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,并且我做的最小系统上带一个TS1620-1,和AT89S52已经接好,省了很多麻烦,所以在此设计中采用LCD液晶显示屏。

3. 时钟芯片的选择方案和论证

方案一:

采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA。 方案二:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒

第 1 页

计数。采用此种方案虽然减少芯片的使用,节约成本。虽然实现的时间误差较大,但是,考虑到需要采购芯片,综合考虑,对于课程设计来说能用较省事的方法达到目的最好。

4. 电路设计最终方案决定

综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD液晶显示屏作为显示。

三、 原理设计(或基本原理)

1. 基本原理:

本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD液晶显示屏显示。同时还添加了提醒功能,通过蜂鸣器实现。

2. 总体框图

Lcd1602液晶屏显示模块 STC89C52 主控制模块 图1

晶振振荡模块 键盘模块

3. 单元电路设计

? 单片机主控制模块的设计

AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。单片机的最小系统如下图2所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。 ? 显示模块的设计

如图3为LCD显示模块: 此模块需要注意上拉电阻。

第 2 页

图2

图3

? 温度模块

考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温

第 3 页

度转化成串行数字信号给单片机处理,即可实现温度显示。另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。 DS18B20性能

? ? ? ? ? ? ?

独特的单线接口仅需一个端口引脚进行通信 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗

测温范围-55~+125℃,以0.5℃递增

可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃

? 温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度

转换为数字

? 应用包括温度控制、工业系统、消费品、温度计和任何热感测系统 ? 负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正

常工作

? GND:地

? DQ:单线运用的数据输入/输出引脚 ? VD:可选的电源引脚

4. 元件列表

器件 光汇51单片机开发板 杜邦线 DS18B20 LCD1602液晶屏 数量 1 若干 1 1 第 4 页

四、 方案实现与测试(或调试)

此方案由于只用到51单片机芯片,因此各个功能都是由编程来实现。 大体程序流程框图如下

第 5 页

在本成电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

1)烧入程序后,LCD液晶显示屏显示亮度不好。

解决:一边旋转KT1滑动变阻器,一边观看LCD显示屏,知道看到合适的亮度 为止。

2)蜂鸣器声音过小或没声。

解决:在相应管脚接上拉电阻。

3)液晶屏显示乱码,显示字符错行。

解决:程序在合并时起冲突,调试程序,重新定义变量等;仔细检查程序错误。

五、 总结

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到更多的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。

六、 个人总结 另附

七、 参考书目:

[1] 柴诚敬,刘国维,李阿娜,《化工原理课程设计》,天津,天津科学技术出版社,1994

[2] 网络参考文献资料

附录:程序源代码:

#include #include

#define uchar unsigned char #define uint unsigned int

#define DS18B20

#ifdef DS18B20

#define READROM (0x33) #define MATCHROM (0x55) #define SKIPROM (0xCC) #define SEARCHROM (0xF0) #define ALARMSEARCH (0xEC)

#define WIRTESCRATCHPAD (0x4E) #define READSCRATCHPAD (0xBE) #define COPYSCRATCHPAD (0x48)

第 6 页

#define CONVETT (0x44) #define RECALLE2 (0xB8) #define READPOWERSUPPLY (0xB4) sbit DS18B20_Port = P2^6;

unsigned char T;

unsigned char flag_t = 0;

unsigned char Buffer_DS18B20[9];

unsigned long Temperature_DS18B20_LONG;

unsigned char Temperature_DS18B20_STRING[9] = {0x00}; unsigned char flag_temp = 0;

unsigned char Board_InputOutput_DS18B20(unsigned char _mode);//模式选择:Read_Temp(读取温度),Updata_Info(更新所有信息) #endif

sbit rs=P2^2; sbit rw=P2^1; sbit lcden=P2^0; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2;

uchar count,s1num;

char nian_1,nian_0,yue,ri,week,miao,shi,fen,b,a,c; uchar code table[]=%uchar code table1[]=\void delay(uint z) {

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void write_com(uchar com) {

rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }

第 7 页

void write_date(uchar date) {

rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; }

void init() {

uchar num;

lcden=0; rw=0;

write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);

for(num=0;num<16;num++) {

write_date(table[num]); delay(5); }

write_com(0x80+0x40); for(num=0;num<12;num++) {

write_date(table1[num]); delay(5); } TMOD=0x01;

TH0=(65536-50000)/256; TL0=(65536-50000)%6; EA=1; ET0=1; TR0=1; }

void write_sfm(uchar add,uchar date) {

uchar shi,ge; shi=date/10;

第 8 页

ge=date;

write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); }

void write_sfm1(uchar add,uchar date) {

write_com(0x80+add); write_date(0x30+date); }

void write_sfm2(uchar add,uchar date) {

uchar shi,ge; shi=date/10; ge=date;

write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge); }

void keyscan() {

if(s1==0) {

delay(5); if(s1==0) { s1num++; while(!s1); if(s1num==1) { a=0; TR1=0; TR0=0;

write_com(0x80); write_com(0x0f); } }

if(s1num==2) {

write_com(0x80+2); }

if(s1num==3) {

第 9 页

write_com(0x80+5); }

if(s1num==4) {

write_com(0x80+8); }

if(s1num==5) {

write_com(0x80+15); }

if(s1num==6) {

write_com(0x80+0x40+0); }

if(s1num==7) {

write_com(0x80+0x40+3); }

if(s1num==8) {

write_com(0x80+0x40+6); }

if(s1num==9) {

s1num=0;

write_com(0x0c); TR0=1; TR1=1; a=1; }

}

if(s1num!=0) {

if(s2==0) {

delay(5); if(s2==0) {

while(!s2); if(s1num==1) {

nian_1++;

第 10 页

while(nian_1==99)nian_1=0; write_sfm2(0,nian_1); write_com(0x80+0); }

if(s1num==2) {

nian_0++;

while(nian_0==100)nian_0=0; write_sfm2(2,nian_0); write_com(0x80+2); }

if(s1num==3) {

yue++;

if(yue==13) yue=1;

write_sfm2(5,yue); write_com(0x80+5); }

if(s1num==4) {

ri++;

if(ri==32) ri=1;

write_sfm2(8,ri); write_com(0x80+8); }

if(s1num==5) {

week++;

if(week==8) week=1;

write_sfm1(15,week); write_com(0x80+15); }

if(s1num==6) {

shi++;

if(shi==24) shi=0;

write_sfm(0,shi);

write_com(0x80+0x40+0); }

第 11 页

if(s1num==7) {

fen++;

if(fen==60) fen=0;

write_sfm(3,fen);

write_com(0x80+0x40+3); }

if(s1num==8) {

miao++;

if(miao==60) miao=0;

write_sfm(6,miao);

write_com(0x80+0x40+6); } } }

if(s3==0) {

delay(5); if(s3==0) {

while(!s3); if(s1num==1) {

nian_1--;

if(nian_0==-1) nian_0=99;

write_sfm2(0,nian_1); write_com(0x80+0); }

if(s1num==2) {

nian_0--;

if(nian_0==-1) nian_0=99;

write_sfm2(2,nian_0); write_com(0x80+2); }

if(s1num==3) {

yue--;

if(yue==0)

第 12 页

yue=12;

write_sfm2(5,yue); write_com(0x80+5); }

if(s1num==4) {

ri--; if(ri==0) ri=31;

write_sfm2(8,ri); write_com(0x80+8); }

if(s1num==5) {

week--;

if(week==0) week=7;

write_sfm1(15,week); write_com(0x80+15); }

if(s1num==6) {

shi--;

if(shi==-1) shi=23;

write_sfm(0,shi);

write_com(0x80+0x40+0); }

if(s1num==7) {

fen--;

if(fen==-1) fen=59;

write_sfm(3,fen);

write_com(0x80+0x40+3); }

if(s1num==8) {

miao--;

if(miao==-1) miao=59;

write_sfm(6,miao);

write_com(0x80+0x40+6); }

第 13 页

} } } }

void main() {

init();

nian_1=20;nian_0=14;yue=12;ri=30;week=2;shi=23;fen=59;miao=55; write_sfm2(0,nian_1); write_sfm2(2,nian_0); write_sfm2(5,yue); write_sfm2(8,ri); write_sfm1(15,week); write_sfm(0,shi); write_sfm(3,fen); write_sfm(6,miao); a=1;

while(1) {

if(a==1) {

#ifdef DS18B20 flag_t = 1; while(flag_t){ EA = 0; TR1 = 0;

write_com(0x80+0x40+9);

Board_InputOutput_DS18B20(0x01);

write_date(Temperature_DS18B20_STRING[1]); write_date(Temperature_DS18B20_STRING[2]); write_date(Temperature_DS18B20_STRING[3]); write_date(Temperature_DS18B20_STRING[4]); write_date(Temperature_DS18B20_STRING[5]); write_date(Temperature_DS18B20_STRING[6]); write_date(Temperature_DS18B20_STRING[7]); T = (Temperature_DS18B20_STRING[1]-0x30)*10 (Temperature_DS18B20_STRING[2]-0x30);

if(T>=26||T<19)//////////////////////// {

flag_t = 1; SPK = 1; }

第 14 页

+

else {

flag_t = 0; SPK = 0; } }

EA = 1; TR1 = 1; #endif }

keyscan();

if(b==0){bee();b++;} if(c==0){bee1();c++;} } }

void timer0() interrupt 1 {

TH0=(65536-50000)/256; TL0=(65536-50000)%6; count++; if(count==15) {

count=0;

miao++;

if(miao==60) {

miao=0; fen++;

if(fen==60) {

fen=0; shi++;

if(shi==24) {

shi=0; week++;

if(week==8) {

week=1; }

第 15 页

write_sfm1(15,week); ri++; if(ri>28) {

if(nian_0%4==0) {

switch(yue)

{ case 1: if(ri==32){ri=1;yue++;}break; case 2: if(ri==30){ri=1;yue++;}break; case 3: if(ri==32){ri=1;yue++;}break; case 4: if(ri==31){ri=1;yue++;}break; case 5: if(ri==32){ri=1;yue++;}break; case 6: if(ri==31){ri=1;yue++;}break; case 7: if(ri==32){ri=1;yue++;}break; case 8: if(ri==32){ri=1;yue++;}break; case 9: if(ri==31){ri=1;yue++;}break; case 10: if(ri==32){ri=1;yue++;}break; case 11: if(ri==31){ri=1;yue++;}break; case 12: if(ri==32){ri=1;yue++;}break;} }

else{

switch(yue) {

case 1: if(ri==32){ri=1;yue++;}break; case 2: if(ri==29){ri=1;yue++;}break; case 3: if(ri==32){ri=1;yue++;}break; case 4: if(ri==31){ri=1;yue++;}break; case 5: if(ri==32){ri=1;yue++;}break; case 6: if(ri==31){ri=1;yue++;}break; case 7: if(ri==32){ri=1;yue++;}break; case 8: if(ri==32){ri=1;yue++;}break; case 9: if(ri==31){ri=1;yue++;}break; case 10: if(ri==32){ri=1;yue++;}break; case 11: if(ri==31){ri=1;yue++;}break; case 12: if(ri==32){ri=1;yue++;}break; } }

if(yue==13){ yue=1; nian_0++;

if(nian_0==100){nian_0=0;nian_1++;

if(nian_1==99){nian_1=0;} }

第 16 页

}

write_sfm2(0,nian_1); write_sfm2(2,nian_0); write_sfm2(5,yue); }

write_sfm2(8,ri); }

write_sfm(0,shi); }

write_sfm(3,fen); }

write_sfm(6,miao); } }

#ifdef DS18B20

void Delay_DS18B20_us(unsigned char _t){while(--_t);} void Delay_DS18B20_ms(unsigned

_t){while(_t--){Delay_DS18B20_us(245);Delay_DS18B20_us(245);}} void DS18B20_WriteByte(unsigned char _byte) {

unsigned char i = 0; for(i = 0; i < 8; i++) {

DS18B20_Port = 0;

DS18B20_Port = _byte & 0x01; Delay_DS18B20_us(25); DS18B20_Port = 1; _byte >>= 1; }

Delay_DS18B20_us(25); }

unsigned char DS18B20_ReadByte(void) {

unsigned char dat; unsigned char i = 0; for(i = 0; i < 8; i++) {

DS18B20_Port = 0; dat >>= 1;

DS18B20_Port = 1;

_nop_();_nop_();_nop_();_nop_();_nop_();

第 17 页

char

if(DS18B20_Port){dat |= 0x80;} Delay_DS18B20_us(25); }

return dat; }

unsigned char DS18B20_Initialization(void) {

unsigned char flag = 0; DS18B20_Port = 1; Delay_DS18B20_us(5); DS18B20_Port = 0;

Delay_DS18B20_us(200); Delay_DS18B20_us(200); DS18B20_Port = 1; Delay_DS18B20_us(50); flag = DS18B20_Port; Delay_DS18B20_us(25); return flag; }

void DS18B20_Updata_Info(void) {

unsigned char i = 0;

DS18B20_Initialization(); DS18B20_WriteByte(SKIPROM); DS18B20_WriteByte(CONVETT); Delay_DS18B20_ms(10);

DS18B20_Initialization();

DS18B20_WriteByte(SKIPROM); DS18B20_WriteByte(READSCRATCHPAD); for(i=0; i<9; i++) {

Buffer_DS18B20[i] = DS18B20_ReadByte(); } }

void DS18B20_Read_Temp(void) {

unsigned int temperature_ds18b20 = 0; DS18B20_Updata_Info();

temperature_ds18b20 = (unsigned int)Buffer_DS18B20[1] * 0x0100 + (unsigned int)Buffer_DS18B20[0];

Temperature_DS18B20_LONG = (unsigned long)temperature_ds18b20 * 625 ;

Temperature_DS18B20_STRING[8] = '\\0';

Temperature_DS18B20_STRING[7] = 0x30+(Temperature_DS18B20_LONG) /1;

第 18 页

Temperature_DS18B20_STRING[6] = 0x30+(Temperature_DS18B20_LONG0) /10;

Temperature_DS18B20_STRING[5] = 0x30+(Temperature_DS18B20_LONG00) /100;

Temperature_DS18B20_STRING[4] = 0x30+(Temperature_DS18B20_LONG000) /1000;

Temperature_DS18B20_STRING[3] = '.';

Temperature_DS18B20_STRING[2] = 0x30+(Temperature_DS18B20_LONG0000) /10000;

Temperature_DS18B20_STRING[1] = 0x30+(Temperature_DS18B20_LONG00000) /100000;

Temperature_DS18B20_STRING[0] = 0x30+(Temperature_DS18B20_LONG000000)/1000000; }

unsigned char Board_InputOutput_DS18B20(unsigned char _mode) {

switch(_mode) {

case 0x01:DS18B20_Read_Temp(); break; case 0x02:DS18B20_Updata_Info(); break; default :return 1; break; }

return 0; }

#endif

第 19 页

Temperature_DS18B20_STRING[6] = 0x30+(Temperature_DS18B20_LONG0) /10;

Temperature_DS18B20_STRING[5] = 0x30+(Temperature_DS18B20_LONG00) /100;

Temperature_DS18B20_STRING[4] = 0x30+(Temperature_DS18B20_LONG000) /1000;

Temperature_DS18B20_STRING[3] = '.';

Temperature_DS18B20_STRING[2] = 0x30+(Temperature_DS18B20_LONG0000) /10000;

Temperature_DS18B20_STRING[1] = 0x30+(Temperature_DS18B20_LONG00000) /100000;

Temperature_DS18B20_STRING[0] = 0x30+(Temperature_DS18B20_LONG000000)/1000000; }

unsigned char Board_InputOutput_DS18B20(unsigned char _mode) {

switch(_mode) {

case 0x01:DS18B20_Read_Temp(); break; case 0x02:DS18B20_Updata_Info(); break; default :return 1; break; }

return 0; }

#endif

第 19 页

本文来源:https://www.bwwdw.com/article/mkbr.html

Top