❶ 合泰的单片机用C语言如何把一个变量定位到指定ROM地址 比如:const unsigned char mydata @0x300;
ROM是保存指令和常量的地方,不是存变量的地方;
如果是访问flash之类的可擦写ROM可以当成是外部RAM使用,一般通过absacc.h
里的XBYTE[addr] 来定义外部地址的。
PS:如果是常量需要保存到ROM的指定地址,查看项目文件下的*.m51文件,里面有程序段及常数段的地址分配,修改code memory 下的BASE(起始地址、基地址)和LENGTH(长度、字节数)值,可以指定程序段或常量的ROM地址。
❷ 合泰单片机HT67F系列的使用问题
1,寄存器名与手册对不上号是很正常的,不光合泰的单片机有这种情况,其它的单片机也有这种情况,出现这种情况程序编译是通不过的。所以有时候要关心一下头文件,以头文件的器存器命名为准,或自己更改头文件。
2,关于管脚复用问题。一般情况下不对管脚进行配置默认都是普通IO,但是如果要使用管脚的其它功能,在使用前就要先对相关寄存器进行配置,比如要使用AN1就要先配置好AD转换相关的寄存器,如:ADR、ADRL、ADRH、ADCR、ACSR寄存器。
❸ 合泰单片机外部中断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;
}
❹ 敬爱的合泰单片机高手!!!!!!!
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; //在绝对地址定义变量
❺ 如何用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++;
}