基于C8051F350的称重系统软件设计 下载本文

常州工学院毕业设计论文 UART0有两个相关的特殊功能寄存器:串行控制寄存器(SCON0)和串行数据缓冲器(SBUF0)。用同一个SBUF0地址可以访问发送寄存器和接收寄存器。写SBUF0时自动访问发送寄存器;读SBUF0时自动访问接收寄存器,不可能从发送数据寄存器中读数据。

如果UART0中断被允许,则每次发送完成(SCON0中的TI0位被置‘1’)或接收到数据字节(SCON0中的RI0位被置‘1’)时将产生一个中断。当CPU转向中断服务程序时硬件不清除UART0中断标志。中断标志必须用软件清除,这就是允许软件查询UART0中断的原因(发送完成或接收完成)。

UART0波特率由定时器1工作在8位自动重装载方式产生。发送(TX)时钟由TL1产生;接收(RX)时钟由TL1的拷贝寄存器产生,该寄存器不能被用户访问。TX和RX定时器的溢出信号经过二分频后用于产生TX和RX波特率。当定时器1被允许时,RX定时器运行并使用与定时器1相同的重载值(TH1)。在检测到RX引脚上的起始条件时RX定时器被强制重载,这允许在检测到起始位时立即开始接收过程,而与TX定时器的状态无关。

定时器1应被配置为方式2,即8位自动重装载方式。定时器1的重载值应设置为使其溢出频率为所期望的波特率频率的两倍。定时器1的时钟可以在6个时钟源中选择:SYSCLK、SYSCLK/4、SYSCLK/12、SYSCLK/48、外部振荡器时钟/8和外部输入T1。对于任何给定的定时器1时钟源,UART0的波特率由方程A和方程B决定:

A)UART波特率=

12×T1溢出率 T1CLK256?TH1B)T1溢出率=

其中T1CLK是定时器1的时钟频率,TH1是定时器1的高字节(重载值)。 UART0的工作方式(8位或9位)通过S0MODE位(SCON0.7)来选择。 在8位UART方式,每个数据字节共使用10位:一个起始位、8个数据位(LSB在先)和一个停止位。数据从TX0引脚发送,在RX0引脚接收。在接收时,8个数据位存入SBUF0,停止位进入RB80(SCON0.2)。

当软件向SBUF0寄存器写入一个字节时开始数据发送。在发送结束时(停止位开始)发送中断标志TI0(SCON0.1)被置‘1’。在接收允许位REN0(SCON0.4)被置‘1’后,数据接收可以在任何时刻开始。收到停止位后,如果满足下述条件则数据字节将被装入到接收寄存器SBUF0:RI0必须为逻辑‘0’;如果MCE0为

41

常州工学院毕业设计论文 逻辑‘1’,则停止位必须为‘1’。在发生接收数据溢出的情况下,先接收到的8位数据被锁存到SBUF0,而后面的溢出数据被丢弃。

如果这些条件满足,则8位数据被存入SBUF0,停止位被存入RB80,RI0标志被置位。如果这些条件不满足,则不装入SBUF0和RB80,RI0标志也不会被置‘1’。如果中断被允许,在TI0或RI0置位时将产生一个中断。

SCON0:UART0控制寄存器

S0MODE - MCE0 REN0 TB80 RB80 TI0 RI0 S0MODE:串行口工作方式选择位(该位选择UART0的工作方式。0:方式0:波特率可编程的8位UART。1:方式1:波特率可编程的9位UART。)

MCE0:多处理器通信允许(该位的功能取决于串行口工作方式。 S0MODE = 0:检查有效停止位。0:停止位的逻辑电平被忽略。1:只有当停止位为逻辑‘1’时RI0激活。S0MODE = 1:多处理器通信允许。0:第9位的逻辑电平被忽略。1:只有当第9位为逻辑‘1’时RI0才被置位并产生中断。)

REN0:接收允许(该位允许/禁止UART接收器。0:UART0接收禁止。1:UART0接收允许。)

TB80:第9发送位(该位的逻辑电平被赋值给9位UART方式的第9发送位。在8位UART方式中未用。根据需要用软件置‘1’或清‘0’。)

RB80:第9接收位(在方式0,则RB80被赋值为停止位的值。在方式1该位被赋值为9位UART方式中第九数据位的值。)

TI0:发送中断标志(当UART0发送完一个字节数据后该位被硬件置‘1’(在8位UART方式时,是在发送第8位后;在9位UART方式时,是在停止位开始)。当UART0中断被允许时,置‘1’该位将导致CPU转到UART0中断服务程序。该位必须用软件清‘0’。)

RI0:接收中断标志(当UART0接收到一个字节数据时该位被硬件置‘1’(在停止位采样后)。当UART0中断被允许时,置‘1’该位将会使CPU转到UART0中断服务程序。该位必须用软件清‘0’。)

CKCON:时钟控制寄存器

T3MH T3ML T2MH T2ML T1M T0M SCA1 SCA0 T3MH:定时器3高字节时钟选择。T3ML:定时器3低字节时钟选择。T2MH:定时器2高字节时钟选择。T2ML:定时器2低字节时钟选择

T1M:定时器1时钟选择。该位选择定时器1的时钟源。当C/T1被设置为逻辑‘1’

42

常州工学院毕业设计论文 时,T1M被忽略。(0:定时器1使用由分频位(SCA1-SAC0)定义的时钟。1:定时器1使用系统时钟) T1M:定时器0时钟选择。

SCA1-SCA0:定时器0/1预分频位。如果定时器0/1被配置为使用分频时钟,则这些位控制时钟分频数。 SCA1 0 0 1 1 SCA0 0 1 0 1 分频时钟 系统时钟/12 系统时钟/4 系统时钟/48 外部时钟/8 子程序如下:void UART0_Init (void) {

SCON0 = 0x10; // 设置串口工作模式:8bit数据,无停止位,接收允许 if (SYSCLK/BAUDRATE/2/256 < 1) //设置串口波特率 {

TH1 = -(SYSCLK/BAUDRATE/2);

CKCON |= 0x08; //定时器1使用系统时钟

}

else if (SYSCLK/BAUDRATE/2/256 < 4) {

TH1 = -(SYSCLK/BAUDRATE/2/4);

CKCON &= ~0x0B; //定时器1使用系统时钟/4 CKCON |= 0x01; }

else if (SYSCLK/BAUDRATE/2/256 < 12) {

TH1 = -(SYSCLK/BAUDRATE/2/12);

CKCON &= ~0x0B; //定时器1使用系统时钟/12 }

else {

43

常州工学院毕业设计论文 TH1 = -(SYSCLK/BAUDRATE/2/48);

CKCON &= ~0x0B; //定时器1使用系统时钟/48 CKCON |= 0x02; }

TL1 = TH1; // 初始化定时器1 TMOD &= ~0xf0; // 设定工作模式:8位重装 TMOD |= 0x20;

TR1 = 1; // 启动定时器1 TI0 = 1; // 发送准备 }

4.2.7按键子程序

按键子程序流程图如下:

开始N有键按下?YN按键有效?Y记录偏移量原值减去偏移量结束

图4–8 按键程序流程图

按键的主要功能是去皮和清零,采用查询方式查询按键是否按下。去皮主要是将托盘的重量去掉,范围较大;清零主要是防止去皮后有零点偏移,即相当于零点偏移校准,所以范围很小。但两者的原理都是一样的,很简单就是减去偏移的值即可。对去皮来说是减去转换滤波器中的托盘值,对清零来说是减去偏移校

44