导航:首页 > 操作系统 > 51单片机c语言指令表

51单片机c语言指令表

发布时间:2024-08-22 19:27:22

❶ 用c语言循环语句怎么写一个51单片机的时钟啊,用8个数码管显示时间。

#include<reg51.h>

#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,min=0,hour=12,scanled;
unsigned char key,flashbit,mode,time;
unsigned char disdat[8];
sbit led=P1^0;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=10;

disdat[3]=min%10;
disdat[4]=min/10;
disdat[5]=10;

disdat[6]=hour%10;
disdat[7]=hour/10;
}
void flash()
{
switch(flashbit)
{
case 0:break;
case 1:
disdat[6]=0x10;
disdat[7]=0x10;
delay(50);
dischg();
delay(80);
break;
case 2:
disdat[3]=0x10;
disdat[4]=0x10;
delay(50);
dischg();
delay(80);
break;
case 3:
disdat[0]=0x10;
disdat[1]=0x10;
delay(50);
dischg();
delay(80);
break;
default:break;
}
}
void t0isr() interrupt 1//秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3//显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x01;
P0=~ledtab[disdat[7]];
break;
case 1:
P2=0x02;
P0=~ledtab[disdat[6]];
break;
case 2:
P2=0x04;
P0=~ledtab[disdat[5]];
break;
case 3:
P2=0x08;
P0=~ledtab[disdat[4]];
break;
case 4:
P2=0x10;
P0=~ledtab[disdat[3]];
break;
case 5:
P2=0x20;
P0=~ledtab[disdat[2]];
break;
case 6:
P2=0x40;
P0=~ledtab[disdat[1]];
break;
case 7:
P2=0x80;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=8;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
sec=55;
min=59;
hour=23;
flashbit=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
flash();//闪烁
if((P3&0x0f)!=0x0f){
key=P3&0x0f;
while((P3&0x0f)!=0x0f);
led=0;
delay(10);
key|=0xf0;
switch(~key)
{
case 0x01://p3.1选择调时、分、秒
TR0=0;
flashbit+=1;
if(flashbit>3){flashbit=0;TR0=1;}
break;
case 0x02://p3.2调数
if(flashbit==0)break;
if(flashbit==1)
{
hour++;
if(hour>99)hour=0;
}
if(flashbit==2)
{
min++;
if(min>59)min=0;
}
if(flashbit==3)
{
sec++;
if(sec>59)sec=0;
}
break;
case 0x04: //选择正/倒
TR0=0;
mode++;
mode&=0x01;
if(mode==0){sec=0;min=0;hour=0;}
dischg();
break;
case 0x08://启动/暂停
TR0=~TR0;
break;
default:break;
}
}
}
}

❷ 51单片机c语言 _nop_()是一个空指令短时间延时的空几个机器周期

这个_nop_()等效与汇编里面的,NOP指令,也就是空一个机器周期,如果是传统51单片机的话,等于空12个时钟周期【即一个机器周期】,操作方法如下:

1、首先,可以利用keil来进行模拟实验,观察软件所显示的数值,然后再进行相关的运算,即可得出结果。

❸ 51单片机C语言编程

// 51单片机C语言编程,这个时钟+秒表可以参考一下。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0; //清零

sbit tiaofen=P1^1; //调分

sbit tiaoshi=P1^2; //调时

sbit sounder=P1^7; //naozhong

uint a,b;

uchar hour,minu,sec, //时钟

hour0,minu0,sec0,//秒表

hour1,minu1,sec1;

h1,h2,m1,m2,s1,s2,//显示位

k,s;//状态转换标志

uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*****************函数声明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函数*************************/

void main()

{

init();

while(1)

{

while(TR1)

{

keyscan(); //扫描函数

while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);

{ //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1); //闹钟时刻显示

}

display(hour0,minu0,sec0);//时钟表显示

while(k) /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec); //秒表显示

}

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11; //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1; //秒表中断

EX1=1; //闹钟设定中断

ET0=1;

ET1=1;

IT0=1; //边沿触发方式

IT1=1;

PX0=1;

PX1=1;

TR0=0; //初始,秒表不工作

TR1=1; //时钟一开始工作

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1 //秒表

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0; //毫秒级

minu++;

if(minu==60)

{

minu=0; //秒

hour++;

if(hour==60) //分

{

hour=0;

}

}

}

}

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{

hour=0;

minu=0;

sec=0;

}

}

if(k==2)

{

TR0=~TR0;

}

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定时器1中断****************/

void timer1_int() interrupt 3 //控制时钟工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);

}

}

else //调整时钟时间

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);

}

}

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h2=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table[h1];

P0=select[7];

delay(5);

P0=0xff;

P2=table[h2];

P0=select[6];

delay(5);

P0=0xff;

P2=0x40;;

P0=select[5];

delay(5);

P0=0xff;

P2=table[m1];

P0=select[4];

delay(5);

P0=0xff;

P2=table[m2];

P0=select[3];

delay(5);

P0=0xff;

P2=0x40;

P0=select[2];

delay(5);

P0=0xff;

P2=table[s1];

P0=select[1];

delay(5);

P0=0xff;

P2=table[s2];

P0=select[0];

delay(5);

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder;

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

❹ 51单片机C语言程序注释标注(写全)

