① 关于51单片机小程序解读,如图,求大神根据问题,逐条解释啊!不要这样的答案,把立即数送至寄存器A这
句1:设置TMOD寄存器,选择定时期0,工作方式2(8位自动重装)
2,3:将定时初值装入TH0,TL0中
4:存一个数在30H地址中,用于二次系数分频
5:打开定时/计数器中断
5:开始计时
6:打开总中断
7:PSW和ACC推入堆栈断点保护
8::递减30H地中中的数据,也就是256
9:将 减剩下的数据装到A中
10:判断A中的数据是否为0,也就是判断256减完没有,没减完了,跳到T0OUT地方(你没拍出来)
11:减完250了,再重新装一下,下一次再用
12:将P1.7取反,出现方波;
同学笔试愉快
② 用51单片机编写个小程序
#include <reg52.h>
#include "delay.h"
#include "lcd1602.h"
sbit SCK = P2^0;//sbit定义单片机的特殊功能寄存器变量
sbit SDA = P2^1;
bit ack = 0;//bit定义变量
void iic_start()
{
SDA = 1;
SCK = 1;
delay_us(1);
SDA = 0;
delay_us(1);
SCK = 0;//钳住总线,等待下次使用
}
void icc_stop()
{
SDA = 0;
SCK = 1;
delay_us(1);
SDA = 1;
delay_us(1);
SCK = 0;//钳住总线,等待下次使用
}
void iic_send_byte(unsigned char byte)
{
unsigned char i;
for(i = 0;i<8;i++)
{
SDA = byte & 0x80;//非0为1
SCK = 1;
delay_us(1);
SCK = 0;
byte <<=1;//左移一位
}
SDA = 1;
SCK = 1;
delay_us(1);
if(0 == SDA)//有应答
ack = 0;
else //无应答
ack =1;
SCK = 0;//钳住总线,等待下次使用
}
unsigned char iic_rcv_byte()
{
unsigned char i,temp;
SDA = 1;
for(i = 0;i < 8;i ++)
{
SCK = 0;
delay_us(1);
SCK = 1;
delay_us(1);
temp <<= 1;
if(SDA)
temp = temp+ 1;
}
SCK = 0;
return temp;
}
void iic_ack()
{
SDA = 0;
SCK = 1;
delay_us(1);
SCK = 0;
}
void iic_noack()
{
SDA = 1;
SCK = 1;
delay_us(1);
SCK = 0;
}
void AT_send_str(unsigned char deviceaddr,unsigned char romaddr,unsigned char *s,unsigned char num)
{
unsigned char i;
iic_start();
iic_send_byte(deviceaddr);
if(ack == 1)
return;
iic_send_byte(romaddr);
if(ack == 1)
return;
for(i = 0;i < num; i ++)
{
iic_send_byte(*s);
if(ack == 1)
return;
s++;
}
icc_stop();
}
void AT_rcv_str(unsigned char deviceaddr,unsigned char romaddr,unsigned char *s,unsigned char num )
{
unsigned char i;
//SDA = 1;
iic_start();
iic_send_byte(deviceaddr);
if(ack == 1)
return;
iic_send_byte(romaddr);
if(ack == 1)
return;
iic_start();
iic_send_byte(deviceaddr + 1);
if(ack == 1)
return;
for(i = 0;i < num - 1; i++)
{
*s = iic_rcv_byte();
iic_ack();//
s++;
}
*s = iic_rcv_byte();
iic_noack();
icc_stop();
}
void main()
{
unsigned char i;
unsigned char testbuf[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,16,17,18,19};
unsigned char rcvbuf[20];
lcd_init();
AT_send_str(0xae,0,testbuf,10);
delay_ms(200);
AT_rcv_str(0xae,0,rcvbuf,10);
for(i = 0;i < 10; i++)
{
display_lcd_char(i,0,rcvbuf[i]+0x30);
}
while(1);
}
③ 求大神帮写一个51单片机的小程序。用4×4键盘
#include<reg51.h>
//Functiondeclarations
voidcct_init(void);
voiddelay(int);
voidlcdinit(void);
voidwritecmd(int);
voidwritedata(char);
voidReturn(void);
charREAD_SWITCHES(void);
charget_key(void);
//*******************
//Pindescription
/*
P2isdatabus
P3.7isRS
P3.6isE
P1.0toP1.3arekeypadrowoutputs
P1.4toP1.7arekeypadcolumninputs
*/
//********************
//DefinePins
//********************
sbitRowA=P1^0;//RowA
sbitRowB=P1^1;//RowB
sbitRowC=P1^2;//RowC
sbitRowD=P1^3;//RowD
sbitC1=P1^4;//Column1
sbitC2=P1^5;//Column2
sbitC3=P1^6;//Column3
sbitC4=P1^7;//Column4
sbitE=P3^6;//EpinforLCD
sbitRS=P3^7;//RSpinforLCD
//***********************************************************
//Mainprogram
//
intmain(void)
{
charkey;//
cct_init();//
lcdinit();//InitilizeLCD
writecmd(0x95);
writedata('w');//write
writedata('w');//write
writedata('w');//write
writedata('.');//write
writedata('T');//write
writedata('h');//write
writedata('e');//write
writedata('E');//write
writedata('n');//write
writedata('g');//write
writedata('i');//write
writedata('n');//write
writedata('e');//write
writedata('e');//write
writedata('r');//write
writedata('i');//write
writedata('n');//write
writedata('g');//write
writecmd(0xd8);
writedata('P');//write
writedata('r');//write
writedata('o');//write
writedata('j');//write
writedata('e');//write
writedata('c');//write
writedata('t');//write
writedata('s');//write
writedata('.');//write
writedata('c');//write
writedata('o');//write
writedata('m');//write
writecmd(0x80);
while(1)
{
key=get_key();//Getpressedkey
//writecmd(0x01);//Clearscreen
writedata(key);//EchothekeypressedtoLCD
}
}
voidcct_init(void)
{
P0=0x00;//notused
P1=0xf0;//
P2=0x00;//usedasdataportforLCD
P3=0x00;//usedforRSandE
}
voiddelay(inta)
{
inti;
for(i=0;i<a;i++);//nullstatement
}
voidwritedata(chart)
{
RS=1;//Thisisdata
P2=t;//Datatransfer
E=1;//=>E=1
delay(150);
E=0;//=>E=0
delay(150);
}
voidwritecmd(intz)
{
RS=0;//Thisiscommand
P2=z;//Datatransfer
E=1;//=>E=1
delay(150);
E=0;//=>E=0
delay(150);
}
voidlcdinit(void)
{
/////////////Resetprocessfromdatasheet/////////
delay(15000);
writecmd(0x30);
delay(4500);
writecmd(0x30);
delay(300);
writecmd(0x30);
delay(650);
/////////////////////////////////////////////////////
writecmd(0x38);//functionset
writecmd(0x0c);//displayon,cursoroff,blinkoff
writecmd(0x01);//cleardisplay
writecmd(0x06);//entrymode,setincrement
}
voidReturn(void)//Returnto0locationonLCD
{
writecmd(0x02);
delay(1500);
}
charREAD_SWITCHES(void)
{
RowA=0;RowB=1;RowC=1;RowD=1;//TestRowA
if(C1==0){delay(10000);while(C1==0);return'7';}
if(C2==0){delay(10000);while(C2==0);return'8';}
if(C3==0){delay(10000);while(C3==0);return'9';}
if(C4==0){delay(10000);while(C4==0);return'/';}
RowA=1;RowB=0;RowC=1;RowD=1;//TestRowB
if(C1==0){delay(10000);while(C1==0);return'4';}
if(C2==0){delay(10000);while(C2==0);return'5';}
if(C3==0){delay(10000);while(C3==0);return'6';}
if(C4==0){delay(10000);while(C4==0);return'x';}
RowA=1;RowB=1;RowC=0;RowD=1;//TestRowC
if(C1==0){delay(10000);while(C1==0);return'1';}
if(C2==0){delay(10000);while(C2==0);return'2';}
if(C3==0){delay(10000);while(C3==0);return'3';}
if(C4==0){delay(10000);while(C4==0);return'-';}
RowA=1;RowB=1;RowC=1;RowD=0;//TestRowD
if(C1==0){delay(10000);while(C1==0);return'C';}
if(C2==0){delay(10000);while(C2==0);return'0';}
if(C3==0){delay(10000);while(C3==0);return'=';}
if(C4==0){delay(10000);while(C4==0);return'+';}
return'n';//Meansnokeyhasbeenpressed
}
charget_key(void)//getkeyfromuser
{
charkey='n';//assumenokeypressed
while(key=='n')//waituntillakeyispressed
key=READ_SWITCHES();//scanthekeysagainandagain
returnkey;//
}
④ 51单片机程序编写
最简程序如下:
⑤ 朋友们帮忙写个51单片机的按键小程序汇编的
(1);P3.3小键盘按下P1.3亮再按0.5秒灭。
org 0000h
ajmp main0
org 0080h
MAIN0:
CLR 21H ;清标志
main:
mov c,p3.3 ;检测按键
jc main
MOV R6,#200 ;设定延时
MOV R7,#200
TT0:
JNB 21H,TT2 ;检测灯状态
tt:
mov c,p3.3 ;检测按键
jnc tt1
JNB 20H,MAIN ;检测时间标志
CLR 20H
AJMP TT3
TT2:
mov c,p3.3 ;检测按键
jnc tt2
TT3:
CPL 21H ;改变灯状态
cpl p1.3
ajmp main
TT1: NOP ;延时但不是子程序
NOP
NOP
NOP
NOP
NOP
DJNZ R6,TT
MOV R6,#200
DJNZ R7,TT
MOV R7,#200
SETB 20H
AJMP TT
end
(2)数码管数据 p0,数码管控制p2 独立按键p1口 ,;对独立键进行按键次数计数,三位数码管显示。 *
;K1按下后,进行加1计数 *
;K2按下后,进行减1计数。 *
;K3按下后,进行加5计数。 *
;K4按下后,清计数单元,数码管显示0。 *
;按住键可以快速计数。
K1 BIT P1.4
K2 BIT P1.5
K3 BIT P1.6
K4 BIT P1.7
K_OLD EQU 30H
K_NEW EQU 31H
K_COUNT EQU 32H
DISSTART EQU 40H ;显示单元首地址
LED_DATA EQU P0 ;数码管数据口定义
;---------------------------------------------------------
ORG 0000H
JMP MAIN
ORG 0080H
;---------------------------------------------------------
MAIN:
MOV SP,#60H
MOV P1,#0FFH
MOV P0,#0FFH
MOV K_OLD,#00H
MOV K_COUNT,#00H
MAIN1:
CALL CONVT
CALL PLAY
CALL KEY_PROG
JMP MAIN1
KEY_PROG:
CALL K_SCAN ;键扫描
MOV A,K_NEW
CJNE A,K_OLD,KEY_P1
JMP KEY_P_END
KEY_P1:
MOV R4,#20
KEY_P2:
CALL CONVT ;用显示程序来进行键延时
CALL PLAY
DJNZ R4,KEY_P2
CALL K_SCAN ;再判断键是否按下
MOV A,K_NEW
CJNE A,K_OLD,KEY_P3
JMP KEY_P_END
KEY_P3:
JB ACC.0,LOOP1 ;K1按下
JB ACC.1,LOOP2 ;K2按下
JB ACC.2,LOOP3 ;K3按下
JB ACC.3,LOOP4 ;K4按下
JMP KEY_P_END
LOOP1:
INC K_COUNT ;键计数加1
JMP KEY_P_END
LOOP2:
DEC K_COUNT ;键计数减1
JMP KEY_P_END
LOOP3:
INC K_COUNT ;键计数加5
INC K_COUNT
INC K_COUNT
INC K_COUNT
INC K_COUNT
JMP KEY_P_END
LOOP4:
MOV K_COUNT,#00H ;键计数单元清零
KEY_P_END:
RET
;---------------------------------------------------------
;代码变换 (HEX TO BCD)
;---------------------------------------------------------
CONVT:
MOV A,K_COUNT
MOV B,#100
DIV AB
MOV DISSTART+2,A ;百位存放在DISSTART+2
MOV A,#10
XCH A,B
DIV AB
MOV DISSTART+1,A ;十位存放在DISSTART+1
MOV DISSTART,B ;个位存放在DISSTART
RET
;---------------------------------------------------------
; 键扫描子程序
;---------------------------------------------------------
K_SCAN:
MOV P1,#0FFH
MOV K_NEW,#00H
MOV A,P1
CPL A
ANL A,#0F0H
SWAP A
MOV K_NEW,A
RET
;---------------------------------------------------------
;延时子程序
;---------------------------------------------------------
DELAY:
MOV R6,#200
DEL:
MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL
RET
;---------------------------------------------------------
PLAY:
MOV R0,#DISSTART ;获得显示单元首地址
MOV R1,#07FH ;从第一个数码管开始
MOV R2,#03H ;共显示3位数码管
DISP1:
MOV A,@R0 ;获得当前位地址
MOV DPTR,#TAB_NU ;获得表头
MOVC A,@A+DPTR ;查表获得显示数据
MOV LED_DATA,A ;显示数据
MOV P2,R1 ;开始显示当前位
MOV A,R1 ;准备显示下一位
RR A
MOV R1,A ;下一位
INC R0 ;取下一个单元地址
LCALL DELAY2MS ;延时 2 MS
DJNZ R2,DISP1 ;重复显示下一个
MOV P2,#0FFH ;关闭显示
RET ;显示完成,返回
;---------------------------------------------------------
;延时子程序
;---------------------------------------------------------
DELAY2MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
TAB_NU:
db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;字形代码表
;**********************************************************
END
两个例子我想够你明白的了。详细的解释,代表性的例子,可慢慢学习
⑥ 用c++怎样编写51单片机程序
相信很多初学者都有同样的疑问,也有同样的希望。就是用C++语言来写单片机程序的源代码。现在我来解释一下单片机的源代码程序几乎没有人用C++来写的。
1. 假设一下你现在用C++写完了一个程序代码。那么你要让单片机认识必须要编译吧,对吧 。请问你有合适的编译软件来编译你的代码吗?
2. 就算有编译器能编译,你能保证它的代码效率一定能给单片机用吗?
单片机的ROM是K级的水平,执行指令的速度也远远小于PC。绝对不能和PC机相比的。这个就决定了单片机编程时很多时候要考虑它的代码效率和代码大小问题。所以一般情况下对于单片机编程我们之用汇编语言或者C语言。就算是用C写程序也要注意代码的效率等问题。
还有就是只有很大型的项目及应用程序开发才有可能有C++来写程序。一般的系统文件,应用程序都是用C来写的。有的系统代码甚至要用汇编语言来写。
举个生活中的例子:如果你从家里去公司上班你一般的出行方式是什么?
1.坐公车 2.骑车 3.自己开车 4.坐地铁 5.走过去。如果谁说他是做直升飞机去上班的。那要么这个人脑子不正常,要么就是太有钱了炫富。如果你要打苍蝇用苍蝇拍子就行了。如果要你用巡航导弹来打苍蝇,你认为可能吗?
所以我们单片机写程序的话一般就是汇编语言和C语言。几乎没有人用C++语言的。
⑦ 51单片机程序,急救
D2亮(其它灯不亮)→MOVP1,#11111101B
D4亮(其它灯不亮)→MOVP1,#11110111B
D6亮(其它灯不亮)→MOVP1,#11011111B
D8亮(其它灯不亮)→MOVP1,#01111111B
D7不亮(其它灯亮)→MOVP1,#01000000B
D5不亮(其它灯亮)→MOVP1,#00010000B
D3不亮(其它灯亮)→MOVP1,#00000100B
D1不亮(其它灯亮)→MOVP1,#00000001B
并且以此循环。
3次后结束,每个灯点亮1S。
别忘了采纳。
⑧ 51单片机的一个简单程序
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,P0
ANL A,#1EH
CJNE A,#02H,MAIN1
SETB P1.1
CLR P1.2
CLR P1.8
SJMP MAIN
MAIN1:
CJNE A,#04H,MAIN2
CLR P1.1
SETB P1.2
CLR P1.8
SJMP MAIN
MAIN2:
CJNE A,#1EH,MAIN3
CLR P1.1
CLR P1.2
SETB P1.8
SJMP MAIN
MAIN3:
CLR P1.1
CLR P1.2
CLR P1.8
LJMP MAIN
END