首先,PB0隻是一個普通IO,它只能判斷高低電平,要是換成C口(AD轉換口)倒是可以,另外,PC4也不是PWM口,MEGA48和MEGA8基本上一樣,都只有3路PWM。當然,你可以把PB0接一個按鍵,每按一次,占空比對應變化一個值。給你一個小程序,希望你能用的上:
#include<iom48v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define key1 (PINB&0x01)
#define key2 (PINB&0x02)
#define beep_on PORTD|=0x02
#define beep_off PORTD&=0xfd
#define xtal 8
void beep_three(void);
char t=0;
void delay_1ms(void)
{
uint i;
for(i=0;i<(xtal*143-2);i++)
{
NOP();
}
}
void delay_ms(uint k)
{
uint i=0;
while(i<k)
{
i++;
delay_1ms();
}
}
void port_init(void)
{
DDRB=0xfc; //PB0、1作為按鍵輸入口
PORTB=0xff;
DDRD=0xff;
PORTD=0x00;
DDRC=0xff;
PORTC=0x00;
}
void scan_s1(void)
{ if(t<=250)
{ if(key1==0)
{
delay_ms(20); //消除抖動
if(key1==0)
{
beep_on;
delay_ms(100);
beep_off;
t=t+5; //t遞加5,你可以改為1
OCR2=t; //把t值賦給OCR2,用以調節占空比。
delay_ms(200); //防止按壓按鍵時間稍長而導致連加
}
}
}
else //if(t>=244)
{
if(key1==0)
{delay_ms(20);
if(key1==0)
{
t=255;
OCR2=t;
beep_three();
delay_ms(200);
}
}
}
}
void scan_s2(void)
{ if(t>4)
{if(key2==0);
{
if(key2==0)
{
beep_on;
delay_ms(100);
beep_off;
t=t-5;
OCR2=t;
delay_ms(200);
}
}
}
else //if(t==0)
{
if(key2==0)
{delay_ms(20);
if(key2==0)
{
OCR2=0;
beep_three();
delay_ms(200);
}
}
}
}
void beep_three(void)
{
beep_on;
delay_ms(95);
beep_off;
delay_ms(95);
beep_on;
delay_ms(95);
beep_off;
delay_ms(95);
beep_on;
delay_ms(95);
beep_off;
}
void scan_key(void)
{
scan_s1();
scan_s2();
}
void timer2_init(void)
{
TCCR2 = 0x00; //停止定時器
ASSR = 0x00; //非同步時鍾模式
TCNT2 = 0x00; //初始值
TIMSK |= 0x00; //中斷允許
TCCR2 = 0x61; //啟動定時器
}
void init_devices(void)
{
CLI(); //禁止所有中斷
MCUCR = 0x00;
MCUCSR = 0x80; //禁止JTAG
GICR = 0x00;
port_init();
timer2_init();
SEI(); //開全局中斷
}
void main(void)
{
init_devices();
while(1)
{
scan_key();
}
}
㈡ 麻煩單片機編程高手告訴我這每一步的意思
BZ1:
EQU
20H;BZ1\BZ2\BZ3常量定義
BZ2:
EQU
21H
BZ3:
EQU
22H
MOV
20H,
#00H
;地址20H賦值
MOV
21H,
#00H
;同上
MOV
22H,
#00H
;同上
SETB
EA
;
允許單片機總中斷
SETB
1T
;這個沒見過,不知道你是不是打錯了=
=、
SETB
EX0
;
允許外部中斷0
MAIN:
MOV
R1,
#80H;標志MAIN,R1賦值80H
MAIN0:
MOV
A,
20H;A賦值20H
CJNE
A,
#01H,
MAIN1;比較A和01H的值,非零則跳轉MAIN1
JMP
CC;無條件跳轉至CC
MAN1:
MOV
A,
21H;MAN1標志,這里你是不少打字母I了。。A賦值21H
CJNE
A,
#01H,
MAIN2;同上
JMP
FF;無條件跳轉
MAIN2:
MOV
DPTR,
#0EFFFH;賦值
MOVX
A,
@DPTR;DPTR指向地址的內容賦值給A
MOV
DPTR,
#0DFFFH
MOVX
@DPTR,
A;同上
MOV
DPTR,
#0BFFFH
MOV
A,
R1;R1內容賦值給A
DEC
A;A自減1
MOV
R1,
A
CJNE
A,
#00H,
MAIN0;同上
JMP
MAIN;跳轉
CC:
MOV
21H,
#00H
MOV
R2,
#0FFH
MOV
R3,
#0FFH
CC0:
MOV
A,
22H
MOV
R1,
#80H
CJNE
A,#00H,
CC1
MOV
22H,
#00H
JMP
MAIN
CC1:
MOV
DPTR,
#0FFF7H
MOVX
A,
@DPTR
MOV
DL,
R2
MOV
DH,
R3
MOVX
@DPTR,
A
DEC
R2
CJNE
R2,
#00H,
CC2
MOV
R2,
R3
CC2:
MOV
DPTR,
#0FFFBH
MOVX
@DPTR,
A
MOV
DPTR,
#0FFFEH
MOV
A,
R1
MOVX
@DPTR,
A
DEC
A
MOV
R1,
A
CJNE
A,
#00H,
CC1
JMP
CC0
FF:
MOV
20H,
#00H
MOV
R2,
#FFH
MOV
R3,
#0FFH
FF0:
MOV
A,
22H
MOV
R2,
#80H
CJNE
A,
#00H,
FF1
FF1:
CJNE
R2,
#00H,
FF2
JMP
MAIN
FF2:
MOV
DL,
R2
MOV
DH,
R3
MOVX
A,
@DPTR
MOV
DPTR,
#0FFBH
MOVX
@DPTR,
A
DEC
R2
CJNE
R2,
#00H,FF3
MOV
R2,
R3
FF3:
MOV
DPTR,
#0FFFEH
MOV
A,
R1
MOVX
@DPTR,
A
DEC
A
MOV
R1,
A
CJNE
A,#00H,
FF1
JMP
FF0
中斷程序如下:
鍵盤中斷:
2D:
JNB
P10
K1
JNB
P11
K2
JNB
P12
K3
JNB
P13
K4
JNB
P14
K5
JNB
P15
K6
JMP
2D
K1:
ACALL
DELAY
JNB
P10
K11
JMP
P10
2D
K2:
ACALL
DELAY
JNB
P11
K21
JMP
2D
K3:
ACALL
DELAY
JNB
P12
K31
JMP
2D
K4:
ACALL
DELAY
JNB
P13
K41
JMP
2D
K5:
ACALL
DELAY
JNB
P14
K51
JMP
2D
K6:
ACALL
DELAY
JNB
P15
K61
JMP
2D
K11:
MOV
R0,
#10H
;置0.2ms/div
RET
;返回中斷
K21:
MOV
R0,
#20H
;置2ms/div
RET
;返回中斷
K31:
MOV
R0,
#40H
;置20ms/div
RET
;返回中斷
K41:
MOV
20H,
#01H
;置0.2ms/div
RET
;返回中斷
K51:
MOV
21H,
#01H
;置0.2ms/div
RET
;返回中斷
K61:
MOV
22H,
#01H
;置0.2ms/div
RET
;返回中斷
以上第一次出現的指令都給你注釋了。
㈢ 單片機編程 高手進 數據轉移清零
程序如下:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:
MOV 38H, #0
MOV 39H, #0
MOV 3AH, #0
MOV R0, #31H
MOV R2, #4
ADD_LOOP:
MOV A, 3AH
ADD A, @R0 ;先加31H的
MOV 3AH, A
DEC R0
MOV A, 39H
ADDC A, @R0 ;再加30H的
MOV 39H, A
MOV A, 38H
ADDC A, #0
MOV 38H, A
INC R0
INC R0
INC R0 ;轉到33H
DJNZ R2, ADD_LOOP ;循環加四次,和就在38H、39H、3AH(低位元組)中
;――――下面求平均。右移2位,即除以4
CLR C
MOV A, 38H
RRC A
MOV B, A
MOV A, 39H
RRC A
MOV 3BH, A
MOV A, 3AH
RRC A
MOV 3CH, A
MOV A, B
RRC A
MOV A, 3BH
RRC A
MOV 3BH, A
MOV A, 3CH
RRC A
MOV 3CH, A
SJMP $ ;結束,平均值在3BH 3CH。
END
㈣ 單片機學到什麼樣子才算是高手了
1,精通C和匯編,缺一不可
2,精通常用演算法,如PID調節、CRC、各種數學函數在單片機中靈活實現以及應用
3,精通兩個以上不同系列MCU的軟硬體
4,精通各種串列數據介面的軟硬規范
5,精通各種大功率驅動任務的實現
6,精通各種單片機開發會涉及到的軟體
7,熟悉上述涉及到的以及可能涉及到的器件、模塊
8,熟悉所有在開發任務中可能設計到的機械、化學、材料等基礎知識
9,擁有110以上的智商
10,永遠覺得還有很多東西需要去學習
11,嚴謹的設計理念,善於統籌協調成本與性能的關系
12,較強的知識產權意識,尊重自己以及他人
都以為單片機簡單是吧?就那麼一個小小的電子晶元,但它涉及的東西太多太多。。。。。。
哥玩的不是單片機,是寂寞~~~
㈤ 單片機編程高手請進,用T0的方式1定時,由P1.0引腳輸出50Hz方波,晶振頻率為12MHz,計算初值並編程,注釋
(1)計算計數初值X
50Hz對應周期為20mS,P1.0需要10mS反相一次。
12MHz晶振對應機器周期 = 1us
10mS需要機器周期數:10mS/1uS=10000
設需要裝入T0的初值為X: X = 65536 − 10000 = 55536。
X 化為十六進制數: 55536 = D8F0H 。
T0的初值為TH0 =0D8H,TL0 = 0F0H。
(2)程序
ORG 0000H ;程序入口
BEGIN: AJMP MAIN ;轉主程序
ORG 000BH ;T0中斷入口
AJMP IT0P ;轉T0中斷處理程序IT0P
ORG 0100H ;主程序入口
MAIN: MOV TMOD,#01H ;設置T0為方式1定時
MOV TL0,#0F0H ;T0初始化,裝初值的低8位
MOV TH0,#0D8H ;裝初值的高8位
SETB ET0 ;允許T0中斷
SETB EA ;總中斷允許
SETB TR0 ;啟動T0
SJMP $ ;原地循環,等待中斷
IT0P: MOV TL0,#0F0H ;中斷子程序,T0重裝初值
MOV TH0,#0D8H
CPL P1.0 ;P1.0的狀態取反
RETI
END
㈥ 單片機編程高手進 急!急 想把給按鍵加高電平起作用 改成加低電瓶起作用
之前定義也要改
你之前將按鍵都定義為低電平了uint
k1isdown=0;
uint
k2isdown=0;
uint
k3isdown=0;
uint
k4isdown=0;
改成高電平
㈦ 求單片機編程高手解答一下這道題
假設晶振12MHz,參考如下程序
ORG0000H
AJMPMAIN;跳轉到主程序去運行
ORG0003H;外部中斷0入口地址
LJMPEX0INT;轉到中斷服務程序去運行
ORG200H
MAIN:
MOVP1,#0FFH;熄滅掉P1埠的燈
SETBP3.2;讓P3.2這引腳置為高電平,等下按下其所接的開關將有下降沿觸發
SETBIT0;外部中斷0條件下降沿觸發
SETBEX0;外部中斷0條件使能外部中斷
SETBEA;外部中斷0條件使能總中斷
LOOP:AJMPLOOP;
EX0INT:CPLP1;對P1腳取反,即讓P1.0所接的LED亮起來
ACALLDELAY1MS;延時,1MS
RETI;中斷服務程序返回,返回到LOOP處等待下次中斷
DELAY1MS:;延時子程序,12MHZ延時時間為1MS
MOVR1,#1
D:MOVR2,#2
T:MOVR3,#248
DJNZR3,$
DJNZR2,T
DJNZR1,D
RET;子程序返回指令,子程序的設計一般都是因為主程序要調用它,
;調用完是要返回到主程序繼續運行下一個語句的
END
㈧ 單片機編程高手請進
假設條件:
1. 八個燈接P0口,1號燈對應P1.0,8號燈對應P1.7必須是CPU口負輸出有效。
2. 假設晶振是12M。
3. 假設每次亮1秒。
ORG 0000H
LJMP 0080H
ORG 0080H
MOV SP, #60H ;設堆棧起始地址
MOV R2, #05H ;重復5次
MOV R3, #01H ;間隔時間為1秒
;=====循環五次======
LOOP2:
MOV R0, #00H;查表常用
MOV R1, #06H;每一循環要送的數據次數
;=====一次循環======
LOOP:
MOV A, R0
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV P1, A
INC R0
DJNZ R1, LOOP
;===================
DJNZ R2, LOOP1
;===================
LJMP 00H
TABLE:
DB 7EH,0BDH,0DBH,0E7H,00H,0FFH
;7EH即01111110B,1、8號燈亮
;0BDH即10111101B,2、7號燈亮
;0DBH即11011011B,3、6號燈亮
;0E7H即11100111B,4、5號燈亮
;00H即00000000B,全亮
;0FFH即11111111B,全滅
DELAY:
;=====1S延時======
MOV R5, #20
DEL2:
;=====50MS延時======
DJNZ R6, #200
DEL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6, DEL1
;===================
DJNZ R5, DEL2
;===================
DJNZ R3, DELAY
RET
;如果是6M晶振,只需要把R5的20改為10就可以湊成1整秒。
;R3中存的是間隔幾秒,把它改成幾就是間隔幾秒。
;這種延時比較粗糙,如果要精確控制,需要計算每一個命令用的時間,或採用中斷。
你們是一個學校的試題吧!上午剛回答過一個這樣的問題
㈨ 求單片機編程高手
程序沒有錯誤,你將工程中的STARTUP.A51這個文件去掉就OK了。