#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单片机流水灯程序问题定义无效等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)