单片机课程设计

发布 2022-10-04 22:07:28 阅读 1064

基本工作原理:

pcf8563 有 16 个位寄存器:一个可自动增量的地址寄存器,一个内置 32.768khz的振荡器(带有一个内部集成的电容)一个分频器(用于给实时时钟rtc 提供源时钟)一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个 400khz i2c 总线接口。

所有16 个寄存器设计成可寻址的 8 位并行寄存器,但不是所有位都有用。前两个寄存器(内存地址 00h,01h)用于控制寄存器和状态寄存器,内存地址 02h~08h 用于时钟计数器(秒~年计数器) ,地址 09h~0ch 用于报警寄存器(定义报警条件) ,地址 0dh 控制clkout 管脚的输出频率,地址 0eh 和 0fh 分别用于定时器控制寄存器和定时器寄存器。秒、分钟、小时、日、月、年、分钟报警、小时报警、**警寄存器,编码格式为 bcd, 星期和星期报警寄存器不以 bcd 格式编码。

当一个 rtc 寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟日历芯片的错读。

寄存器概况。

地址寄存器名称 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 00h 控制/状态寄存器1 test 0 stop 0 testc 0 0 0 01h 控制/状态寄存器2 0 0 0 ti/tp af tf aie tie 0dh clkout频率寄存器 fefd1 fd0 0eh 定时器控制寄存器 tetd1 td0 0fh 定时器倒计数数值寄存器定时器倒计数数值。

地址寄存器名称 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 02h 秒 vl 00~59bcd码格式数03h 分钟 - 00~59bcd码格式数 04h 小时 - 00~23bcd码格式数 05h 日 - 01~31bcd码格式数06h 星期0~6 07h 月/世纪 c - 01~12bcd码格式数 08h 年 00~99bcd码格式数 09h分钟报警 ae 00~59bcd码格式数 0ah 小时报警 ae - 00~23bcd码格式数 0bh **警 ae -01~31bcd码格式数 0ch 星期报警 ae - 0~6 2.2 启动和停止条件总线不忙时,数据线和时钟线保持在高电平。数据线(sda)在下降沿而时钟线(scl)为高电平时,为起动条件(s);数据线在上升沿而时钟线为高电平时为停止条件(p),参见图3。

2.3 位传送每个时钟脉冲传送一个数据位,sda线上的数据在时钟脉冲高电平时应保持稳定,否则将成为控制信号,参见图4。 2.

4 标志位在起动条件和停止条件之间,传送器传送给接收器的数据数量没有限制。在每个8位字节后加一个标志位,传送器便产生一个高电平的标志位,这时主设备产生一个附加标志位时钟脉冲。从接受器必须在接收到每个字节后产生一个标志位,主接收器也必须在接收从传送器传送的每个字节后产生一个标志位。

在标志位时钟脉冲出现时,sda线应保持低电平(应考虑起动和保持时间)。传送器应在从设备接收到最后一个字节时变为低电平,而使接收器产生标志位,这时主设备即可产生停止条件。参见图5。

2.5 i2c总线协议用i2c总线传递数据前,接收的设备应先标明地址,在i2c总线起动后,这个地址与第一个传送字节一起被传送出去。pcf8563可以作为一个从接收器或从传送器,此时的时钟信号线scl只能输入信号线,数据信号线sda则为一条双向信号线。

pcf8563的从地址参见图6。

图7所示为pcf8563的具体应用电路图,对图中石英晶片频率的调整,笔者给出3种可行性方法,供参考: 方法1:定值osci电容。

计算所需的电容平均值,用此值的定值电容,通电后在clkout管脚上测出的频率应为32.768khz,测出的频率值偏差取决于石英晶片本身,电容偏差和器件之间的偏差平均为±5×10 -6。平均偏差可达5分钟/年。

方法2:osci微调电容。可通过调整osci管脚的微调电容式振荡器的频率来获得更高的精度,此时可测出通电时管脚clkout上的信号频率为32.

768khz。 方法3:osci输出。

直接测量管脚osci的输出。

1602液晶模块内带标准字库,内部的字符发生存储器(cgrom)已经存储了192个5×7点阵字符,32个5×10点阵字符。另外还有字符生成ram(cgram)节,供用户自定义字符。如表1所示,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的**,比如大写的英文字母“a”的**是01000001b(41h),显示时模块把地址41h中的点阵字符图形显示出来,我们就能看到字母“a”。

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在**显示字符。

c51程序如下:

注:at89s51使用12m晶振]

#include <>

#define lcm_data p1

#define busy 0x80 //用于检测lcm状态字中的busy标识。

sbitlcm_rw p2^0; /定义引脚。

sbitlcm_rs p2^1;

