本文目录一览:
用c啊,我想想:
1、和硬件有点儿关系,这个你清楚么?
2、假设led连接到p1口吧。第一个灯接到p1.0。阴极接io,阳极接5v。
#include
bit
secflag;
unsigned
char
ms;
void
display(unsigned
char
num,unsigned
char
sec)
{
num%=8;
p1=~(1
8;tl0=-50000;
ms++;
if(ms20){ms=0;secflag=1;}//12mhz,
50ms定时中断,1秒计时。
}
你很容易扩展出任意要求的闪烁流水灯啦。
display(2,1);
display(1,1);
display(3,2);
display(1,2);
……放到while里面就好了。祝你玩得开心。
#includereg51.h
void delay(unsigned int i);
main() //主函数
{
P2=0x55; //P2口:0101 0101 从左到右:第一个口低电平,第二个口高电平。。。。
delay(600); //延时600,不延时你来不及看见灯亮
P2=0xaa; /*P2口输出端取反,1010 1010 高电平变低电平,低电平变高电平,(原来亮的关掉,原来不亮的亮)*/
delay(600);
}
void delay(unsigned int i) //这个是延时函数
{
unsigned char j;
for(i;i0;i--)
for(j=255;j0;j--) ;
}
这样应该明白了吧!不过你这个程序,按一下复位(或者打开一次电源)只亮一下。加个循环就可以不停的闪啦!
任何单片机程序都要有一个死循环,否则程序执行到底了,然后怎么办。没有这个死循环,单片机从0地址重新运行,整个系统重新初始化,会导致IO口复位,运行的很快的话,就看到别的灯微亮。at89s52也是51系列的单片机,程序完全兼容,用51的程序就行了,包括外围电路也一样,直接用就行了。 单灯亮就是在io口输出一个二进制数中只有一位不同的数,比如说“00000001”,就只有最后一位是“1”,其余的都是“0”,要双灯亮就使其中的两位与其他的不同就行了,还是那上面的例子来说,现在改成“00000011”,这样有两位是不用的了,当然不同的两位也可以不挨着,比如“00100001”,这样也是两位同时点亮。(例子的前提是输出高电平时led点亮,如果不是的话就把里面的“0”改成“1”,“1”改成“0”就行了。出现这种问题我感觉有一下几点原因,你可以逐个排查下,如果程序下载成功,说明单片机电源应该没有问题,那就需要看已下几点
1.看你的程序是不是编写的不对,主要看你的IO口配置是否正确,IO口的高低电平是不是写错了,IO口电平翻转时,中间是不是延时太短,延时太短的话,人眼看不出来。
2.硬件方面的话,你就看看你的指示灯是不是接错了
3.你看一下你的单片机晶振是不是符合你单片机的型号
4.看一下,晶振旁边的电容是不是焊错了
如果这些都没有问题的话,那只能说你的程序肯定有问题,或者程序没有下载成功。
可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。 具体实现方法可以参考如下程序: #include #include #define uint unsigned int#define uchar unsigned charvoid delay(uint a);void main(){ P1=0xfe; while(1) { // 向左循环点亮LED for(i=0; i7; i++) { P1=_crol_(P1,1); // 左移一位,点亮下一位LED delay(55); } // 向右循环点亮LED for(i=0; i/ 右移一位,,点亮上一位LED delay(55); } }}// 延时函数,延时a毫秒void delay(uint a){ uint x,y; for(x=a;x0;x--) for(y=110;y0;y--);}