㈠ 合泰背单片机在程序中如何实现按键,短按加一,长按快加拜教高手,谢谢先!
合泰背?没听过,不过没所谓,算法都一样,按键少的时候可以直接挂在IO口上,另一端接地,程序中检测IO状态,若有0则说明有按键按下,此时变量加1,然后进入松手检测,在其中设置时间标志,若经过几秒钟还是按下状态,则变量一直加,祝成功~~
㈡ 合泰的单片机用C语言如何把一个变量定位到指定ROM地址 比如:const unsigned char mydata @0x300;
ROM是保存指令和常量的地方,不是存变量的地方;
如果是访问flash之类的可擦写ROM可以当成是外部RAM使用,一般通过absacc.h
里的XBYTE[addr] 来定义外部地址的。
PS:如果是常量需要保存到ROM的指定地址,查看项目文件下的*.m51文件,里面有程序段及常数段的地址分配,修改code memory 下的BASE(起始地址、基地址)和LENGTH(长度、字节数)值,可以指定程序段或常量的ROM地址。
㈢ 合泰ht46f49e单片机
1、51单片机计数器的脉冲输入脚。主要的脉冲输入脚有Px,y, 也指对应T0的P3.4和对应T1的P3.5,主要用来检测片外来的脉冲。而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为
F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us
2、定时器有两种工作模式,分别为计数模式和定时模式。对Px,y的输入脉冲进行计数为计数模式。定时模式,则是对MCU的主时钟经过12分频后计数。因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。
3、51计数器的计数值存放于特殊功能寄存器中。T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)
4、TLx与THx之间的搭配关系
1)、TLx与THx之间32进制。即当TLx计到32个脉冲时,TLx归0同时THx进1。这也称为方式0。
2)、TLx与THx之间256进制。即当TLx计到256个脉冲时,TLx归0同时THx进1。这也称为方式1。在方式1时,最多计65536个脉冲产生溢出。在主频为11.0592M时,每计一个脉冲为1.085us,所以溢出一次的时间为1.085usx65536=71.1ms。
3)、THx用于存放TLx溢出后,TLx下次计数的起点。这也称为方式2。
4)、THx与TLx分别独立对自己的输入脉冲计数。这也称为方式3。
5、定时器初始化
1)、确定定时器的计数模式。
2)、确定TLx与THx之间的搭配关系。
3)、确定计数起点值。即TLx与THx的初值。
㈣ 敬爱的合泰单片机高手!!!!!!!
1.怎样用软件设置:CMOSE输出,带或不带上拉电阻的斯密特触发输入,A/D输入????
输出就是输出,什么"CMOS输出"是Holtek官方术语,"斯密特触发输入"也是官方术语,带不带上拉电阻是在IDE掩膜选项中设置的
引脚是AD输入还是数字IO靠ADCR中的控制位来定义
2.怎样理解ADCR中的前六位设置???当设置好模义输入通道,为什么还要定义PB呢????
这是HT46R52的ADCR 参考(估计HT46R22是一样的):
0 ACS0 选择模拟输入通道
1 ACS1 选择模拟输入通道
2 ACS2 选择模拟输入通道
3 PCR0 为0 则关闭,减小功耗
4 PCR1 为0 则关闭,减小功耗
5 PCR2 为0 则关闭,减小功耗
6 EOC A/D 转换结束标志(0:A/D 转换结束)
每次bit3-5 状态的改变后都必须通过START 信号来初始化A/D 转换器,
否则EOC可能会处于不确定状态
7 START 0→1→0:开始; 0→1:A/D 转换复位并且置EOC为“1”
“当设置好模义输入通道,为什么还要定义PB呢????”
前面0-2只是个通道选择(多选1模拟开关),并不能决定PB口是模拟口还是数字IO
就像有一块内存空间,你选中了一个字节来用,但里面的内容到底什么不知道,设置一下就知道了。
3.端口问题:
1.控制寄存器:设定IO口是输入还是输出,数据寄存器(端口寄存器)读取/设置端口电平
2.设_pac=0b00000000;意思是pa口全部输出;设_pa= 0b00000000;则pa全部输出0
3.初始化端口的步骤示例:_pac=0x00; _pa=0x00;
4.其他问题:
#pragma vector isr_time @ 0x08 //中断服务程序定义
#pragma vector isr_ad @ 0x0c //中断服务程序定义
uchar sign0 @ 0x40; //在绝对地址定义变量
uchar sign1 @ 0x41; //在绝对地址定义变量
㈤ 合泰单片机内置eeprom只能读不能写,要怎么解决
我也遇到这样的问题。没人给出答案,我来说一下吧。(主要是针对V3编译C)
根据Holtek_C_Compiler_V3_FAQ(950).pdf的描述,V3不保证编译后的指令符合EEPROM写入顺序。根据BS86的数据手册,WREN 和 WR一定要符合顺序。
我编译后的指令出现的是LSET WREN以及LSET WR,这个就出问题了。芯片需要的是SET。
解决方法是根据官方FAQ的描述
"5.5 对于写 EEPROM 有限制的 MCU ( 需连续 set wren, wr, flag),如何使用
V3 写 EEPROM?"
下面是代码
//RefertoHoltek_C_Compiler_V3_FAQ(950).pdf
typedefstruct{
unsignedcharbit0:1;
unsignedcharbit1:1;
unsignedcharbit2:1;
unsignedcharbit3:1;
unsignedcharbit4:1;
unsignedcharbit5:1;
unsignedcharbit6:1;
}iar_bits;
DEFINE_SFR(iar_bits,iar1,0x02);
#defineiar1_3 iar1.bit3
#defineiar1_2 iar1.bit2
#defineiar1_1 iar1.bit1
#defineiar1_0 iar1.bit0
...
uint8_tbkup;
_eea=u8Addr;
_eed=u8NewData;
_mp1l=0x40;
bkup=_mp1h;
_mp1h=0x01;
_emi=0;
iar1_3=1;
iar1_2=1;
_emi=1;
while(iar1_2)
{
}
_iar1=0;
_mp1h=bkup;
...
官方的解决方案产生的代码跟数据手册中的一直:
;129 iar1_3=1;
0D0D 3182 set__iar1[0].3《《以前这里是LSETWREN
;130 iar1_2=1;
0D0E 3102 set__iar1[0].2《《以前这里是LSETWR
㈥ 有没有大神用过合泰的单片机 HT68F002 这款想芯片啊 求个用中断的程序,自己怎么弄都不行 帮忙看一下吧
定时器中断函数里没清除标志位。增加_stm0f=0
缺少_rstc=0b01010101
㈦ 合泰单片机的中断优先级如何设置
设置中断优先级的函数,CMISIS已经写好,并嵌入到了编译器中。
1. PWM的测量放到主程序循环中去做,在中断程序中仅仅完成定时修正,把PWM设定为高优先级,这样可以提高中断的响应速度,使得程序的实时性较高;2. 串口一般是属于较慢的中断,它的响应时间只要满足能够在接收一个字节的时间内响应一次即可,因此可以设为低等级中断,并且在串口程序中不要进行数据处理,只要完成接收数据转移到接收缓存池中即可,在主程序中去完成数据的分析处理工作。
㈧ 如何用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++;
}