基于单片机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 为。基于单片机c51的万年历设计课程设计
相关推荐
们选择方案二。 (3) 输入方案: 题目要求系统能即时的处理外部紧急情况产生的中断,我们讨论了两种方案: 方案一:采用矩阵键盘。 该方案的优点是: 可提供较多 I/O 口 ,实现更多的外 部中断。 直接站单片机的接口少的特点,但操作起来稍显复杂,而且编程也趋于复杂。 方案二:直接在 IO 口线上接上按键开关。 因为设计时精简和优化了电路。 由于该系统对于交通灯等发光二极管的控制,只用单片机本身的
前先发数据数目,接下 来 发送数据, 下位机 接收数据并动态显示在 LED 数码管上。 总体方案 设计 单片机内部有一个全双工的收 发缓冲器 ( SBUF) ,这两个在物理上独立 的接收发射器,即可以接收也可以发射数据,它们 共用同一个 地址 99H。 在串行口的输入输出引脚上加上电平转换器,就可以方便的设计成标准的 RS232 接口。 在设计中以 PC机为主机,单片机为从机,
使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。 在访问外部程序存储器或 16 位地址的外部数据存储器时, P2 口送出高 8位地址数据。 在访问 8 位地址的外部数据存储器时, P2 口线上的内容在整个访问期间不改变。 P3 口: P3 是一个带内部上拉电阻 的 8 位双向 I/O 口, P3 的输出缓冲级可驱动 4 个 TTL 逻辑门电路。 对端口写 “1”
EQU。 左转调整口 TR EQU。 右转调整口 ZS EQU。 停止指示灯 CLK BIT DAT BIT PWMH DATA 30H PWML DATA 31H。 脉宽调制设置 JS DATA 32H。 计数 YS DATA 33H。 延时外层嵌套 TIMER DATA 34H。 延时用寄存器 TIMER1 DATA 35H TEMP DATA 36H TH1_D EQU 0FEH。
r polynomial coefficients % a = denominator polynomial coefficients % N = order of the elliptic filter % Rp = passband ropple in dB。 Rp 0 % Omegac = cutoff frequency in radians/sec % [z, p, k] =
用 了一款专门的电平转换芯片,即 MAX485 接口 芯片。 它 是 Maxim公司的一种 RS- 485 芯片。 采用单一电源 +5V工作,额定电流为 300μ A,采用半双工通讯方式。 它完成将 TTL 电平转换为 RS- 485 电平的功能。 其引脚结构图如图 8 所示。 R 2 1 3 4 8 7 6 5 D R O RE DE DI V c c B A GND 图 3 1 M A X