统会自动语音报时,报时信息包括日期及时间。同时具备显示环境温度的功能。 具体工作流程如以下程序流程图:
主程序:
按键扫描 启用ds1302。初始化lcd以及定时器 每三秒读取温度一次 Lcd显示
Ds18b20子程序:
复位初始化 向ds1820写数据,跳过rom,读数据 读到的数转换为整型 提取百、十、个、小数点后一位 Ds1302子程序: 初始化 Flag=1 Dnum=? Dnum=? 1:小时加一 2:分加一 3:秒加一4:1:小时减一 2:分减一 3:秒减一4:年减 年加一 5:月加一 6:日加一 7:星期一 5:月减一 6:日减一 7:星期减一 加一 计算要显示的数据 送到12684显示
12864 LCD子程序: 设定lcd光标显示、关闭,判断是否忙的函数 初始化lcd设定,调用来自其他子程序的数值 第一行显示日期及平第二行显示时间及星第三行显示温度 闰年 期 完成显示
第四行显示状态信息
定时器定时设定子程序: 设定工作在定时器0工作方式1TMOD = 0x01 ; 开总中断 设定每0.5s调整一次的时间循环,以 共调用 设定每3s调整一次的时间循环,以共调用
在年份显示中设置了闰年判断语句:
//判断闰年,leap=1表示闰年
leap=(nian%4==0 && nian0!=0)||(nian@0==0)?1:0;
//整点自动报时
if ((fen1==0&&fen2==0&&miao1==0&&miao2==0)&&kaiguan==1)
(5) 元件清单。 序号 型号 个数 序号 温度传感器 型号 Ds1820 个数 1 OTP语音芯NY3P035AP8 1 片 晶振 时钟晶振 陶瓷电容 12Mhz 32.768k 30pf 104 排阻 电源插座 自锁开关
1 1 2 2 1 1 1 电阻 开关 时钟芯片 10k Ds1302 5 5 1 10k 5.4mm 液晶显示屏 排针 单片机芯片 12864 Stc89c52 1 若干 1
4) 电路和程序调试过程与结果:
本设计完成了设计任务的所有要求。
单片机采用STC89C52,编译环境为keil,程序使用C语音进行编写。 电路设计使用proteus仿真软件进行仿真调试,在Altium Designer上设计原理图并绘制PCB图。
设计硬件制作比较顺利,很快就把PCB板做好。接着,主要是程序的调试。程序调试的难点在于设计的功能模块过多,程序结构比较复杂,使得调试起来比较费时间
调试结果:
1、完成设计任务的要求1:显示年月日、时分秒、及星期信息。 2、完成设计任务的要求2:具有可调整日期和时间功能。 3、完成设计任务的要求3:闰年计算功能,液晶显示平、闰年。 4、完成设计任务的要求4:实现语音报时。 5、增加功能:实时显示环境气温。
5) 总结
这次课程设计,我们组四个人分工合作。从一开始的选题,然后确定方案、买零件,到最后的设计调试,我们组员都在一起研究讨论。经过这次设计,我们四个人都有了很大的收获,对单片机编程控制有了进一步的了解。
该设计涉及到了单片机的时序控制,数据接口包括并行数据接口以及串行通信接口,同时用到了控制按键、环境信息检测、数据显示处理等。这次设计,基本上涉及到了所有的单片机控制功能模块。因此,通过这次设计,能完全掌握单片机的所有基本控制,这也是我们组选择该题目的一个重要原因。
由于自己经常会做很多电子制作,对硬件电路以及单片机编程都很熟悉,因此在设计本次课程设计时,感觉比较轻松的完成了设计任务。
附录一:源程序名列表。 main.c 文件:
void delay_ms(t) /* 对于12M时钟,约延时1ms */ void Music(z) //语音芯片驱动程序 void main() //主函数
LCD12864.c 文件 (液晶显示) void delayNOP() //延时4us bit lcd_busy()
//检查LCD忙状态
void write_cmd(uchar cmd) //写指令数据到LCD void lcd_wdat(uchar dat) //写显示数据到LCD void lcd_init() //LCD初始化设定
void lcd_pos(uchar X,uchar Y) //设定显示位置 void display()
DS18B20.c 文件 (温度检测)
void dsreset(void)//DS18B20复位,初始化 bit tempreadbit(void) //读一位数据 uchar tempread(void) //读一字节(8位)
void tempwritebyte(uchar dat) //向DS18B20写一个字节数据 void tempchange(void) uint get_temp()
// 开始获取温度并转换
//主显示程序
//获取温度
//数据格式转换
void display2(uint i)
void temper() //显示温度
DS1302.c 文件 (时钟芯片) void delay(int ms)
//延时xms
void WriteByte(uchar Command,uchar WriteData) //写位数据
uchar ReadByte(uchar Command) //读取DS1302一字节数据,address为命令