求一个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...