㈠ 如何用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,然後進入鬆手檢測,在其中設置時間標志,若經過幾秒鍾還是按下狀態,則變數一直加,祝成功~~