导航:首页 > 操作系统 > 单片机中p06p06

单片机中p06p06

发布时间:2022-05-08 08:36:22

1. 51单片机简单编程问题

逻辑有问题,51单片机的IO端口是“线与”的关系,你用按键将两个管脚连在一起,若一个输出0,另外一个若是1,也会被强制变成0,而不是二个都变成1
像程序中 { P2=0xf0; if(P2==0xf8) 是不可能成立的,因P2的低4 位输出 0,当按下S10/ S11 /S12三个按键时,P2.6/P2.5 /P2.4 会被拉低,而不P2.3被拉高

2. 51单片机如何在一个工程中同时加入延时和多组次数循环

假设循环10次和20次

c=10;
while(c--)
{
你要循环的程序1

c=20;
while(c--)
{
你要循环的程序2

当然也可用for循环

3. 如何利用单片机让4位数码管显示

程序如下(用的是STC89C52芯片):

#include<reg52.h>//52系列单片机头文件

#defineucharunsignedchar

#defineuintunsignedint

uintx,y;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};//共阴极数码管编码

voiddisplay(uchar,uchar,uchar,uchar);//声明子函数

voiddelay(int);//声明子函数

voidmain()

{

while(1)

{

display(1,2,3,4);//主程序始终调用数码管显示子程序

}

}

voiddisplay(uchara,ucharb,ucharc,uchard)

{

P2=0xef;

P0=table[a];//给第一个数码管送"a"

delay(1);//延时1ms

P2=0xdf;

P0=table[b];//给第二个数码管送"b"

delay(1);//延时1ms

P2=0xbf;

P0=table[c];//给第三个数码管送"c"

delay(1);//延时1ms

P2=0x7f;

P0=table[d];//给第三个数码管送"d"

delay(1);//延时1ms

}

voiddelay(uintz)//延时子函数

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

(3)单片机中p06p06扩展阅读

led数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。

位数有半位,1,2,3,4,5,6,8,10位等等,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

4. 51单片机如何产生8路PWM波

我来说一下我的方案,这个我验证过,方法如下:

其实用一个定时器就够了,外部中断接按键,一个用来频率加,一个用来频率减,即做调节频率用,8路频率从P0口输出,定时器产生中断,比如1us,那么我到1us时对P0.0取反,同时中断里在定义一个变量t1,那么t1计中断次数,假如计到5时我让P1.0取反,儿至于计到几有外部中断来定义,比如定义一个全局变量f,INT0按一次则f++,INT1S按一次f- -,如此频率得以控制,定时器处理如下:
void TIME0_ISR(void) interrupt 2
{
t1++;
if(t1==f) p00=~p00;
if(t1==f) p01=~p01;
if(t1==f) p02=~p02;
if(t1==f) p03=~p03;
if(t1==f) p04=~p04;
if(t1==f) p05=~p05;
if(t1==f) p06=~p06;
if(t1==f) {p07=~p07; f=0;}

}
当然这只是简单的用51本身资源产生而已,还可以用专门的外围电路来实现,我给你一个四路频率产生程序,思想如上,已验证过
/*************************四路频率产生器***************************************/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

/*************************常量定义***************************************/

sbit pwm1=P1^0; //第一路频率 1s内产生5000个脉冲
sbit pwm2=P1^1; //第二路频率 1s内产生1000个脉冲
sbit pwm3=P1^2; //第三路频率 1s内产生2500个脉冲
sbit pwm4=P1^3; //第四路频率 1s内产生500个脉冲

uchar cout1,cout2; //分别用来定义时间宽度
uchar t0_max=10,t1_max=100;

/*******************定时器0初始化函数***************************************/

void time0_ini() //定时0初始化
{
TMOD=0X02; //采用定时器0,选择模式2
TH0=0xA3; //0.1ms定时
TL0=0Xa3;
ET0=1; //允许定时器溢出中断
TR0=1; //启动定时器

}

/***************************外部中断0初始化***********************************/

void INT0_ini()
{
EX0=1; //外部中断0允许
IT0=1; //选择边沿触发方式
}

/***************************定时器1初始化*****************************************/

void time1_ini()
{
TMOD=0X20; //采用定时器1,选择模式2
TH1=0XA3 ; //定时0.1ms
TL1=0XA3;
ET1=1; //允许定时器中断
TR1=1; //启动定时器1

}

/*************************主函数************************************************/

void main()
{
time0_ini(); //调用定时器0初始化函数
time1_ini(); //调用定时器1初始化函数
INT0_ini();
cout1=0;
cout2=0;

pwm1=0; //没一路频率都从低电平开始
pwm2=0;
pwm3=0;
pwm4=0;

EA=1; //打开总中断
while(1); //一直停留在主函数中
}

/***************************定时器中断服务程序************************************/

void tim0_ISR() interrupt 1 //定时0中断服务程序
{
cout1++; //计数变量加1
if(cout1==t0_max)
{
pwm1=~pwm1; //每当到了1ms时取反一次电平,即周期为2ms,1s内产生500个脉冲
}
if(cout1==(t0_max+10))
{
cout1=0; //每当到了2ms时取反一次电平,即周期为4ms,1s内产生250个脉冲
pwm2=~pwm2;
}
}

/**************************定时器1中断服务程序************************************/

void time1_ISR() interrupt 3 //定时器3中断服务程序
{
cout2++;
if(cout2==t1_max)
{
pwm3=~pwm3; //每当到了10ms时取反一次电平,即周期为20ms,1s内产生50个脉冲
}
if(cout2==(t1_max+150))
{
cout2=0; //每当到了25ms时取反一次电平,即周期为50ms,1s内产生20个脉冲
pwm4=~pwm4;
}
}

/********************外部中断0服务程序**************************/

void INT0_ISR() interrupt 0
{
if(t0_max>200) t0_max=10; //清楚上限
if(t1_max>2000) t1_max=100;
t0_max=t0_max+10;
t1_max=t1_max+100;
}

5. 如何让其定义51单片机p0接口宏定义p07-p06-p05和p00-p01-p02一样顺序

那是宏定义不是定义成变量

6. 51单片机检测引脚电平变化的C语言程序

#include <reg52.h>
sbit LED0 = P0^0; sbit LED1 = P0^1; sbit LED2 = P0^2; sbit LED3 = P0^3;
sbit LED4 = P0^4; sbit LED5 = P0^5; sbit LED6 = P0^6; sbit LED7 = P0^7;
sbit LED10 = P1^0;
void main() {
LED0 = 0; LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0;
LED7 = 0;
LED7 = 1;//假设有变化

if(LED7) {
LED10 = 1;
LED0 = 1; LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; }
}

7. 关于51单片机点阵心形显示问题

首先你要搞清楚点阵显示原理。
8*8点阵要显示一个画面,通常采用扫描的形式。点阵内部发光阵列每一行的阴极连在一起,引出一条共阴线;每一纵向阳极连在一起,引出一条共阳线。这样8*8点阵就共有8条共阴线和8条共阳线。具体请参考点阵内部结构示意图!
扫描的过程:例如将共阳线作为扫描线,即每次给其中一条阳线供电,其它阳线断电。这样,在该条阳线上的LED点亮与否就取决于8条阴线的电平高低了。快速地扫描阳线,并且每扫描一条就给阴线变化相应的电平,就实现了一组图像的显示。
在你给的程序中,很明显的 tabP2是用来形成扫描输出的。你自己分析一下这些值每次是不是只发生了0这个值的移位。这是采用查表法来得到扫描功能的,每次让IO口(一组)输出这表中的一个值,最终就形成了扫描动作。至于tabP0就是对应于每一个扫描线输出的心形数据表了。每次扫描IO输出 tabP2的一个值,对应数据IO输出tabP0的一个值。
至于你说的“还有8X8点阵图中接口P23,P25,LP04,LP06,其中的LP04,LP06是不是指单片机的P04和P06接口啊?”我个人认为你应该自己有能力对这等电路进行分析了,不要一味只是单纯复制制作。只有自己尝试了解,以后才能做出更具特色的东西而不会仅仅停留在心形显示。

8. 单片机sbit问题

在C语言中,“^”这个符号叫“按位异或运算符”,不能用来取寄存器的位。也就是说,在C语言中,如果写 P0^6=1,这是个错误表达式。所以,C51语言中,需要将寄存器的位先进行位定义:sbit P06=P0^6; 才能进行后续的 位操作:P06=1;
当然,如果你要直接 P0=0x40,也可以让 P0.6=1,但是,它又同时会修改P0的其他位。
又当然,用与、或运算能避免:P0 |=0x40,这个 P06=1了,而其他又不改变。但是,这不符合C语言的可读性、移植性要求,因为,你压根就不知道P06=1是要干嘛。而且也移植不了。
正确使用的时候是这样的:sbit LED=P0^6;这就表示LED了

9. 单片机控制继电器

这个事专为你写的程序。在keil里编译通过。

ORG 00H
LJMP START
ORG 0BH
LJMP TIM
ORG 30H
START:
MOV IE,#10000010B
MOV TMOD,#00000010B
MOV TH0,#05H
SETB TR0
CLR 20H.0
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV SP,#2FH
LOOP:
JBC 20H.0,NEXT1
SJMP LOOP
NEXT1:
CJNE R3,#00H,NEXT2
INC R3
MOV R1,#00H
MOV R2,#00H
MOV R4,#00H
CLR 20H.2
JNB 20H.2,$
CLR 20H.2
MOV P0,#11111101B
AJMP LOOP
NEXT2:
CJNE R3,#01H,NEXT3
INC R3
MOV R1,#00H
MOV R2,#00H
MOV R4,#00H
CLR 20H.1
JNB 20H.1,$
MOV P0,#11111011B
AJMP LOOP
NEXT3:
CJNE R3,#02H,NEXT4
INC R3
MOV P0,#11110111B
AJMP LOOP
NEXT4:
CJNE R3,#03H,NEXT5
INC R3
AJMP LOOP
NEXT5:
CJNE R3,#04H,NEXT6
INC R3
AJMP LOOP
NEXT6:
CJNE R3,#05H,NEXT7
INC R3
AJMP LOOP
NEXT7:
CJNE R3,#06H,NEXT8
INC R3
AJMP LOOP
NEXT8:
CJNE R3,#07H,NEXT9
INC R3
MOV P0,#11101111B
AJMP LOOP
NEXT9:
CJNE R3,#08H,NEXT10
INC R3
AJMP LOOP
NEXT10:
CJNE R3,#09H,NEXT11
INC R3
MOV P0,#11011111B
AJMP LOOP
NEXT11:
CJNE R3,#0AH,NEXT12
INC R3
MOV P0,#11011111B
AJMP LOOP
NEXT12:
CJNE R3,#0BH,NEXT13
INC R3
MOV P0,#11011111B
AJMP LOOP
NEXT13:
CJNE R3,#0CH,NEXT14
INC R3
MOV P0,#11011111B
AJMP LOOP
NEXT14:
CJNE R3,#0DH,NEXT15
INC R3
MOV P0,#11011111B
AJMP LOOP
NEXT15:
CJNE R3,#0EH,NEXT16
INC R3
MOV P0,#10111111B
AJMP LOOP
NEXT16:
CJNE R3,#0EH,NEXT
INC R3
MOV P0,#10111111B
AJMP LOOP
NEXT:
MOV R3,#00H
AJMP NEXT1

TIM:
INC R0
CJNE R0,#40,OVER
MOV R0,#00H
INC R1
CJNE R1,#10,OVER
MOV R1,#00H
SETB 20H.0
INC R2
CJNE R2,#100,OVER
MOV R2,#00H
SETB 20H.1
INC R4
CJNE R4,#18,OVER
MOV R4,#00H
SETB 20H.2
OVER:
RETI
END

10. 51单片机红外遥控接收程序,请帮忙修改一下错误

这跟你使用的单片机、晶振,也就是速度有关系,单纯的一个程序,根本没办法更改。

给你个我的,很好用,关键是精简,不使用外部中断,使用定时器一枚。

STc89c52+11.0592

SBITIRrecPort=PORTD^3;
BITIRprotLaststatus=0;//端口状态位
unsignedcharcodeCount=0;//数据码位计数
unsignedcharirTime;//码时间,用于以125us时间计时
[4];//接收数据缓存

/*******************************
*Function:
*Description:函数功能、性能描述
*Calls:被本函数调用的函数清单
*CalledBy:调用本函数的函数清单
*Tableaccessed:被访问的表(数据库操作用)
*TabledUpdated:被修改的表(数据库操作用)
*Input:输入参数、取值说明与关系
*Output:输出参数、类型说明
*Return:函数返回值说明
*Others:(Screensequence)
******************************/
(void)
{
T2MOD=0X00;
T2CON=0X00;
RCAP2L=(unsignedint)(0XFFFF-(250/((12/FOSC)+0.00005))+1);
RCAP2H=(unsignedint)(0XFFFF-(250/((12/FOSC)+0.00005))+1)>>8;
TL2=RCAP2L;
TH2=RCAP2H;
//TR2=1;
ET2=1;
EA=1;
}
/*******************************
*Function:
*Description:函数功能、性能描述
*Calls:被本函数调用的函数清单
*CalledBy:调用本函数的函数清单
*Tableaccessed:被访问的表(数据库操作用)
*TabledUpdated:被修改的表(数据库操作用)
*Input:输入参数、取值说明与关系
*Output:输出参数、类型说明
*Return:函数返回值说明
*Others:(Screensequence)
******************************/
voidIRreceive_Hander(void)interrupt5
{
TR0=0;
if(TF2)
{
TF2=0;
irTime++;
if(irTime==120)//存活时间240*125=30MS
{
irTime--;
codeCount=0x3f;
}
if(IRrecPort)IRprotLaststatus=1;
elseif(IRprotLaststatus)
{
IRprotLaststatus=0;
if(irTime<12)
{
codeCount++;
codeCount&=0x1f;//限制其codeCount不大于某某数
InfarereceiveArray[codeCount>>3]<<=1;
if(irTime>7)
{
InfarereceiveArray[codeCount>>3]++;
}
}
irTime=0;
}
}
TR0=1;
}
阅读全文

与单片机中p06p06相关的资料

热点内容
五十音图pdf 浏览:855
什么叫下架服务器 浏览:111
pdf分辨率查看 浏览:15
如何将word转pdf 浏览:186
我的世界ec服务器怎么调配置 浏览:259
单片机换标 浏览:595
语音系统和方舟编译器哪个好 浏览:316
html用什么编译器显示 浏览:185
程序员打印系统 浏览:73
安装系统端口和服务器地址怎么看 浏览:263
编译指针 浏览:410
用于解压房款的担保协议 浏览:672
程序员补班 浏览:564
组件编译语言 浏览:815
c文件夹怎么复制 浏览:966
linux统计ip流量 浏览:997
905减407的竖式算法 浏览:647
我的世界网易版如何查看服务器种子 浏览:632
施工现场临时水管直径算法 浏览:5
如何刷新服务器redis缓存 浏览:502