㈠ 如何用C语言改变合泰单片机自带PWM的频率,如1KHZ,2KHZ,等等频率
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sbit Waveout1=P1^0;
sbit CF=P3^2;//调节频率
int num,a,f;
int Timer0_H,Timer0_L;
void Init()
{
num=0;
a=1000;
f=2;
Waveout1=0;
TMOD=0x02;
TH0=(uint)(256-(1000/(2*f)));
TL0=(uint)(256-(1000/(2*f)));
ET0=1;
EA=1;
TR0=1;
}
void main()
{
Init();
while(1)
{
if(CF==0)
{
f++;
TH0=(int)(256-(1000/(2*f)));
TL0=(int)(256-(1000/(2*f)));
while(CF==0);
}
if(num==a)
{
num=0;
Waveout1=~Waveout1;
}
}
}
void Timer0()interrupt 1
{
num++;
}
㈡ 合泰单片机的中断优先级如何设置
设置中断优先级的函数,CMISIS已经写好,并嵌入到了编译器中。
1. PWM的测量放到主程序循环中去做,在中断程序中仅仅完成定时修正,把PWM设定为高优先级,这样可以提高中断的响应速度,使得程序的实时性较高;2. 串口一般是属于较慢的中断,它的响应时间只要满足能够在接收一个字节的时间内响应一次即可,因此可以设为低等级中断,并且在串口程序中不要进行数据处理,只要完成接收数据转移到接收缓存池中即可,在主程序中去完成数据的分析处理工作。
㈢ 合泰的单片机用C语言如何把一个变量定位到指定ROM地址 比如:const unsigned char mydata @0x300;
ROM是保存指令和常量的地方,不是存变量的地方;
如果是访问flash之类的可擦写ROM可以当成是外部RAM使用,一般通过absacc.h
里的XBYTE[addr] 来定义外部地址的。
PS:如果是常量需要保存到ROM的指定地址,查看项目文件下的*.m51文件,里面有程序段及常数段的地址分配,修改code memory 下的BASE(起始地址、基地址)和LENGTH(长度、字节数)值,可以指定程序段或常量的ROM地址。
㈣ 合泰单片机中断问题
一般RISC单片机都采用专用的硬件堆栈,跟51单片机的堆栈结构完全不同(51是使用现有RAM来做堆栈),所以使用RISC单片机时要注意嵌套调用深度。
楼主所提芯片:HT48系列Cost-Effective I/O 型单片机只有两层硬件堆栈,你做三层嵌套,当然会出现堆栈溢出了。
解决办法:杜绝>=3层的嵌套(特别注意在中断中调用)
当然如果你的时间实在是充裕的很,而且硬件余量够足,编码水平也过硬,可以根据堆栈的数据结构试试实现一个软堆栈
--------------------------------------------------------------------
尽管你的说法有问题,但是看在分的面子上,我还是说一下吧:
既然用到IIC,堆栈消耗肯定很大,2层堆栈的单片机就别指望了,你需要使用堆栈多些的单片机:HT48R02N(6层),HT48R54A(6层),HT48R50A-1(6层),HT48R502(16层),还有很多,具体看Selection Guide
--------------------------------------------------------------------
HT48R08A-1是2层硬件堆栈,如果你嵌套了5-6层,一定会出问题,分析了下,有三种可能:
1.你不是用的HT48R08A-1
2.你的IIC软件包实际运行时,没有超出2层调用(尽管最高调用是5-6层,超级隐患!)
3.你判断的5-6层嵌套,实际只有2层(只有子程序调用和中断响应才会产生所谓“嵌套”是不是把For循环之类的也算进“嵌套”了呢)
Good luck!
㈤ 合泰单片机汇编问题
data .section 'data' ;数据段 这样的写法是比较标准的整齐的汇编写法,就是告诉你这段就是定义变量 和REGISTER 等.现在好多人定义这些都是放在INC文件里就可以的了.
code .section at 0 'code' 这个就是告诉你下面这段就是单片机的程式了.
子程式里proc 是子程式开始,endp就是子程式的结束,其实现在好多人 直接写子程式名就可以的了. 好像 sub: ret
sdz 是 register 自减1, 如果为0 就是跳过下一条指令,一般的用法是
SDZ R
JMP LOOP
$
㈥ 合泰单片机外部中断c语言,如按下按键,灯亮
你程序里有每个问题,第一P3口的初始化应该设定为0XFF,因为你是要读引脚的信号。
第二,你的P2^3引脚置零后蜂鸣器就响,你又没置1,所以你的蜂鸣器会一直响。我临时写了个小程序,也没运行,但应该没问题,希望读你有帮助。注意:中断时间间隔最好是大于延时时间。
#include<reg52.h>
sbit Beep=P2^3
bit Beep_flg
void delay(void) //延时
{
unsigned char i,j;
for(i=3;i>0;i--)
for(i=100;i>0;i--);
}
void main()
{
P3=0xff;//P3口初始化
EA=1;//全局中断开
EX0=1;//外部中断0开
IT0=1;//边沿触发
while(1)
{
if(Beep_flg) //是否中断
{
Beep=0; //打开蜂鸣器
delay(); // 延时
Beep_flg=0;
}
Beep=1; //关蜂鸣器
}
}
void it0(void) interrupt 0 using 1
{
Beep_flg=1;
}
㈦ holtek单片机
HOLTEK合泰单片机的datasheet可上soiseek查
㈧ 合泰单片机我编写了个采ad值的程序,ad值是采出来了,可是ad值范围整体偏移,AD12位精度
12位的寄存器,怎么可能大于4095! 假如你用的是双字节的变量Value来存储结果,那么读寄存器取值出来后需要屏蔽掉13位之后的数据,即: Value= Value & 0xFFF 。至少不会出现4300的情况。
㈨ 关于NEC 单片机程序 移植 合泰的问题 引脚定义。帮忙弄下
#define _pa0 _1a_0
#define Rx_PIN _pa0
#define Rx_IN_1 (0x01&Rx_PIN)
#define Rx_IN_0 (!(0x01&Rx_PIN))
#define _pac0 _1b_0
#define Rx_POUT _pac0
#define Rx_SET_IN Rx_POUT = 1// 1为输入 0输出
#define Rx_SET_OUT Rx_POUT= 0
㈩ 合泰背单片机在程序中如何实现按键,短按加一,长按快加拜教高手,谢谢先!
合泰背?没听过,不过没所谓,算法都一样,按键少的时候可以直接挂在IO口上,另一端接地,程序中检测IO状态,若有0则说明有按键按下,此时变量加1,然后进入松手检测,在其中设置时间标志,若经过几秒钟还是按下状态,则变量一直加,祝成功~~