单片机c语言,流水灯,时钟的程序!

单片机c语言,流水灯,时钟的程序!,第1张

网友您好!流水程序如下:

#include<reg51h>

sbit P1_0=P1^0;

sbit P1_1=P1^1;

sbit P1_2=P1^2;

sbit P1_3=P1^3;

sbit P1_4=P1^4;

sbit P1_5=P1^5;

sbit P1_6=P1^6;

sbit P1_7=P1^7;

sbit P3_0=P3^0;

sbit P3_1=P3^1;

sbit P3_2=P3^2;

sbit P3_3=P3^3;

void delay(unsigned char i);

void main()

{

while(1){

if(P3_0==0&&P3_1==0&&

P3_2==0&&P3_3==1)

{

P1_0=0,P1_1=0;delay(200);

P1_0=1,P1_1=1;

P1_2=0,P1_3=0;delay(200);

P1_2=1,P1_3=1;

P1_4=0,P1_5=0;delay(200);

P1_4=1,P1_5=1;

P1_6=0,P1_7=0;delay(200);

P1_6=1,P1_7=1;

P1_6=0,P1_7=0;delay(200);

P1_6=1,P1_7=1;

P1_4=0,P1_5=0;delay(200);

P1_4=1,P1_5=1;

P1_2=0,P1_3=0;delay(200);

P1_2=1,P1_3=1;

P1_0=0,P1_1=0;delay(200);

P1_0=1,P1_1=1;delay(200); }

else{

P1=0x00;

delay(200);

P1=0xff;

delay(200);}

}

}

void delay(unsigned char i)

{

unsigned char j,k;

for(k=0;k<i;k++)

for(j=0;j<255;j++);

}

时钟程序如下:一

#include <reg51h>

void delay1s()

{

unsigned char i;

for(i=0;i<0x0A;i++){

TH1=0x3c;

TL1=0xb0;

TR1=1;

while(!TF1);

TF1=0;

}

}二

void main()

{

unsigned char i,t;

TMOD=0x10; //置T1为工作方式1

while(1)

{for(i=0;i<255;i++)

{t=(((i/16)<<4)|(i%16)); //将i转换为BCD码

P1=~t; //计数值取反后送p1口显示

delay1s(); } //调用1s延时函数

}

}不懂的可以继续追问。谢谢

周期=1/20秒

时钟晶振选用50mhz的话,005秒就需要clk跑50015010^6= 2 500 000

module led;

input clk,rst;

output ledcon;

reg [3:0] led; //led开关锁存位

reg d1,d2,d3,d4;//四个灯开关

reg [21:0] cnt_5; //005秒计数器

reg count; // 数满标志位

always @(posedge clk or negedge rst)

if (!rst)

cnt_5<=22'd0;

else if(cnt_5==22'd2500000)

cnt_5<=22'd0; //数满归零

else cnt_5<=cnt_5+1'b1;

always @(posedge clk or negedge rst))

if(!rst)

count<=1'b0;

else if (cnt_5==22'd2500000)

count<=1'b1;

我擦。。剩下我不写了。你查查网上资料吧。

就是每数满时间就依次轮换打开d1--d4开关并且关闭前一个。

ledcon用连续赋值

你用sbit定义的8行是小写字母p0~p7,可主程序中却又用了大写的P0~P7,这肯定错呀。C语言是区分大小写字母的。程序中必须用小写字母p0~p7,而不能用大写的P0~P7,因为P0~P3是单片机四个并行口,用户不能再定义了。

其实,就一个流水灯的程序,很简单的,用不着写得这么复杂,这么费劲。给你一个典型的程序:

#include<reg51h>

#include<intrinsh>

void mdelay(unsigned int t)

{

unsigned char n;

for(;t>0;t--)

for(n=0;n<125;n++);

}

void main() //这主程序不要写成int main()

{

unsigned char led=0xfe;

while(1)

{

P1=led;

mdelay(1000);

led=_crol_(led,1);

}

}

请及时采纳

为什么led位宽为8, led_out及led_out1位宽是9,后来还是取的8位?

———这个应该是位宽定义上有点问题吧(估计led少定义了一位),不过不影响逻辑实现,顶多就是截取了led_out1的低八位作为输出(led=led_out1[7:0])。

led_out1=~led_out; 这句话什么意思啊?

——当满足buffer == 26'd25000000时,led_out取反。比如,在buffer != 26'd25000000时,led_out=9'b010101010;当buffer == 26'd25000000时,led_out = 9'b101010101

为什么 led_out没有初始化就在移位?reg型未初始化默认值是什么呢?

——这个跟一般的单片机程序有所不同。FPGA内部如果没有初始化数值,默认为内三态x,在流水灯上表现为暗(相当于逻辑0),不影响使用。如果楼主不放心,可以再定义时给出初始化数值,比如reg [8:0] led_out = 9'd0

总体来说这个程序比较简单。希望对楼主有帮助。

建议:时序逻辑内部用非阻塞赋值<=。

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:

ORG 0000H ;复位启动

AJMP START ;

ORG 001BH ;T1中断

AJMP T1INT ;

;定义变量========================

YSJS EQU 30H;延时计数器

LED EQU 31H;LED控制缓冲器

;主程序==========================

START: MOV LED,#0FEH ;初始化数据

MOV YSJS,#0 ;

MOV TMOD,#10H ;定时器1工作于方式1,16位定时器

MOV TL1,#0B0H ;设置定时初值

MOV TH1,#3CH ;定时时间=50mS

SETB ET1 ;使能定时器1中断

SETB TR1 ;启动定时器1

SETB EA ;开总中断

MOV P1,LED ;初始化流水灯

LOOP: JMP LOOP ;循环等待中断

T1INT: PUSH PSW ;定时器1中断程序

PUSH ACC ;保护现场

MOV TH1,#3CH ;定时时间=50mS

MOV TL1,#0B0H ;

INC YSJS ;

PUSH ACC ;保护ACC

MOV A,YSJI ;

CJNE A,#2,QT1 ;50mS2=100mS

MOV P1,LED ;

MOV A,LED ;

RL A ;累加器A的值循环左移1位

MOV LED,A ;

MOV YSJS,#0 ;

QT1: POP ACC ;恢复现场

POP PSW ;

RETI ;返回主程序

END ;汇编程序结束

扩展资料:

实现流水灯的三个方法:

第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。

第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P10口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

第三种,库函数实现流水灯。利用左移函数进行。

以上就是关于单片机c语言,流水灯,时钟的程序!全部的内容,包括:单片机c语言,流水灯,时钟的程序!、求大神帮忙用verilog HDL写一个四个小灯的流水灯程序,50MHz的,要有分频过程的、C51单片机流水灯程序问题定义无效等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10216523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存