基于STC8H8K DevKit开发板仿真器功能,设置工作频率为11.0592MHz,利用Keil C51 V9.61设计一段C语言程序,实现以下功能: (1)设置串口1工作在模式1,使用P4.3、P4.4引脚作为RXD和TXD引脚,使用定时器T2作为波特率发生器,波特率设置为115200,帧格式为:1位起始位,8位数据,无奇偶校验位,1位停止位。采用中断方式收发数据, (2)设置P1.4、P1.5口为I2C引脚,设置ADC时钟为系统时钟/2/16,使能数字滤波(转换16次并取平均值),使能中断,中断后,保存转换结果并启动下一次AD转换 (3)利用定时器2实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值,并通过串行口发送到PC,在PC上利用串口调试助手接收数据,并观察温度的变化。
时间: 2023-12-07 13:03:17 浏览: 97
以下是基于STC8H8K DevKit开发板的C语言程序,实现以上功能:
```c
#include <STC8.H>
#define BAUDRATE 115200
#define SYSCLK 11059200L
unsigned char ADC_Result; // ADC转换结果
unsigned char temp; // LM75BD温度值
bit ADC_Flag; // ADC完成中断标志
void UART_Init()
{
SCON = 0x50; // 设置串口1工作在模式1
TMOD &= 0x0F; // 清除T1的计数/定时模式
TMOD |= 0x20; // 设置T1为8位自动重载定时器模式
TH1 = 256 - (SYSCLK/BAUDRATE/12); // 设置波特率发生器初值
TL1 = TH1; // 使定时器1初值与波特率发生器初值相等
TR1 = 1; // 启动定时器1
ES = 1; // 使能串口1中断
PS = 1; // 设置串口1中断为低优先级
}
void I2C_Init()
{
P1M1 |= 0x30; // 设置P1.4、P1.5口为I2C引脚
P1M2 |= 0x30;
IAP_TPS = 0x08; // 设置IAP时钟为系统时钟/2/16
IAP_CONTR = 0x20; // 使能数字滤波
I2C_CLK = 0x07; // 设置I2C时钟频率为12MHz
I2C_ADDR = 0x90; // 设置I2C设备地址为0x90
I2C_CON = 0x80; // 使能I2C总线
IE2 |= 0x02; // 使能I2C中断
}
void Timer2_Init()
{
T2MOD = 0x00; // 设置定时器2为13位定时器模式
RCAP2H = (65536 - (SYSCLK/12/50)) / 256; // 设置定时器2初值
RCAP2L = (65536 - (SYSCLK/12/50)) % 256;
ET2 = 1; // 使能定时器2中断
TR2 = 1; // 启动定时器2
}
void ADC_Init()
{
P1ASF = 0x01; // 设置P1.0口为ADC引脚
ADC_RES = 0; // 设置ADC转换结果右对齐
ADC_CONTR = 0x80; // 使能ADC转换
IE_ADC = 1; // 使能ADC中断
}
void UART_SendByte(unsigned char dat)
{
while(!TI); // 等待上一次发送完成
TI = 0; // 清除发送完成标志
SBUF = dat; // 发送数据
}
void I2C_SendByte(unsigned char dat)
{
I2C_CON |= 0x10; // 发送起始信号
while(!(I2C_CON & 0x08)); // 等待起始信号发送完成
I2C_DAT = dat; // 发送数据
while(!(I2C_CON & 0x08)); // 等待数据发送完成
I2C_CON |= 0x20; // 发送停止信号
}
void ADC_ISR() interrupt 5
{
ADC_Result = ADC_RES; // 保存ADC转换结果
ADC_Flag = 1; // 设置ADC完成中断标志
}
void I2C_ISR() interrupt 10
{
if(I2C_STAT == 0x60) // 发送设备地址成功
{
I2C_DAT = 0x00; // 发送温度寄存器地址
}
else if(I2C_STAT == 0x68) // 发送设备地址失败
{
I2C_CON |= 0x20; // 发送停止信号
}
else if(I2C_STAT == 0x80) // 发送数据成功
{
temp = I2C_DAT; // 保存温度值
I2C_CON |= 0x20; // 发送停止信号
}
}
void Timer2_ISR() interrupt 5
{
static unsigned char cnt = 0; // 定时器计数器
static bit flag = 0; // 定时器标志位
cnt++; // 计数器加1
if(cnt >= 50) // 计数器达到50,即定时1s
{
cnt = 0; // 重置计数器
flag = 1; // 设置定时器标志位
}
if(flag) // 定时器标志位为1
{
flag = 0; // 清除定时器标志位
I2C_SendByte(0x90); // 发送设备地址
}
}
void main()
{
UART_Init(); // 初始化串口1
I2C_Init(); // 初始化I2C总线
Timer2_Init(); // 初始化定时器2
ADC_Init(); // 初始化ADC
EA = 1; // 开启总中断
while(1)
{
if(ADC_Flag) // ADC完成中断标志为1
{
ADC_Flag = 0; // 清除ADC完成中断标志
ADC_Result >>= 4; // 右移4位,得到8位结果
UART_SendByte(ADC_Result); // 发送ADC转换结果到PC
}
if(temp) // 收到LM75BD温度值
{
UART_SendByte(temp); // 发送温度值到PC
temp = 0; // 清除温度值
}
}
}
```
阅读全文