求一个51单片机C语言程序编程

供稿:hz-xin.com     日期:2025-01-14
求51单片机C语言编程大神帮忙

#include
#define uchar unsigned char
#define uint unsigned int
sbit db=P2^7;
char i,sec,min,h,date,month,year,flag;
uchar j,k,m,n,o,p;
sbit dula=P2^0;
sbit wela1=P2^1;
sbit wela2=P2^2;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();
void delay(uint);
void second_display();
void minute_display();
void hour_display();
void date_display();
void month_display();
void year_display();
void control();
void time();
void main()
{
init();
while(1)
{
second_display();
minute_display();
hour_display();
date_display();
month_display();
year_display();
control();
}
}
void init()
{
db=0;
i=0;
sec=0;
min=0;
h=0;
date=1;
month=1;
year=1;
flag=0;
wela1=0;
wela2=0;
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void second_display()
{
int sec_shi,sec_ge;
sec_shi=sec/10;
sec_ge=sec%10;
if(flag==1&&j!=1)
j++;
else
{
j=0;
dula=1;
P0=~table[sec_ge];
dula=0;
wela1=1;
P1=0x00;
wela1=0;
wela2=1;
P1=0x20;
wela2=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[sec_shi];
dula=0;
wela1=1;
P1=0x00;
wela1=0;
wela2=1;
P1=0x10;
wela2=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
}
}
void minute_display()
{
int min_shi,min_ge;
min_shi=min/10;
min_ge=min%10;

if(flag==2&&k!=1)
k++;
else
{
k=0;
dula=1;
P0=~table[min_ge];
dula=0;
wela1=1;
P1=0x00;
wela1=0;
wela2=1;
P1=0x08;
wela2=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[min_shi];
dula=0;
wela1=1;
P1=0x00;
wela1=0;
wela2=1;
P1=0x04;
wela2=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
}
}
void hour_display()
{
int h_shi,h_ge;
h_shi=h/10;
h_ge=h%10;

if(flag==3&&m!=1)
m++;
else
{
m=0;
dula=1;
P0=~table[h_ge];
dula=0;
wela1=1;
P1=0x00;
wela1=0;
wela2=1;
P1=0x02;
wela2=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
delay(1);

dula=1;
P0=~table[h_shi];
dula=0;
wela1=1;
P1=0x00;
wela1=1;
P1=0x00;
wela1=0;
wela2=1;
P1=0x01;
wela2=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
wela2=0;
delay(1);
}

}
void date_display()
{
int date_shi,date_ge;
date_shi=date/10;
date_ge=date%10;
if(flag==4&&n!=1)
n++;
else
{
n=0;
dula=1;
P0=~table[date_ge];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x80;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[date_shi];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x40;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
}
}
void month_display()
{
int month_shi,month_ge;
month_shi=month/10;
month_ge=month%10;
if(flag==5&&o!=1)
o++;
else
{
o=0;
dula=1;
P0=~table[month_ge];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x20;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[month_shi];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x10;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
}
}
void year_display()
{
int year_qian,year_bai,year_shi,year_ge;
year_qian=year/1000;
year_bai=year%1000/100;
year_shi=year%1000%100/10;
year_ge=year%10;
if(flag==6&&p!=1)
p++;
else
{
p=0;
dula=1;
P0=~table[year_ge];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x08;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[year_shi];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x04;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[year_bai];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x02;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;

dula=1;
P0=~table[2];
dula=0;
wela2=1;
P1=0x00;
wela2=0;
wela1=1;
P1=0x01;
wela1=0;
delay(1);
dula=1;
P0=0xff;
dula=0;
wela1=0;
}
}
void control()
{
if(!key_ch)
{
delay(5);
if(!key_ch)
{
flag++;
if(flag==7)
flag=0;
}
}
while(!key_ch);
if(flag==1&&key_add==0)
{
while(!key_add);
sec++;
if(sec==60)
sec=0;
}
if(flag==1&&key_minus==0)
{
while(!key_minus);
sec--;
if(sec==-1)
sec=59;
}
if(flag==2&&key_add==0)
{
while(!key_add);
min++;
if(min==60)
min=0;
}
if(flag==2&&key_minus==0)
{
while(!key_minus);
min--;
if(min==-1)
min=59;
}
if(flag==3&&key_add==0)
{
while(!key_add);
h++;
if(h==24)
h=0;
}
if(flag==3&&key_minus==0)
{
while(!key_minus);
h--;
if(h==-1)
h=23;
}
if(flag==4&&key_add==0)
{
while(!key_add);
date++;
if(date==29)
if((year%4!=0)&&(month==2))
date=1;
if(date==30)
if((year%4==0)&&(month==2))
date=1;
if(date==31)
if((month==4)||(month==6)||(month==9)||(month==11))
date=1;
if(date==32)
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
date=1;
}
if(flag==5&&key_add==0)
{
while(!key_add);
month++;
if(month==13)
month=1;
}
if(flag==5&&key_minus==0)
{
while(!key_minus);
month--;
if(month==0)
month=12;
}
if(flag==6&&key_add==0)
{
while(!key_add);
year++;
if(year==99)
year=1;
}
if(flag==6&&key_minus==0)
{
while(!key_minus);
year--;
if(year==0)
year=99;
}
}
void T0_rpt() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
time();
}
void time()
{
if(i==20)
{
i=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
h++;
if(h==24)
{
h=0;
min=0;
sec=0;
date++;
if(date==29)
if((year%4!=0)&&(month==2))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
if(date==30)
if((year%4==0)&&(month==2))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
if(date==31)
if((month==4)||(month==6)||(month==9)||(month==11))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
if(date==32)
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
}
}
}
}

