本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:41 编辑
感谢21ic,感谢上海芯圣,简单的编写了一下程序,让我生活更加充实,受益匪浅。 最近工作比较忙,也只能挤出点时间学习学习之前的51单片机知识,还好有网友的帮忙,论坛的资源丰富,让我很快的找回了在学校的**。看了HC89S001P的datasheet,最后看的指令表全是在学校学的汇编指令,现在温习一下,感觉还是蛮不错的。
在这次实验中,我测试了一下串口的收发打印,以及使用了我在学校自主独立完成的最小单片机系统板,其实也只用了两个指示灯作为GPIO外设,后续有时间的话再编写一下基于DS18B20的温度传感器的数据采集上报等其它外设实验。
代码如下:
#define ALLOCATE_EXTERN
#include <string.h>
#include "HC89S003P.h"
/***************************************************************************************
* @实现效果 收到字符1,返回Hello Word,收到字符2返回Hello 21IC。
* @操作步骤 接上TXD,RXD短路帽,然后通过上位机软件发送5个8位数据
* @注意事项 波特率9600,8位数据,无校验位
***************************************************************************************/
unsigned char value;
/**************************************************************************************
* @说明 延时函数
* @参数 fui_i : 延时时间
* @返回值 无
* @注 Fcpu = 16MHz,fui_i = 1时,延时时间约为1Ms
*************************************************************************************/
void Delay_ms(unsigned int fui_i)
{
unsigned int fui_j;
for(;fui_i > 0;fui_i --)
for(fui_j = 1596;fui_j > 0;fui_j --);
}
void printf_str(char *str)
{
while(*str!='\0')
{
SBUF = *str++; //发送8位串口数据
while(!(SCON & 0x02));
SCON &=~ 0x02; //清除发送中断标志位
}
}
int main(void)
{
/************************************系统初始化****************************************/
WDTCCR = 0x00; //关闭看门狗
CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************UART配置初始化**************************************/
P2M1 = P2M1&0xF0|0x08; //P22设置为推挽输出
P0M3 = P0M3&0xF0|0x09; //P06设置为开漏输出
P0M3 = P0M3&0x0F|0x80; //P07设置为推挽输出
P0M2 = P0M2&0xF0|0x06; //P04设置为带上拉输入(施密特)
TXD_MAP = 0x07; //TXD映射P07
RXD_MAP = 0x04; //RXD映射P04 ++
T4CON = 0x06; //T4工作模式:UART1波特率发生器
//波特率计算
//波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
// = 1/16 * ((16000000 / 1) / 104)
// = 9615.38(误差0.16%)
//波特率9600
//反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
// = (65536 - (16000000 * (1 / 16) / 9600))
// = (65536 - 104.167)
// = FF98
TH4 = 0xFF;
TL4 = 0x98; //波特率9600
SCON2 = 0x02; //8位UART,波特率可变
SCON = 0x10; //允许串行接收
IE |=0X10; //使能串口中断
EA =1; //使能总中断
while(1)
{
printf_str("感谢21IC,此次验证串口收发与点灯\n");
P0_6 =~ P0_6; //P06取反
Delay_ms(550);
P2_2 =~ P2_2; //P22取反
{
IE &=~ 0x10; //失能UART1中断
if(value=='I')
{
printf_str("***支持上海芯圣!\n");
value='N';
}
else
;
IE |= 0x10; //UART1中断使能
SCON |= 0x10; //UART1接收使能
}
}
}
/***************************************************************************************
* @说明 UART1中断服务函数
* @参数 无
* @返回值 无
* @注 无
***************************************************************************************/
void UART1_Rpt(void) interrupt UART1_VECTOR
{
if(SCON & 0x01) //判断接收中断标志位
{
value = SBUF; //转存8位串口接收数据
SCON &=~ 0x10; //失能UART1接收
SCON &=~ 0x01; //清除接收中断标志位
}
下载ok的图示如下:
录制了一段小视频,伙伴们加油,学无止境,温故而知新哦!
https://v.youku.com/v_show/id_XNDEwODczNzI0NA==.html?spm=a2h3j.8428770.3416059.1
|