❶ 合泰的單片機用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++;
}