机的外部结构


1.

DIP40
双列直插;


2.

P0

P1

P2

P3
四个
8
位准双向
I/O
引脚;(作为
I/O
输入时,要先输出高电平)


3.

电源
VCC

PIN40
)和地线
GND

PIN20
);


4.

高电平复位
RESET

PIN9
);(
10uF
电容接
VCC

RESET
,即可实现上电复位)


5.

内置振荡电路,外部只要接晶体至
X1

PIN18
)和
X0

PIN19
);(频率为主频的
12
倍)


6.

程序配置
EA

PIN31
)接高电平
VCC
;(运行单片机内部
ROM
中的程序)


7.

P3
支持第二功能:
RXD

TXD

INT0

INT1

T0

T1

单片机内部
I/O
部件

(
所为学习单片机,实际上就是编程控制以下
I/O
部件,完成指定任务
)
1.

四个
8
位通用
I/O
端口,对应引脚
P0

P1

P2

P3



2.

两个
16
位定时计数器;(
TMOD

TCON

TL0

TH0

TL1

TH1



3.

一个串行通信接口;(
SCON

SBUF



4.

一个中断控制器;(
IE

IP



针对
AT89C52
单片机,头文件
AT89x52.h
给出了
SFR
特殊功能寄存器所有端口的定义。

C
语言编程基础


1.

十六进制表示字节
0x5a
:二进制为
01011010B

0x6E

01101110



2.

如果将一个
16
位二进数赋给一个
8
位的字节变量,则自动截断为低
8
位,而丢掉高
8
位。


3.

++var
表示对变量
var
先增一;
var

表示对变量后减一。


4.

x |= 0x0f;
表示为

x = x | 0x0f;

5.

TMOD = ( TMOD & 0xf0 ) | 0x05;
表示给变量
TMOD
的低四位赋值
0x5
,而不改变
TMOD
的高四
位。


6.

While( 1 );
表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是
{;}

实验内容:单片机甲、乙进行双机串行通信,甲机通过串口控制乙机LED闪烁(如下图所示,要求利用芯片MAX232),双方的晶振频率均为11.0592MHz(波特率为9600kb/s)要求:甲机按开关K1一次,发送字符“A”给乙机,点亮灯D1与D2;按开关K1两次,发送字符“B”给乙机,点亮灯D3与D4;按开关K1三次,发送字符“C”给乙机,全部点亮;按下第四次K1,灯全灭


#include<reg51.h>           /*甲机*/

sbit  k=P1^0;

sbit  P00=P0^0;

sbit  P03=P0^3;

unsigned chari,NO;   

 void main(void)             /* 主函数*/

{

SCON=0x40;  /*方式1只发送,不接收*/ TMOD=0x20; 

TH1=0xfd;   /*给定时器T1赋初值,波特率为9600*/

TL1=0xfd;

TR1=1;

k=1;

NO=0;

  while(1)

  { 

        if(k==0)

        {while(k==0);

        NO=(NO+1)%4;

        }

        switch (NO)

        {case 0 :P0=0xff; 

                 

                 break;

       

        case 1 :P00=0;P03=1; 

                SBUF='A';   

                while(TI==0);   

              TI=0;   

                break;

 

        case 2 : P00=1;

                 P03=0; 

                SBUF='B';   

                while(TI==0);   

              TI=0;   

                break;

 

        case 3 : P00=0; 

                 P03=0;

                SBUF='C';   

                while(TI==0);   

              TI=0;   

                break; 

        }

             

   }

   for(i=250;i>0;i--){;}   //延时

}

 

 

#include<reg51.h>      /*乙机*/

sbit  k=P1^0;

sbit  P00=P0^0;

sbit  P03=P0^3;

unsigned char NO;

 

void main()         /*主函数*/

 {

       SCON=0x50;      /*设置串口为方式3,允许接收REN=1*/

       TMOD=0x20;   

       TH1=0xfd;   /*给定时器T1赋初值,波特率为9600*/

       TL1=0xfd;

       TR1=1;

       P0=0xff;

while(RI==0); /*检测接收中断标志RI,RI=0,未接收完,则循环等待*/

       {RI=0;                     

        switch (SBUF)

         { case 'A': P00=0;P03=1;

                 break;

       

         case 'B':P00=1;P03=0;     

                   break;

 

         case 'C': P00=P03=0;               

                    break;

 

     

         }

        }

 }           




符合不???




89c51吗?

大家帮忙找一些51单片机的基本C语言程序例子,最好带说明,谢啦_百度知 ...
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> de...

求用51单片机接两个数码管,0-99动态显示程序(用C语言)
该程序首先初始化P0和P2端口为0,然后进入无限循环,通过for循环显示0-99之间的数字。每显示一个数字,都会调用delay函数进行延时,以实现动态显示效果。需要注意的是,你的51单片机P0口需要接上拉电阻,否则可能会出现信号不稳定的状况。你可以复制以上代码到你的开发环境中编译并试运行,确保程序能够正常...

怎么用c语言编程51单片机读写程序?
编程代码如下:ORG 0000H MOV DPTR,#1000H ;给源数据块地址指针DPTR赋初值 MOV P2, #20H ;给目的数据块地址指针P2和R0赋初值 MOV RO,#00H LOOP: MOVX A, @DPTR .MOVX @RO, A .INC DPTR INC RO CJNE RO,#64H, LOOP SJMP

需要一个C语言程序。51单片机控制:按键按一下,延迟1分钟后开灯,灯亮半...
如果对时间要求不精确,用软延时即可。include<reg52.h> define uchar unsigned char define uint unsigned int sbit s=P1^0;sbit led=P1^1;void delayms(uint i) \/\/1ms延时程序 { uchar j;for(;i>0;i--){ for(j=0;j<125;j++)\/\/如果延时时间误差较大,可按比例改变125这个数 \/\/取值...

51单片机c语言是指哪些
单片机C语言编程是基于C语言进行单片机开发的一种方法。其中,C51编译器是开发单片机C语言程序的主要工具,它能够帮助开发者编写高效、简洁的程序代码。使用C51编译器编写的C语言程序具有多个优点。首先,由C51编译器生成的目标代码长度较短,运行速度较快,这对于资源有限的单片机系统尤为重要。其次,C51编译...

51单片机用C语言如何写四个数码管的流水灯程序?
在使用51单片机的C语言编程中,实现四个数码管的流水灯程序可以通过移位操作来简化代码。具体而言,我们首先定义一个函数set(void),该函数用于控制数码管的显示。在该函数中,我们使用了一个静态变量cnt来跟踪当前数码管的显示顺序。每当调用set函数时,cnt会递增,以此来改变数码管的显示内容。同时,为了...

一道51单片机的C语言程序,关于串口通讯的,很简单...
ES=1; \/\/重新使能串口中断 flag=0; \/\/清除flag,为了等待下一次接收 } } } void serial() interrupt 4 \/\/串口中断服务程序,优先级为4 { RI=0; \/\/当接收完成之后RI被置一,发生串口中断,清标志位 a=SBUF; \/\/读取收到的字符,并赋给变量a flag=1; \/\/置接收完成标志...

求c51单片机电子钟程序(c语言)
LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;send_out(dat);LCD_EN = 1;LCD_EN = 0;} \/\/=== LCD初始化函数 === void lcd_init(){ lcd_wcmd(0x38);delay_ms(1);lcd_wcmd(0x0c); \/\/显示开,关光标 delay_ms(1);lcd_wcmd(0x06); \/\/向右移动光标 delay_ms(1);lcd_wcmd(0...

求一个51单片机定时闹钟程序。要C语言。能够调时间
我来发一个C语言51单片机时钟程序,希望能帮到你 \/* 程序功能:带定时闹铃时钟 *\/ \/*---*\/ include <AT89X51.H> \/*包含器件配置文件*\/ define uchar unsigned char define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};\/*...

51单片机C语言程序
\/\/为你增加了一个按键检测的函数。\/\/下列程序通过了实验测试。\/\/b1输出的周期大约0.9s。\/\/b2输出的周期大约0.6s。\/\/K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,\/\/按第一次触动开关时红灯亮、b1输出,\/\/按第二次绿灯亮、为b2输出,\/\/按第三次都关闭.include <reg51.h> d...