编程题 硬件电路中由8051单片机P1口控制8个放光二极管,编程实现依次点亮8个发光二极管?

作者&投稿:弓蓝 (若有异议请与网页底部的电邮联系)
51单片机编程题 单片机P1口接八个发光二极管(共阳极接法),试编写流水灯的程序使发光二极管逐~

//prj1 流水灯实验,LED灯是共阳极,给0亮。J1跳线帽
//用的是移位的方法

//头文件定义
#include
#include

//延时函数定义
void delay(void)
{
unsigned int i;
unsigned int j;
for(i=200;i>0;i--)
{
for(j=200;j>0;j--);
}
}

void main()
{
P0 = 0xfe; //1111 1110
delay();
while(1)
{
P0 = _crol_(P0,1) ; // 将P0端口循环左移  
delay();
if(P0 == 0x7f)
{
P0 = _cror_(P0,1);
delay();
P0 = _cror_(P0,1);
delay();
P0 = _cror_(P0,1);
delay();
P0 = _cror_(P0,1);
delay();
P0 = _cror_(P0,1);
delay();
P0 = _cror_(P0,1);
delay();
P0 = _cror_(P0,1);
delay();
}
}
}


附件里有Proteus仿真、Keil C工程和程序文件,可以看看效果。
#include #include #define uchar unsigned char#define uint unsigned int//变量uchar Count,LED;//主程序void main(){ P0=0xff; Count=0; LED=0x01; TMOD=0x01; //12MHZ晶振 C51单片机对其12分频 //实际定时器“加1”频率为1MHZ 也就是1us //用定时器中断时间间隔 是从“开启定时器加1”到“溢出”的时间 //对于工作在模式1的定时器0来说 也就是从“开启定时器加1”到“(TH0 TL0)=(0xff 0xff)+1”的时间 //0xffff+1=65536 //如果(TH0 TL0)初始值是(65536-50000) 那么初始值到溢出需要“加1”50000次 //1次是1us 50000次就是50000us=50ms //如果我们对定时器的中断次数进行计数,每20次算作一个时间段,那么这样的一个时间段就是20*50ms = 1000ms = 1s //这就是利用定时器计时的原理 //因为TH0和TL0分别是高字节和低字节,所以赋初值时也要将(65536-50000)分成高低字节分别赋值给TH0和TL0 //高字节 是除以256后的到的商 低字节 是除以256后的到的余数 //另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值 //所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值 TH0=(65536-50000)/256;//50ms 定时 TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1;//启动T0 while(1) { //显示 P1=LED; }}//T0 中断函数void Int_T0() interrupt 1{ //另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值 //所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值 TH0=(65536-50000)/256;// 恢复初值 TL0=(65536-50000)%256; //Count每中断一次加1 以20为周期 每当等于20时候说明1s到了 if(++Count==4) { Count=0; LED=_crol_(LED,1); }}

首先搞清LED管是高电平导通还是低电平导通。
如果是低电平导通,P1赋0x00时,发光管全亮,0xff时,全灭。
具体程序:
#define uint unsigned int
#define uchar unsigned char
void delay(uint time_out)
{
uint i,j;
for(i=0;i<time_out;i++)
{
for(j=0;j<110;j++)
{;}
}
}

void main(){
while(1)
{
P1=0xfe; //第1个管亮
delay(500);
P1=0xfd; //第2个管亮
delay(500);
P1=0xfb; //依次类推
delay(500);
P1=0xf7;
delay(500);
P1=0xef;
delay(500);

P1=0xdf;
delay(500);

P1=0xbf;
delay(500);

P1=0x7f;
delay(500);
}
}

程序大致如此,delay函数负责延迟500ms.有问题自己再调试调试

你好,您需要的是c代码,还是汇编,如果是汇编我可以给你编,如果是c代码,见一楼的,呵呵

是P1.0~~P1.8吧? 间隔点亮具体是怎样?


元坝区13155275269: 求一道最简单的关于8051单片机的编程题及答案解析
学卓普怡: 下面是一段子程序: ORG 30H POP DPH POP DPL MOV DPTR,#300H RL A MOV B,A MOVC A,@A+DPTR PUSH A MOV A,B INC A MOVC A,@A+DPTR PUSH A RET ORG 300H DB 10H,80H,30H,80H,50H,80H 已知子程序执行前: A=02H,SP=42H,(41H)=FFH,(42H)=FFH 当子程序执行后: 问:A=( ),SP=( ),(51H)=( ),(52H)=( ),PC=( ). 答案:A=80H , SP=40H , (51H)=50H , (52H)=80H , PC=8050H.

