当前位置:首页 » 编程语言 » 例说51单片机c语言版

例说51单片机c语言版

发布时间: 2023-08-29 12:13:37

1. 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.

2. 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--);

}

3. 很简的51单片机C语言流水灯程序

1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:

#include<reg51.h>//51单片机头文件
#include<intrins.h>//包含有左右循环移位子函数的库
#defineuintunsignedint//宏定义
#defineucharunsignedchar//宏定义
sbitbeep=P2^3;
voiddelay(uintz)//延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{//delay(500);大约延时500ms.
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmain()//主函数
{
uchara,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单片机是基础入门的一个单片机,还是应用最广泛的一种。

4. 51单片机C语言

朋友,很简单啊,看我的:
第一个错误:在unsigned char array[7]={0xFE,0xFD,0xFA,0xF7,0xEF,0xEF,0xDF,0xAF,0x7F}
中,定义了7个元素,但在大括号中有9个元素,
第二个错误:就上面那个unsigned char array[7]={0xFE,0xFD,0xFA,0xF7,0xEF,0xEF,0xDF,0xAF,0x7F},后面有个分号,即为:unsigned char array[7]={0xFE,0xFD,0xFA,0xF7,0xEF,0xEF,0xDF,0xAF,0x7F};
第三个错误:延时函数定义错误:缺少形参名,应该定义为:
void msec (unsigned int Dlay);
后面定义为: void msec (unsigned int Delay){
unsigned char j;
while((x--)!=0){
for(j=0,j<=125;j++)
{;}
}
}
Delay你也可换其它的名字,

最后结果为:
#include <reg51.h>
void msec (unsigned int Delay);

void main()
{
unsigned char array[8]={0xFE,0xFD,0xFA,0xF7,0xEF,0xEF,0xDF,0xAF} ;
unsigned int i;
for(i=0;i<=7;i++)
{
P1=array[i];
msec(100);
}
}

void msec(unsigned int Delay)
{
unsigned int j;
while((Delay--)!=0)
for(j=0;j<=125;j++)
{;};

}

朋友,你还不把分给我,我就服了你了:void msec (unsigned int x)
{
unsigned char j;
while((x--)!=0)

for(j=0;j<=125;j++)
{;};

}
for(j=0;j<=125;j++)
j=0;后面有个分号

热点内容
编程课v 发布:2025-02-04 08:45:00 浏览:103
模拟器能有手机脚本么 发布:2025-02-04 08:39:50 浏览:756
android显示html图片 发布:2025-02-04 08:35:31 浏览:791
如何查学信网账号及密码 发布:2025-02-04 08:33:55 浏览:502
linux32位jdk 发布:2025-02-04 08:33:55 浏览:246
康佳服务器连接失败是怎么回事 发布:2025-02-04 08:18:51 浏览:916
编译编译有什么 发布:2025-02-04 08:05:52 浏览:735
让外网访问内网服务器 发布:2025-02-04 08:02:20 浏览:783
奶块脚本菜地 发布:2025-02-04 07:46:35 浏览:238
条形码识别源码 发布:2025-02-04 07:45:55 浏览:457