基于单片机c51的万年历设计课程设计内容摘要:

张毅刚,彭喜元,彭宇 .单片机原理及应用 [M].北京:高等教育出版社, 2020. [8]李升 .单片机原理与接口技术 [M].北京: 北京大学 出版社, 2020. 15 7. 附件 原理图 系统电路图如图 : 系统电路图 元器件清单 表 1元器件清单 元器件名称 型号规格 数量 备注 单片机 STC89S52 1 加 DIP40底座 晶振 1 1 DS1302外部晶振 晶振 2 1 加 2脚 底座 排阻 ( 9引脚) 1 P0口的上拉电阻 USB USB电源接口 1 加 USB电源线一根 可调电阻 10K 1 LCD1602背光调节 16 电阻 10K 8 电阻 390欧 2 电阻 1K或 100 4 电解电容 2200uF 2 电解电容 100uF 2 电解电容 10uF 5 非极性电容 8 非极性电容 33pF 2 发光二极管 红色 LED 2 电源 电池 3V电子 2( 1) 都需要底座 四角开关 微动(脉冲)开关 6 六角开关 按键(自锁式) 1 三极管 PNP( 8550) 1 液晶 LCD1602 1 加 16脚单排插座 时钟芯片 DS1302 1 加 DIP8底座 温度传感器 DS18B20 1 加 3脚 插座 整流二极管 1N4001 2 桥堆 2W10 1 三端稳压器 7805 1 蜂鸣器 BELL 有源蜂鸣器 1 实物图 正常工作 17 正常工作 图 调试状态 18 闹钟设置状态 闹钟设置状态图 19 源程序 include //52 单片机头文件,规定了 52 单片机的寄存器和 IO 口等 include //_nop_空指令及左右循环移位子函数库 define uchar unsigned char //宏定义 define uint unsigned int //宏定义 sbit lcden=P2^6。 //定义下面通过 lcden 来操作 P2^7 口 ,1602 液晶使能控制端 sbit lcdwr=P2^5。 //定义下面通过 lcdrw 来操作 P2^5 口, 1602 读写选择端 sbit lcdrs=P2^4。 //定义选数据寄存器选指令寄存器控制端 sbit sda=P1^1。 //定义 DS1302 数据总线 sbit rst=P1^2。 //DS1320 复位 sbit sck=P1^0。 //定义时钟总线 sbit s1=P3^0。 //定义设置按钮 sbit s2=P3^1。 //定义调时按钮 sbit s3=P3^2。 //定义确定按钮 sbit s4=P3^3。 sbit DQ =P2^0。 //定义 DS18B20 通信端口 sbit ACC0=ACC^0。 sbit ACC7=ACC^7。 sbit BELL=P1^4。 char fen,shi,miao,ri,yue,nian,zhou,s1num,s2num,s4num,flag1,flag2,lshi,lfen。 uchar code table[]={ 2020 }。 //要写入 1602 液晶的数据 uchar code alarm[]={ CLOCK SETTINGS }。 //要写入 1602 液晶的数据 uchar code alarm1[]={ : }。 //要写入 1602 液晶的数据 uchar code table1[]={ : : . }。 //字库中的字可直接以外加 号的形式直接写入 uchar code table2[]={ Wan Nian Li !}。 //欢迎界面 uchar code table3[]={Wo Men Jie Zuo!!}。 //欢迎界面 //*****************星期编码表 ********************************** uchar code Weeks[][3]={{SUN},{MON},{TUE},{WED},{THU},{FRI},{SAT},{SUN}}。 uchar i,j。 //*********************短暂延时 ******************************** void delay0(uint z) { while(z)。 } //*********************毫秒延时 ******************************** void delay(uint z) { uint x,y。 for(x=z。 x0。 x) for(y=110。 y0。 y)。 } 20 //DS18B20 初始化函数 void Init_DS18B20(void) { unsigned char x=0。 DQ = 1。 //DQ 复位 delay0(8)。 //稍做延时 DQ = 0。 //单片机将 DQ 拉低 delay0(80)。 //精确延时 大于 480us DQ = 1。 //拉高总线 delay0(14)。 x=DQ。 //稍做延时后 如果 x=0 则初始化成功 x=1 则初 始化失败 delay0(20)。 } //DS18B20 读一个字节 uchar ReadOneChar(void) { unsigned char i=0。 unsigned char dat = 0。 for (i=8。 i0。 i){ DQ = 0。 // 给脉冲信号 dat=1。 DQ = 1。 // 给脉冲信号 if(DQ) dat|=0x80。 delay0(4)。 } return(dat)。 } //DS18B20 写一个字节 void WriteOneChar(unsigned char dat) { unsigned char i=0。 for (i=8。 i0。 i){ DQ = 0。 DQ = datamp。 0x01。 delay0(5)。 DQ = 1。 dat=1。 } } //DS18B20 读取温度 uint ReadTemperature(void) { unsigned char a=0。 unsigned char b=0。 21 unsigned int t=0。 float tt=0。 Init_DS18B20()。 WriteOneChar(0xCC)。 // 跳过读序号列号的操作 WriteOneChar(0x44)。 // 启动温度转换 Init_DS18B20()。 WriteOneChar(0xCC)。 //跳过读序号列号的操作 WriteOneChar(0xBE)。 //读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度 a=ReadOneChar()。 b=ReadOneChar()。 t=b。 t=8。 t=t|a。 tt=t*。 //将温度的高位与低位合并 t= tt*10+。 //对结果进行 4 舍 5 入 return(t)。 } /********************* 蜂 鸣 器 函 数************************************************/ void didi() { uchar i。 for(i=0。 i60。 i++) { BELL = 0。 delay(1)。 BELL = 1。 delay(1)。 } } /*****************向 1602 液晶中写一个指令 **************************************/ void write_(uchar ) { lcdwr=0。 //lcdwr 为读写控制端, lcdwr=0,这里可不写 lcdrs=0。 //液晶 rs 接口为 0 时 ,写指令, rs 为 1 时写数据 P0=。 //将要写的指令赋给 P0 口, delay(5)。 //由 1602 读写操作时序图,先将指令 赋给 P0 口,延时后将使能 lcden=1。 // 端 lcden 置高,再延时一段时间,然后将 lcden 置低,这样指令 delay(5)。 // 就写入到 LCD 了 lcden=0。 } /**************************** 向 液 晶 写 数 据***************************************/ void write_data(uchar date) 22 { lcdrs=1。 //与写指令类似,这里 lcdrs 设为 1 P0=date。 delay(5)。 lcden=1。 delay(5)。 lcden=0。 } /***************************** 初 使 化 1602 液晶************************************/ void init_1602() { lcdwr=0。 lcden=0。 write_(0x38)。 //设置 LCD 为 16*2 显示、 5*7 点阵、 8 位数据接口模式 write_(0x0c)。 //开显示、不显示光标 write_(0x06)。 //写一个字符后,地 址指针加 1 write_(0x01)。 //显示清 0 P0=0xff。 } /*******************************************************************************/ void gudingtime_1602() { uchar num。 write_(0x80)。 //将指针指向初始位置 for(num=0。 num16。 num++) //循环函数,用于将 2020 写入液晶 write_data(table[num])。 write_(0x80+0x40)。 //将指针指向 1602 液晶的第二行 for(num=0。 num16。 num++) //功能与上同,用于将 : : 写入 write_data(table1[num])。 } void gudingtime_1602_1() { uchar num1。 write_(0x80)。 //将指针指向初始位置 for(num1=0。 num116。 num1++) //循环函数,用于将 2020 写入液晶 write_data(alarm[num1])。 write_(0x80+0x40)。 //将指针指向 1602 液晶的第二行 for(num1=0。 num116。 num1++) //功能与上同,用于将 : : . 写入 write_data(alarm1[num1])。 } /************************** 显 示 初 始 化 界 面 函 数 23 *************************************/ void displaystar(void) { uchar i。 write_(0x80)。 for(i=0。 i16。 i++) write_data(table2[i])。 write_(0x80+0x40)。 for(i=0。 i16。 i++) write_data(table3[i])。 } /*************************** 显 示 时 间 、 日 期 子 函 数*********************************/ void write_sfm(uchar add,uchar time)//用于在 1602上显示年、月、日、时、分、秒。 Add 为。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。