#include<reg51.h>//调用头文件reg51.h
voidmain()//主函数
{
unsignedchar//无符号字符型
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定义一个数组LED数码管译码用的码表
while(1)//主循环
{
P2=P2|0x07;//P2口与0x07按位进行或运算
while(P2&0x07==0x07);//如果P2扣低三位为111则原地等待
switch(P2&0x07)//获取P2低三位值并且据此执行响应的操作
{
0x06:P0=tab[0x0D];break;//P2低三位为06H,数码管显示“d”
0x05:P0=tab[0x0E];break;//P2低三位为05H,数码管显示“E”
0x03:P0=tab[0x0F];break;//P2低三位为03H,数码管显示“F”
}
}
}

❺ 51单片机c语言程序

答:楼主先搞清C51中定义数据的类型。
char型 8位(-127到128);int型16位-32727到+32728(两个字节)
unsigned char是8位但从0到255,unsignde int 16位从0到65535;
楼主程序中的TH0/TL0是8位uchar型;tmp是16位uint型。

tmp=TL0|(TH0<<8);
这句在执行时先进行类型转换,把TL0/TH0暂时转换成16位uint型数据,(高位补0),再给TH0左移8位,和TL0相“或”,得到的是16位uint数据,赋给tmp.

❻ 大家帮忙找一些51单片机的基本C语言程序例子,最好带说明,谢啦

中断控制程序:

#include <AT89X52.H>

#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED接口
//将计数器的二进制值用8个LED显示出来
uchar count;//计数器(存储中断次数)

void main(void)
{
count=0; //清零计数器
port_count=~count;//清零P2口
IT0=1; //INT0设为边沿触发方式�IT0=0则为电平触发方式
EX0=1; //开INT0中断
EA=1; //开系统中断
while(1); //等待中断处理

}

//INT0中断处理函数
void int0_interrupt() interrupt 0 //INT0中断号0
{
count++;
port_count=~count; //当达到255时,溢出,又从0开始

}

I/O控制程序:
#include <AT89X52.H>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判断移动方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水灯左移到第八位又移回来 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水灯右移到第1位又移回来 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}

串口通信程序:
主机程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的节点地址
#define COUNT 10 //发送缓冲区buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定义buffer
int pt; //设置指针
main()//////////////////////////////////////////发送程序
{

//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率发生器)/////////PCON缺省为0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;

///////////////发送地址帧
TB8=1; //地址帧标志
SBUF=NODE_ADDR; //发送目的节点地址
while(pt<COUNT); //等待发送完全部数据
while(1);//不执行任何操作
} //end main

/////发送完中断函数
void send()interrupt 4
{
TI=0; //清发送中断标志
if(pt<COUNT)
{
//发送一帧数据
TB8=0;//数据帧标志
SBUF=buffer[pt]; //启动发送
pt++;//指针指向下一单元
}

else
{
ES=0; //关串口中断
EA=0; //关系统中断
return; //若发送完则停止发送并返回
}

}
接收程序:
#include<reg52.h>
#define uchar unsigned char

#define NODE_ADDR 3 //本机节点地址
#define COUNT 10 //定义接收缓冲区buffer大小
uchar buffer[COUNT]; //定义buffer
int pt; //当前位置指针

void send_char_com(unsigned char ch); //向串口发送一个字符的函数声明
void delay(void);

main() ////////////////串行异步从机接收程序
{
PCON=0X00; //初始化串口和T1(波特率发生器)/////////PCON缺省为0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允许接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
while(pt<COUNT); //等待接收地址帧和全部数据帧
delay() ;
//接收完后返回数据
SCON=0XC0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);

}
while(1);
} //end main

///////////串口接收中断函数
void receive()interrupt 4 using 3
{
RI=0; //清除接收中断标志
if(RB8==1) //地址帧
{//若为本机地址,则置SM2=0,以便接收数据
if(SBUF==NODE_ADDR)
{
SM2=0;
}

}
/////RB8=0,数据帧
else if(RB8==0)
{buffer[pt]=SBUF; //数据帧送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部数据帧,则通信结束;置SM2=1,准备下一次通信
}

}

//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

///////////////////////////////////////////////////////////////////////////////////

void delay(void)
{uchar i=100;
while(i--);
}

❼ 求一个51单片机用T0做计数器的C语言代码。

//timer0设定为计数器模式1
TMOD &= 0xf0; //清除原来的设定
TMOD |= 0x05; //T0为计数器模式1
TH0 = 0;
TL0 = 0; //从0开始计数
TR0 = 1; //使能T/C0
// IE |= 0x82; //Timer0中断使能,不需要就注释掉该行
另外执行不了有可能是你的实验板没有连接T0引脚

阅读全文

与51单片机c语言指令表相关的资料

热点内容
大金空调怎么判断变频压缩机坏 浏览:255
安卓手机如何注册传说对决 浏览:951
自学应聘程序员 浏览:917
linux设置根目录 浏览:89
java向量空间模型 浏览:841
哪个app订餐便宜 浏览:672
有什么app可能存聊天记录 浏览:468
强国app中的纪录片在哪里 浏览:714
dell服务器可用什么样硬盘 浏览:636
javanewbyte 浏览:309
芯片app哪个好 浏览:751
文件夹名称laptop怎么去掉 浏览:247
单片机中断应用 浏览:622
搜狗app哪个好用 浏览:452
中信银行还完贷款什么时候给解压 浏览:233
ug自学编程入门 浏览:612
英语口语900句pdf 浏览:565
javabyte拼接 浏览:481
加密应用在哪里找vivo 浏览:290
python读写图像 浏览:289