元坝区13155275269: 1.用8051单片机设计一电路,使其能测出方波信号频率2.画出硬件接线图3.画出流程图,编写程序
学卓普怡: 用定时计数器来做吧,很简单的,在KEIL上生成HEX文件然后用Proteus来调试一下就可以了,不过有频率限制,好像是在1/24fosc吧.而且电路原理并不复杂,元器件也不多,自己多动动脑想下就OK了

元坝区13155275269: 用8051单片机设计步进电机控制器的原理和实现方法 -
学卓普怡: 本设计采用ATMEL公司DIP-40封装的AT89S52单片机实现对四相步进电机的手动和遥控控制.由单片机产生的脉冲信号经过脉冲分配后分解出对应的四相脉冲,分解出的四相脉冲经驱动电路功率放大后驱动步进电机的转动.转速的调节和状态...

元坝区13155275269: C8051单片机编程问题 -
学卓普怡: 主程序main必须是一个死循环,这样程序才可能一直运行下去#include sbit L1=P2^4; void main() { while(1) L1=0; } //

元坝区13155275269: 单片机题目一套,急急急!!! -
学卓普怡: 给你回答一部分吧. 选择题:2C3A4B5D 填空题: 2位单元名称,位单元地址 3EA 低电平 2us 4B A 512,24 6低电平触发,下降沿触发 7注释 操作码 8128 工作寄存器区,位寻址区,堆栈和用户可寻址区 9128,71H-7FH 判断题(T正确F错误) TFFFT FFFFT 画图题自己试着画吧,这里不好传. 编程题2 MOV R0,#50H MOV R7,#33 CLR A LOOP:MOV @R0,A INC R0 DJNZ R7,LOOP SJMP $ END 最后一题: (A)=50H (SP)=50H (51H)=30H (52H)=50H PC=3050H

元坝区13155275269: 求8051单片机编程———实现由1到99相加 -
学卓普怡: 编一个实现该功能的子程序吧;结果存于R3R2中 SUM: MOV R0,#0 ;被加数清0 MOV R2,#0 ;结果清零 MOV R3,#0 ;结果清0 LP: INC R0 ;被加数+1 MOV A,R0 ;被加数送A ADD A,R2 ;A+R2 MOV R2,A ;结果送R2 XCH A,R3 ;结果高8位送A ADDC A,#0 ;带进位加 MOV R3,A ;结果送R3 CJNE R0,#99,LP ;不到99继续 RET

元坝区13155275269: 设计8位16进制数转10进制程序. 8051单片机编程 -
学卓普怡: 比如十六进制数num:num=num/16*10+num%16原理方法就是把相应位(十进制中个位、十位这样的位)分离出来,分别乘以转化目标进制数的进率之和.num/16为十六进制高位,num%16为十六进制低位,分别乘以十进制进率之和num/16*10+num%16*1

元坝区13155275269: 有一个8051的单片机系统,编程实现 -
学卓普怡: “P0.0引脚输出7ms高电平、3ms低电平的周期信号”可以定时器来实现,P0.1引脚上输入的脉冲信号记个数用一个whil循环,查询法得到,不过对外部脉冲计数最好接在外部中断脚,那样会比较准确

元坝区13155275269: 1设单片机采用8051,未扩展片外ROM,片外RAM采用一片6116,编程将其片内ROM从0100H单元开始的10B得内容依次 -
学卓普怡: START: MOV DPTR,#0100H ;转载地址指针 MOV R2,#010H ;计数器初值 LOOP: CLR A ;A清零 MOVC A,@A+DPTR ;读内部ROM MOVX @DPTR,A ;写外部RAM INC DPTR ;指针+1 DJNZ R2,LOOP ;判断是否达到10H次,没到则跳到LOOP继续循环 NOP SJMP $-1 ;达到次数,程序结束,死循环. END

元坝区13155275269: 单片机编程查找8051内部RAM的30H到40H单元中是否有OAAH,若有,这将P1.0置1,否则置0 -
学卓普怡: clr p1.0 mov r0,#30h loop: mov a,@r0 cjne a,#0aah,skip setb p1.0 skip: inc r0 cjne r0,#41h,loop sjmp $ end

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网