51单片机汇编:p1.0控制一个LED,每5s状态反转一次,用定时器中断
我的程序编译没错,但用proteus仿真,LED灯只是最初保持亮(灭)5s,之后就一直灭(亮),自己改了好久还是改不出来。求大神指导!我的思路是用T0,方式1,方式1计数...
我的程序编译没错,但用proteus仿真,LED灯只是最初保持亮(灭)5s,之后就一直灭(亮),自己改了好久还是改不出来。求大神指导!我的思路是用T0,方式1,方式1计数范围是100多ms,选100ms为定时周期,循环50次。预初值TL0是0BH,TH0是3CH,数是参考书上的都没有错。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP IT0P
ORG 1000H
MAIN: MOV SP,#60H
MOV B,#50
MOV TMOD,#01H;定时器,方式1
MOV TL0,#0B0H
MOV TH0,#3CH
SETB ET0
SETB EA
SETB P1.0;高电平点亮
SETB TR0;启动T0,定时开始
here: sjmp here
IT0P: MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ B,TC;循环50次
CPL P1.0;这条反转状态不知道该放哪儿,挪了几次都不对
TC: RETI;此后是不是还要LJMP到main,周而复始?逻辑到这儿就混乱了
end 展开
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP IT0P
ORG 1000H
MAIN: MOV SP,#60H
MOV B,#50
MOV TMOD,#01H;定时器,方式1
MOV TL0,#0B0H
MOV TH0,#3CH
SETB ET0
SETB EA
SETB P1.0;高电平点亮
SETB TR0;启动T0,定时开始
here: sjmp here
IT0P: MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ B,TC;循环50次
CPL P1.0;这条反转状态不知道该放哪儿,挪了几次都不对
TC: RETI;此后是不是还要LJMP到main,周而复始?逻辑到这儿就混乱了
end 展开
3个回答
展开全部
汇编不会啊。
/*******************************************************
* 程序名称:hc595.c
* 程序功能:595的应用文件,595控制数码管
* 程序作者:吴鉴鹰
* 创建时间:2013-12-7
* 修改时间:2013-12-9
* 程序版本:V0.2
******************************************************/
/*
* 包含头文件
*/
#include "inc/hc595.h"
#include "reg51.h"
/*
* 定义引脚
*/
/* 595控制数码管时钟信号线引脚定义 */
sbit HC595CLK = P1^1;
/* 595控制数码管片选信号线引脚定义 */
sbit HC595RCK = P1^0;
/* 595控制数码管数据输入引脚定义 */
sbit HC595DATA = P1^4;
/******************************************************
* 函数名称:SendData
* 函数功能:74HC595数据的发送
* 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo
* 出口参数:void
*******************************************************/
void SendData(unsigned int uiDataOne, unsigned int uiDataTwo)
{
unsigned int i = 0;
/* 将片选信号置为低电平 */
HC595RCK = 0;
/* 输入第一个数据:uiDataOne */
for (i = 0; i < 8; i++)
{
/* 给出脉冲信号,首先将CLK置为0 */
HC595CLK = 0;
if (0 != (uiDataOne & 0x80))
{
HC595DATA = 1;
}
else
{
HC595DATA = 0;
}
/* 给出脉冲信号,首先将CLK置为1 */
HC595CLK = 1;
/* 准备第二个数据 */
uiDataOne = uiDataOne << 1;
}
/* 输入第二个数据:uiDataTwo */
for (i = 0; i < 8; i++)
{
/* 给出脉冲信号,首先将CLK置为0 */
HC595CLK = 0;
if (0 != (uiDataTwo & 0x80))
{
HC595DATA = 1;
}
else
{
HC595DATA = 0;
}
/* 给出脉冲信号,首先将CLK置为1 */
HC595CLK = 1;
/* 准备第二个数据 */
uiDataTwo = uiDataTwo << 1;
}
/* 将片选信号置为高电平 */
HC595RCK = 1;
}
/*******************************************************
* 程序名称:hc595.c
* 程序功能:595的应用文件,595控制数码管
* 程序作者:吴鉴鹰
* 创建时间:2013-12-7
* 修改时间:2013-12-9
* 程序版本:V0.2
******************************************************/
/*
* 包含头文件
*/
#include "inc/hc595.h"
#include "reg51.h"
/*
* 定义引脚
*/
/* 595控制数码管时钟信号线引脚定义 */
sbit HC595CLK = P1^1;
/* 595控制数码管片选信号线引脚定义 */
sbit HC595RCK = P1^0;
/* 595控制数码管数据输入引脚定义 */
sbit HC595DATA = P1^4;
/******************************************************
* 函数名称:SendData
* 函数功能:74HC595数据的发送
* 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo
* 出口参数:void
*******************************************************/
void SendData(unsigned int uiDataOne, unsigned int uiDataTwo)
{
unsigned int i = 0;
/* 将片选信号置为低电平 */
HC595RCK = 0;
/* 输入第一个数据:uiDataOne */
for (i = 0; i < 8; i++)
{
/* 给出脉冲信号,首先将CLK置为0 */
HC595CLK = 0;
if (0 != (uiDataOne & 0x80))
{
HC595DATA = 1;
}
else
{
HC595DATA = 0;
}
/* 给出脉冲信号,首先将CLK置为1 */
HC595CLK = 1;
/* 准备第二个数据 */
uiDataOne = uiDataOne << 1;
}
/* 输入第二个数据:uiDataTwo */
for (i = 0; i < 8; i++)
{
/* 给出脉冲信号,首先将CLK置为0 */
HC595CLK = 0;
if (0 != (uiDataTwo & 0x80))
{
HC595DATA = 1;
}
else
{
HC595DATA = 0;
}
/* 给出脉冲信号,首先将CLK置为1 */
HC595CLK = 1;
/* 准备第二个数据 */
uiDataTwo = uiDataTwo << 1;
}
/* 将片选信号置为高电平 */
HC595RCK = 1;
}
展开全部
LED1与P1_0相连,高电平有效,要求采用T3的中断方式控制LED1,使其每5s闪烁1次。请问这个怎么做啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
晶振频率是多少?
IT0P:
MOV TL0, #0B0H
MOV TH0, #3CH
DJNZ B, TC
MOV B, #50 ;加上这句
CPL P1.0
TC:
RETI
END
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询