如何在8g1k08a 输出固定1khz方波
本帖最后由 DebugLab 于 2024-9-12 12:07 编辑8g1k08a 输出1khz方波,p3.3脚用什么最方便
唯一正解,改到 P5.4/P5.5,
利用 T1CLKO的时钟输出,T0CLKO的时钟输出
直接对系统时钟分频,无需中断干预
STC8G1K08A-36I-SOP8, T0CLKO在 P5.5
定时器不够,还有3个定时器 CCP0/CCP1/CCP2
8G系列有PCA,可以用PCA 感觉如果是P5.5或P5.4会比较好搞 DebugLab 发表于 2024-9-12 12:06
8G系列有PCA,可以用PCA
新手,8脚的08a pca 有范例吗?还有pca 怎么输出的在某个脚, 没看到08a这方面的手册资料 vip2128 发表于 2024-9-12 12:11
新手,8脚的08a pca 有范例吗?还有pca 怎么输出的在某个脚, 没看到08a这方面的手册资料 ...
8脚一定要带A的才有,P33的在这里
具体查看数据手册
本帖最后由 晓飛飛 于 2024-9-12 12:18 编辑
理论上是使用PCA最适合,但如果要快速实现的话,用Timer0吧,使用ISP软件自动生成500us周期的中断代码,在中断里面翻转P33即可,
这个不用动脑子看寄存器,保证新手能5分钟内开发完成。
void Timer0_Isr(void) interrupt 1
{
P33 = !P33;
}
void Timer0_Init(void) //500微秒@12.000MHz
{
P3M0 |= 0x08;
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x90; //设置定时初始值
TH0 = 0xE8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
vip2128 发表于 2024-9-12 12:11
新手,8脚的08a pca 有范例吗?还有pca 怎么输出的在某个脚, 没看到08a这方面的手册资料 ...
3路PCA输出PWM程序:
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{
unsigned char temp_l,temp_h,temp;
temp_l=pwm_0&0x00ff; //读pwm_0低8位赋值给temp_l
temp_h=(pwm_0&0x0300)>>4; //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
temp=PCA_PWM0&0xcd; //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_0==0x03ff) //如果pwm_0最大
temp_h|=0x02; //设置EPC0H(PCA_PWM0)为1
PCA_PWM0=temp_h; //写PCA_PWM0(先写高2位)
CCAP0H=temp_l; //写CCAP0H(再写低8位)
temp_l=pwm_1&0x00ff; //读pwm_1低8位赋值给temp_l
temp_h=(pwm_1&0x0300)>>4; //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1)位置,赋值给temp_h
temp=PCA_PWM1&0xcd; //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_1==0x03ff) //如果pwm_1最大
temp_h|=0x02; //设置EPC1H(PCA_PWM1)为1
PCA_PWM1=temp_h; //写PCA_PWM1(先写高2位)
CCAP1H=temp_l; //写CCAP1H(再写低8位)
temp_l=pwm_2&0x00ff; //读pwm_2低8位赋值给temp_l
temp_h=(pwm_2&0x0300)>>4; //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2)位置,赋值给temp_h
temp=PCA_PWM2&0xcd; //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_2==0x03ff) //如果pwm_2最大
temp_h|=0x02; //设置EPC2H(PCA_PWM2)为1
PCA_PWM2=temp_h; //写PCA_PWM2(先写高2位)
CCAP2H=temp_l; //写CCAP2H(再写低8位)
}
void Init(void)
{
P_SW2|=EAXFR;
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
CCON=0x00; //设置PCA控制寄存器
CMOD=0x80; //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
CL=0x00; //设置PCA计数器
CH=0x00; //设置PCA计数器
CCAPM0=PWM0; //使能PCA模块0PWM功能
PCA_PWM0=0xc0; //设置PCA模块0输出10位PWM
CCAPM1=PWM1; //使能PCA模块1PWM功能
PCA_PWM1=0xc0; //设置PCA模块1输出10位PWM
CCAPM2=PWM2; //使能PCA模块2PWM功能
PCA_PWM2=0xc0; //设置PCA模块2输出10位PWM
CR=1; //启动PCA
}
void main(void)
{
Init();
while(1)
{
PWM_Out(A,B,C);
}
}
DebugLab 发表于 2024-9-12 12:20
3路PCA输出PWM程序:
按照你需要的频率修改一下 感谢各位版主 明白了
页:
[1]
2