基于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.3口为ADC输入引脚,设置ADC时钟为系统时钟/2/16,使能数字滤波(转换16次并取平均值),使能中断,中断后,保存转换结果并启动下一次AD转换 (3)在主程序中初始化串口和ADC,进入死循环,在死循环中判断AD转换完成标志,通过串口将转换结果(两个字节)发送到PC,用串口调试助手接收数据,改变NTC的温度,观察结果的变化。
时间: 2023-08-03 07:04:26 浏览: 502
本题需要用到STC8H8K DevKit开发板以及Keil C51 V9.61软件。
首先,我们需要设置工作频率为11.0592MHz,这可以在Keil软件中进行设置。具体操作如下:
1. 打开Keil软件,点击“Project” -> “Options for Target”。
2. 在弹出的窗口中,选择“C51”选项卡。
3. 在“Target”区域中,选择“STC8H8K64S4”作为目标设备。
4. 在“C51”选项卡中,找到“CPU”区域,设置“Clock”为“11.0592MHz”。
5. 点击“OK”保存设置。
接下来,我们需要编写C语言程序,实现串口和ADC的功能。具体代码如下:
```c
#include <STC8.H>
#define BAUD_RATE 115200
void InitUART(void);
void SendData(unsigned char dat);
void SendString(unsigned char *str);
void InitADC(void);
unsigned int GetADCValue(void);
volatile bit g_bADCFinished = 0; // AD转换完成标志
volatile unsigned int g_nADCValue = 0; // AD转换结果
void main()
{
InitUART(); // 初始化串口
InitADC(); // 初始化ADC
EA = 1; // 开启总中断
while (1)
{
if (g_bADCFinished) // 判断AD转换完成标志
{
unsigned int nADCValue = GetADCValue(); // 获取AD转换结果
unsigned char szData[2] = {0}; // 保存转换结果的数组
// 将转换结果存入数组
szData[0] = nADCValue >> 8;
szData[1] = nADCValue & 0xFF;
// 发送数据到PC
SendString(szData);
// 清除AD转换完成标志,启动下一次转换
g_bADCFinished = 0;
ADC_CONTR |= 0x10;
}
}
}
void InitUART(void)
{
P4SW |= 0x30; // 设置P4.3、P4.4为UART功能
SCON = 0x50; // 设置串口工作在模式1
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器T2为模式2
TH2 = 256 - (11059200 / 32 / 16 / BAUD_RATE); // 计算波特率发生器的初值
TL2 = TH2;
RCAP2H = TH2;
RCAP2L = TL2;
TR2 = 1; // 启动定时器T2
ES = 1; // 开启串口中断
}
void SendData(unsigned char dat)
{
SBUF = dat;
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
void SendString(unsigned char *str)
{
while (*str)
{
SendData(*str++);
}
}
void InitADC(void)
{
P1ASF = 0x08; // 设置P1.3为ADC输入引脚
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = 0x88; // 设置ADC时钟为系统时钟/2/16
ADC_CONTR |= 0x10; // 启动AD转换
}
unsigned int GetADCValue(void)
{
unsigned int nADCValue = 0;
nADCValue = ADC_RES;
nADCValue <<= 2;
nADCValue |= (ADC_RESL & 0x03);
return nADCValue;
}
void ADC_ISR() interrupt 5
{
g_nADCValue += ADC_RES;
g_nADCValue <<= 2;
g_nADCValue |= (ADC_RESL & 0x03);
if (++ADC_RESL_CNT == 16)
{
g_nADCValue >>= 4;
g_bADCFinished = 1;
ADC_RESL_CNT = 0;
}
else
{
ADC_CONTR |= 0x10;
}
}
```
在以上代码中,我们首先定义了一个常量BAUD_RATE,表示波特率设置为115200。然后,我们实现了三个函数:InitUART(),SendData()和SendString(),用于初始化串口和发送数据。
接着,我们实现了InitADC()和GetADCValue()函数,用于初始化ADC和获取AD转换结果。同时,我们定义了两个全局变量g_bADCFinished和g_nADCValue,用于保存AD转换完成标志和转换结果。
最后,在主程序中,我们启动了串口和ADC,并进入死循环。在死循环中,我们判断AD转换完成标志,如果完成了转换,就将转换结果发送到PC,并清除AD转换完成标志,启动下一次转换。
需要注意的是,我们在ADC_ISR()中处理AD转换结果。每当ADC转换完成时,会触发ADC中断,进入ADC_ISR()函数。在ADC_ISR()函数中,我们用16次转换结果的平均值替代实际转换结果,并设置AD转换完成标志,以便主程序能够获取转换结果。
最后,我们需要使用串口调试助手接收数据,改变NTC的温度,观察结果的变化。具体操作如下:
1. 在Keil软件中编译并下载程序到STC8H8K DevKit开发板。
2. 打开串口调试助手,设置波特率为115200,数据位为8位,无奇偶校验位,停止位为1位。
3. 接入NTC电阻,改变NTC的温度,观察串口调试助手中的数据变化。
以上就是本题的完整解答。
阅读全文