sbitlcm_e p2^2;

void writedatalcm(unsigned char wdlcm);

void writecommandlcm(unsigned char wclcm,buysc);

unsigned char readdatalcm(void);

unsigned char readstatuslcm(void);

void lcminit(void);

void displayonechar(unsigned char x, unsigned char y, unsigned char ddata);

void displaylistchar(unsigned char x, unsigned char y, unsigned char code *ddata);

void delay5ms(void);

void delay400ms(void);

unsigned char code csdn

unsigned char code net

void main(void)

lcminit();lcm初始化。

delay5ms();延时片刻(可不要)

displaylistchar(0, 5, csdn);

displaylistchar(1, 0, net);

readdatalcm();测试用句无意义。

while(1);

/写数据。void writedatalcm(unsigned char wdlcm)

readstatuslcm();检测忙。

lcm_data = wdlcm;

lcm_rs = 1;

lcm_rw = 0;

lcm_e = 0; /若晶振速度太高可以在这后加小的延时。

lcm_e = 0; /延时。

lcm_e = 1;

/写指令。void writecommandlcm(unsigned char wclcm,buysc) /buysc为0时忽略忙检测。

if (buysc) readstatuslcm();根据需要检测忙。

lcm_data = wclcm;

lcm_rs = 0;

lcm_rw = 0;

lcm_e = 0;

lcm_e = 0;

lcm_e = 1;

/读数据。unsigned char readdatalcm(void)

lcm_rs = 1;

lcm_rw = 1;

lcm_e = 0;

lcm_e = 0;

lcm_e = 1;

return(lcm_data);

/读状态。unsigned char readstatuslcm(void)

lcm_data = 0xff;

lcm_rs = 0;

lcm_rw = 1;

lcm_e = 0;

lcm_e = 0;

lcm_e = 1;

while (lcm_data & busy); 检测忙信号。

return(lcm_data);

void lcminit(void) /lcm初始化。

lcm_data = 0;

writecommandlcm(0x38,0); 三次显示模式设置,不检测忙信号。

delay5ms();

writecommandlcm(0x38,0);

delay5ms();

writecommandlcm(0x38,0);

delay5ms();

writecommandlcm(0x38,1); 显示模式设置,开始要求每次检测忙信号。

writecommandlcm(0x08,1); 关闭显示。

writecommandlcm(0x01,1); 显示清屏。

writecommandlcm(0x06,1); 显示光标移动设置。

writecommandlcm(0x0c,1); 显示开及光标设置。

/按指定位置显示一个字符。

void displayonechar(unsigned char x, unsigned char y, unsigned char ddata)

y &=0x1;

x &=0xf; /限制x不能大于15,y不能大于1

if (y) x |=0x40; /当要显示第二行时地址码0x40;

x |=0x80; /算出指令码。

writecommandlcm(x, 0); 这里不检测忙信号,发送地址码。

writedatalcm(ddata);

/按指定位置显示一串字符。

void displaylistchar(unsigned char x, unsigned char y, unsigned char code *ddata)

unsigned char listlength;

listlength = 0;

y &=0x1;

x &=0xf; /限制x不能大于15,y不能大于1

while (ddata[listlength]>0x20) /若到达字串尾则退出。

if (x <=0xf) /x坐标应小于0xf

displayonechar(x, y, ddata[listlength]);显示单个字符。

listlength++;

x++;/5ms延时。

void delay5ms(void)

unsigned int tempcyc = 5552;

while(tempcyc--)

单片机课程设计

可变程序控制器是集微机技术 自动化技术 通讯技术于一体的通用工业控制装置。它可靠性强 性能 比高 使用方便,已在工业控制的各个领域里得到了极为广泛的应用,成为实现工业自动化的一种强有力的工具 1 plc的定义有许多种。国际电工委员会 iec 对plc的定义是 可编程控制器是一种数字运算操作的电子系统...

单片机课程设计

目录。内容提要2 关键词2引言3 一 硬件电路设计3 一 电路板原理3 二 电路元器件3 二 软件设计3 一 秒钟设计方案3 二 时钟设计方案4 结语7单片机时钟设计。内容摘要 一 在实验板上用动态扫描显示00 59秒钟,具体要求如下 一 6m晶振 二 l9 l10显示00 59十进制数并循环,间隔...

单片机课程设计

1 选题背景。1.1 家庭智能防盗报警系统设计的背景及目的。随着经济的发展,人们对防盗 防劫 防火保安设备的需求量大大增加。针对偷盗 抢劫 火灾 煤气泄漏等事故进行检测和报警的系统,其需求也越来越高。家居智能是以家为平台,兼备建筑 自动化,智能化于一体的高效 舒适 安全 便利的家居环境。自动化的家居...