这个程序比较长,但还算简单,哪一段不懂,不可能一句一句解释
void main()
{
q=0;//分清0
p=0;//小时清0
TMOD=0x01; //定时器0工作方式1
TH0=(65536-46080)/256;//50ms初值
TL0=(65536-46080)%256;
ET0=1; //定时器0中断打开
EA=1; //总中断打开
while(1)
{
if(K1==0)//启动
TR0=1;
if(K2==0)//暂停
TR0=0;
if(K3==0) 秒清0
{m=0; }
if(pp==20)//5020ms=1S
m++;
n--;
P1=n;//P1可能是秒(十六进制)倒计时显示的
if(m==60)//60s是1分钟
{
m=0;
q++;
}
if(q==60)//60分钟是1小时
{
q=0;
p++;
}
if(p==24)//24小时清0
{
p=0;
}
}
c0=m%10; //分离出时分秒的个位和十位
c1=m/10;
c2=q%10;
c3=q/10;
c4=p%10;
c5=p/10;
display(c1,c0,c3,c2,c5,c4); //显示
}
}
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:
#include<reg51h> //51单片机头文件#include <intrinsh> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms
{ //delay(500);大约延时500ms
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a,i,j;
while(1) //大循环
{
a=0xfe; //赋初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_crol_(a,1); //将a变量循环左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_cror_(a,1); //将a变量循环右移一位
}
}
}
2、51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,P0
ANL A,#1EH
CJNE A,#02H,MAIN1
SETB P11
CLR P12
CLR P18
SJMP MAIN
MAIN1:
CJNE A,#04H,MAIN2
CLR P11
SETB P12
CLR P18
SJMP MAIN
MAIN2:
CJNE A,#1EH,MAIN3
CLR P11
CLR P12
SETB P18
SJMP MAIN
MAIN3:
CLR P11
CLR P12
CLR P18
LJMP MAIN
END
sfr P0M1 = 0X93; //这些是预定义寄存器的地址的
sfr P0M0 = 0X94; // 在编译过程中会把 POM1之类的东西变成这些地址
sfr P1M1 = 0X91; //mcu在运行中也是对这些地址 *** 作的
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
uchar CONT_1; //定义一个常量 作为计数器 使用,类型无符号整形数
P0M1 = 0; //将io口设置为推挽输出
P1M1 = 0; // 下面这些事定义了这些寄存器的初始值
P2M1 = 0; //以免第一次使用这些寄存器时出错
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
//你原来的b2,b2都是死循环,这是不行的,只有主函数才可以死循环。
//你的主函数结构也有问题。
//为你增加了一个按键检测的函数。
//下列程序通过了实验测试。
//b1输出的周期大约09s。
//b2输出的周期大约06s。
//K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,
//按第一次触动开关时红灯亮、b1输出,
//按第二次绿灯亮、为b2输出,
//按第三次都关闭
#include <reg51h>
#define uint unsigned int
#define uchar unsigned char
uint a;
void b1();
void b2();
sbit t = P1^0;
sbit k = P3^5;
sbit reg = P3^3;
sbit bice = P3^2;
void delay(uchar z)
{
uint x,y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
bit key()
{
bit kkk;
kkk = k; //读入按键
if(kkk == 1) return 0;//没有按下
delay(5); //延时
if(k == kkk) return 1;//两次相等
return 0;
}
void main()
{
while(1) {
P3 = 0xff;
while(!key()); //静等按下第一次
reg = 0;
bice = 1;
while(!key()) b1(); //没有按下第二次就循环等待
reg = 1;
bice = 0;
while(!key()) b2(); //没有按下第三次就循环等待
}
}
void b1()
{
P1 = 0xfe; a = 50000; while(a--);
P1 = 0xff; a = 50000; while(a--);
}
void b2()
{
P1 = 0xfe; a = 30000; while(a--);
P1 = 0xff; a = 30000; while(a--);
}
#include<reg51h>
sbit P_OUT = P3^7;
sbit UP = P1^0;
sbit DN = P1^1;
unsigned char p = 5, n;
void T0_INT() interrupt 1
{
n++;
if(n > 9) n = 0; //0~9
if(n <= p) P_OUT = 1;
else P_OUT = 0;
}
main()
{
TMOD = 0x02;
TH0 = 156;
TR0 = 1;
IE = 0x82;
while(1) {
if(P < 9 && !UP) {while(!UP); p++;}
if(p > 0 && !DN) {while(!DN); p--;}
}
}
你编译一下,汇编程序,就出来了。
以上就是关于51单片机的程序,求大神给解释下,具体些全部的内容,包括:51单片机的程序,求大神给解释下,具体些、很简的51单片机C语言流水灯程序、51单片机的一个简单程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)