本帖最后由 芯圣电子官方QQ 于 2023-7-25 14:22 编辑
有幸参加HC89S001P试用活动,按资料试验,还是比较容易上手的。论坛的支持反应很快,稍微出点状况,就会有资料更新,前两天连厂家的网站资料都更新了,芯圣的推广支持力度还蛮到位的。
收到的试用样品:
最小系统板跑了几个例程,没有遇到什么问题,论坛里都是试用经验,就不说了。
关于HC89S001P的试用,参考数据手册修改例程中部分寄存器数据,编写主程序后直接可以运行(Keil中选HC89S003P,ISP写入时选HC89S001P)。
用面包板搭的小系统以及两个小程序如下:
使用的零件:
电路图:
试验效果:
程序部分1:(使用ADC和PWM功能软开关试验)
/**
* ************************************************************************************
* 上海芯圣电子股份有限公司
* www.holychip.cn
* ************************************************************************************
* @Examle Version V1.0.3.0
* @demo Version V1.0.3.0
* @date 2018.6.1
* ************************************************************************************
* 模块性能介绍
* 1、MCU拥有一个单路8位PWM3模块,PWM3提供周期溢出中断
* 2、PWM3周期:[PWM3P]*PWM3工作时钟源周期
* 3、PWM3占空比:[PWM3D]*PWM3工作时钟源周期
* ************************************************************************************
* 应用注意事项
* 1、关闭PWM3模块时,PWM计数停止,输出立即关闭。再打开PWM3模块时,PWM计数器都重新从1开
* 始计数,输出受PWM3OEN控制
* 2、PWM3允许输出,必须在PWM3EN置1下才有效,否则为PWM3输出关闭状态(输出时对应端口必须
* 设为输出模式);即使都禁止输出,只要相关位被使能,PWM3都可以溢出中断,即此时PWM3
* 可以作为定时器/计数器使用,此控制位修改立即生效
* ************************************************************************************
* 客户服务
* 感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
* ****************************技术支持群:201030494***********************************
* ************************************************************************************
**/
#define ALLOCATE_EXTERN
#include "HC89S003F4.h"
//unsigned int gui_AdcValue = 0; //用于存放ADC的值
/***************************************************************************************
* @实现效果 P22口输出频率为15.69KHz,占空比为34%的方波
***************************************************************************************/
//延时函数
void Delay_2us(unsigned int fui_i)
{
while(fui_i--);
}
/*void DelayMs(u16 ms)
{
u16 j;
for(; ms>0; ms--)
for(j=1596; j>0; j--);
}*/
void main()
{
/************************************系统初始化****************************************/
WDTCCR = 0x00; //关闭看门狗
//本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
/************************************PWM3初始化****************************************/
P2M0 = P2M0&0x0F|0x30; //P21设置为模拟输入
P0M0 = P0M0&0xF0|0x08; //P00设置为推挽输出
P0M1 = P0M1&0x0F|0x80; //P03设置为推挽输出
P0M2 = P0M2&0xF0|0x08; //P04设置为推挽输出
PWM0_MAP = 0x03; //PWM0通道映射P03口
PWM01_MAP = 0x04; //PWM01通道映射P04口
PWM1_MAP = 0x00; //PWM1通道映射P00口
PWM0C = 0x01; //PWM0高有效,PWM01高有效,时钟8分频
PWM1C = 0x01; //PWM1高有效,PWM01高有效,时钟8分频
//周期计算 = 0x03ff / (Fosc / PWM分频系数) (Fosc见系统时钟配置的部分)
// = 0x03ff / (16000000 / 8)
// = 1023 /2000000
// = 511.5us 约1.955kHz
PWM0PL = 0xFF; //周期低8位设置为0xFF
PWM1PL = 0xFF;
PWM0EN = 0x0F; //使能PWM0,工作于独立模式
PWM1EN = 0x0B; //使能PWM1,工作于独立模式
PWM0DL = 0xFF; //初始状态,灯全部熄灭。
PWM0DTL = 0xFF;
PWM1DL = 0xFF;
ADCC0 = 0x80; //打开ADC转换电源
Delay_2us(10); //延时20us,确保ADC系统稳定
ADCC1 = 0x09; //选择外部通道9
ADCC2 = 0x4D; //转换结果12位数据,数据右对齐,ADC时钟16分频
while(1)
{
ADCC0 |= 0x40; //启动ADC转换
while(!(ADCC0&0x20)); //等待ADC转换结束
ADCC0 &=~ 0x20; //清除标志位
if(ADCR/0x200==0) //不发光
{
PWM0DL = 0xff;
PWM0DTL = 0xff;
PWM1DL = 0xff;
}
if(ADCR/0x200==1) //红色
{
PWM0DL = 0x00;
PWM0DTL = 0xff;
PWM1DL = 0xff;
}
if(ADCR/0x200==2) //橙色
{
PWM0DL = 0x00;
PWM0DTL = 0xa0;
PWM1DL = 0xff;
}
if(ADCR/0x200==3) //绿色
{
PWM0DL = 0xff;
PWM0DTL = 0x00;
PWM1DL = 0xff;
}
if(ADCR/0x200==4) //青色
{
PWM0DL = 0xff;
PWM0DTL = 0x00;
PWM1DL = 0x00;
}
if(ADCR/0x200==5) //蓝色
{
PWM0DL = 0xff;
PWM0DTL = 0xff;
PWM1DL = 0x00;
}
if(ADCR/0x200==6) //紫色
{
PWM0DL = 0x00;
PWM0DTL = 0xff;
PWM1DL = 0xc0;
}
if(ADCR/0x200==7) //全色
{
PWM0DL = 0x00;
PWM0DTL = 0x00;
PWM1DL = 0x00;
}
}
}
程序部分2:(使用PWM功能光谱灯试验):
/**
* ************************************************************************************
* 上海芯圣电子股份有限公司
* www.holychip.cn
* ************************************************************************************
* @Examle Version V1.0.3.0
* @demo Version V1.0.3.0
* @date 2018.6.1
* ************************************************************************************
* 模块性能介绍
* 1、MCU拥有一个单路8位PWM3模块,PWM3提供周期溢出中断
* 2、PWM3周期:[PWM3P]*PWM3工作时钟源周期
* 3、PWM3占空比:[PWM3D]*PWM3工作时钟源周期
* ************************************************************************************
* 应用注意事项
* 1、关闭PWM3模块时,PWM计数停止,输出立即关闭。再打开PWM3模块时,PWM计数器都重新从1开
* 始计数,输出受PWM3OEN控制
* 2、PWM3允许输出,必须在PWM3EN置1下才有效,否则为PWM3输出关闭状态(输出时对应端口必须
* 设为输出模式);即使都禁止输出,只要相关位被使能,PWM3都可以溢出中断,即此时PWM3
* 可以作为定时器/计数器使用,此控制位修改立即生效
* ************************************************************************************
* 客户服务
* 感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
* ****************************技术支持群:201030494***********************************
* ************************************************************************************
**/
#define ALLOCATE_EXTERN
#include "HC89S003F4.h"
/***************************************************************************************
* @实现效果 P22口输出频率为15.69KHz,占空比为34%的方波
***************************************************************************************/
void DelayMs(u16 ms)
{
u16 j;
for(; ms>0; ms--)
for(j=1596; j>0; j--);
}
void main()
{
/************************************系统初始化****************************************/
WDTCCR = 0x00; //关闭看门狗
//本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
/************************************PWM3初始化****************************************/
P0M0 = P0M0&0xF0|0x08; //P00设置为推挽输出
P0M1 = P0M1&0x0F|0x80; //P03设置为推挽输出
P0M2 = P0M2&0xF0|0x08; //P04设置为推挽输出
PWM0_MAP = 0x03; //PWM0通道映射P03口
PWM01_MAP = 0x04; //PWM01通道映射P04口
PWM1_MAP = 0x00; //PWM1通道映射P00口
PWM0C = 0x01; //PWM0高有效,PWM01高有效,时钟8分频
PWM1C = 0x01; //PWM1高有效,PWM01高有效,时钟8分频
//周期计算 = 0x03ff / (Fosc / PWM分频系数) (Fosc见系统时钟配置的部分)
// = 0x03ff / (16000000 / 8)
// = 1023 /2000000
// = 511.5us 约1.955kHz
PWM0PH = 0x00; //周期高4位设置为0x03
PWM0PL = 0xFF; //周期低8位设置为0xFF
PWM1PH = 0x00;
PWM1PL = 0xFF;
PWM0EN = 0x0F; //使能PWM0,工作于独立模式
PWM1EN = 0x0B; //使能PWM1,工作于独立模式
PWM0DH = 0x00; //初始状态,灯全部熄灭。
PWM0DL = 0xFF;
PWM0DTH = 0x00;
PWM0DTL = 0xFF;
PWM1DH = 0x00;
PWM1DL = 0x00;
while(1) //按赤橙黄绿青蓝紫色循环
{
for( PWM0DL=0xff;PWM0DL>=0x01;PWM0DL--)
DelayMs(3);
for( PWM1DL=0x00;PWM1DL<=0xfe;PWM1DL++)
DelayMs(3);
for( PWM0DTL=0xff;PWM0DTL>=0x01;PWM0DTL--)
DelayMs(3);
for( PWM0DL=0x00;PWM0DL<=0xfe;PWM0DL++)
DelayMs(3);
for( PWM1DL=0xff;PWM1DL>=0x01;PWM1DL--)
DelayMs(3);
for( PWM0DTL=0x00;PWM0DTL<=0xfe;PWM0DTL++)
DelayMs(3);
}
}
|