微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机新手,刚开始学,求大神帮我看看问题出在哪了

51单片机新手,刚开始学,求大神帮我看看问题出在哪了

时间:10-02 整理:3721RD 点击:
我写的C语言如下  是想要 讲LED灯轮流移动,汇编没有错误,但是单片机没现象,实在搞不懂 希望大神告诉我哪出错了?
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit WEI=P2^7;     //数码管位控制脚
sbit DUAN=P2^6;    //数码管段控制脚
uchar aa,tt;
void main()
{        WEI=0;         //位锁存置0电平,防止LED亮的时候数码管亮
        DUAN=0;              //段锁存置0电平,防止LED亮的时候数码管亮
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        aa=0xfe;
        P0=aa;
        while(1)
        {
                if(tt==20)
                tt=0;
                aa=_crol_(aa,1);
        }
}
void exter0() interrupt 1
{       
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        tt++;
}


第二个也是除了问题
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
#define uchar unsigned char
sbit WEI=P2^7;     //数码管位控制脚
sbit DUAN=P2^6;    //数码管段控制脚
uchar aa;
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{   aa=0x7f;
        P0=aa;
        WEI=0;         //位锁存置0电平,防止LED亮的时候数码管亮
        DUAN=0;              //段锁存置0电平,防止LED亮的时候数码管亮
        while(1)
        {        Delay(50000);
                aa=_crol_(aa,1);
        }
}

/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}

LED


52单片机


锁存器


自己顶一下自己顶一下自己顶一下自己顶一下

我帮你顶一下,,呵呵
可能你描述有点问题,

第一个程序很明显啊,你只把aa做了运算,但是没有赋值给P0口,肯定不会动啦!你把 if(tt==20)
                tt=0;
                aa=_crol_(aa,1);P0 = aa;放到中断服务函数里面就好了!

第二个问题是样的问题,没有把aa的值赋给P0口,自然看不到流水灯了!

给你参考一个可以用的程序
************************************************************/
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp>>=1;
}
}
}
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}

你没有对P0口 进行逻辑运算  肯定他的没有电平   输出。

aa=0xfe;
        P0=aa;
我不是把aa的值赋给了P0口了么

只有刚开始一瞬间把aa的值赋给了P0口了,之后全在while(1)里循环,循环里没有给P0口啊

主函数里面要给P0口赋值

while(1)里面要赋值,要不然你只是给aa做了处理,还没给P0

貌似有点懂哪里出错了,十分感谢

不是一般的简单
循环左移下面加句
P0=aa;

你让程序进入了while 而你给P0的语句在main里面。都不执行~~~就是刚开机执行一次~~~你说会有反应么~~~~~~~~

恩,已经纠正了 谢谢你的回复

我也试过了    是8个LED都亮,是不是LED适合延时函数 跟中断不协调啊 晕!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top