首先,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了。