173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

基于at89c51单片机的基础设计

htxw 2023-03-14 资讯中心 26 ℃

用C语言编写AT89C51单片机程序,设计一个智能数字钟。

#includereg52.h

#define uint unsigned int

#define uchar unsigned char

sbit QB1=P1^0;

sbit QB2=P1^1; //数码管段选

sbit QB3=P1^2;

sbit QB4=P1^3;

sbit QB5=P1^4;

sbit QB6=P1^5;

sbit fm=P1^6; //蜂鸣器

sbit s1=P2^4; //s5按键,切换显示

sbit s2=P2^3; //s2按键,设置调时

sbit s3=P2^2; //s3按键,加1

sbit s4=P2^1; //s4按键,减1

sbit led1=P0^0;

sbit led2=P0^1;

sbit led3=P0^2;

uchar count;

uchar sec,minu,hour,day,week,mon;

uchar n_sec,n_minu,n_hour;

uint year;

uchar set_2=1,set_1=1;

uchar hs,hg,mis,mig,ss,sg;

uchar nhs,nhg,nms,nmg,nss=0,nsg=0;

uchar ms,mg,ds,dg,w;

uchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,

0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf}; //0~F,-,共阳

//uchar code tableyi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//0-F,-,共阴

uchar code table_d[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}; //0~9数组,带小数点

uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年

uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年

void delay(uint); //延时函数

void timer0(); //走时中断函数

void jishi(); //计时函数

void key_change(); //切换显示按键函数

void key_set(); //设置时间按键函数

void disp(uchar,uchar,uchar,uchar,uchar,uchar); //显示函数

void zd_clock(); //整点报时函数

void nz_clock(); //闹钟函数

uchar incone(uchar); //加1函数

uchar decone(uchar); //减1函数

void set_time(); //设置时间函数

void set_clock(); //设置闹钟函数

void set_mdw(); //设置月日星期函数

void main() //主函数

{

EA=1;

ET0=1;

TR0=1;

TMOD=0x01;

TH0=0x4c; //50ms初值 晶振11.0592

TL0=0x00;

hour=23;minu=59;sec=49; //赋初值:11点59分0秒

n_hour=12;n_minu=56;n_sec=0; //闹钟赋初值12点1分0秒

year=2008;mon=5;day=14;week=3;//年月日星期赋初值2008年5月11日星期天;祝天下所有母亲节日快乐

while(1)

{

hs=hour/10; //时分秒HH.MM.SS

hg=hour%10;

mis=minu/10;

mig=minu%10;

ss=sec/10;

sg=sec%10;

ms=mon/10; //月日-星期MM.DD.-W

mg=mon%10;

ds=day/10;

dg=day%10;

w=week;

nhs=n_hour/10; //闹钟定时HH.MM.SS

nhg=n_hour%10;

nms=n_minu/10;

nmg=n_minu%10;

nss=n_sec/10;

nsg=n_sec%10;

key_change(); //s4按键扫描

key_set(); //s2按键扫描

set_time(); //设置时间

set_mdw(); //设置月日星期

set_clock(); //设置闹钟

if(set_1==1) //正常走时显示

{

disp(hs,hg,mis,mig,ss,sg);

}

if(set_1==2) //设置时间,LED1闪亮

{

disp(hs,hg,mis,mig,ss,sg);

if(sec%2==0)

{led2=1;led3=1;led1=~led1;}

// else

// {led1=1;}

}

if(set_1==3) //正常显示月日-星期

{

disp(ms,mg,ds,dg,16,w);

}

if(set_1==4) //设置月日-星期,LED2闪亮

{

disp(ms,mg,ds,dg,16,w);

if(sec%2==0)

{led1=1;led3=1;led2=~led2;}

// else

// {led2=1;}

}

if(set_1==5) //正常显示定时

{

disp(nhs,nhg,nms,nmg,nss,nsg);

}

if(set_1==6) //设置闹钟定时,LED3闪亮

{

disp(nhs,nhg,nms,nmg,nss,nsg);

if(sec%2==0)

{led1=1;led2=1;led3=~led3;}

// else

// {led3=1;}

}

zd_clock(); //整点报时

nz_clock(); //闹钟

}

}

void timer0() interrupt 1 //50ms中断函数

{

TMOD=0x01;

TH0=0x4c; //50ms初值 晶振11.0592

TL0=0x00;

count++;

if(count==20)

{

count=0;

sec++;

jishi(); //调计时函数

}

}

void jishi() //计时函数

{

if(sec==60)

{

sec=0;

minu++;

if(minu==60)

{

minu=0;

hour++;

if(hour==24)

{ hour=0;

day++;

week++;

if(week==8)

{week=0;}

if(year%4==0year%100!=0||year%400==0) //闰年

{

if(day==table1[mon]+1)

{

day=0;

mon++;

if(mon==13)

{mon=0;year++;}

}

}

else //非闰年

{

if(day==table2[mon]+1)

{

day=0;

mon++;

if(mon==13)

{mon=0;year++;}

}

}

}

}

}

}

void key_change() //s1按键扫描

{

if(s1==0)

{

delay(200);

if(s1==0)

{

set_1++;

while(!s1);

if(set_1==7)

{set_1=1;}

}

}

}

void key_set() //s2按键扫描

{

if(s2==0)

{

delay(10);

if(s2==0)

{

set_2++;

while(!s2);

if(set_2==4)

{set_2=1;}

}

}

}

void disp(uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6) //显示函数

{

QB1=1;

QB2=0;

QB3=0;

QB4=0;

QB5=0;

QB6=0;

P3=table[a1]; //段码送P0口

delay(10); //延时一小会

QB1=0;

QB2=1;

QB3=0;

QB4=0;

QB5=0;

QB6=0;

P3=table[a2]; //第2个数码管显示,带小数点

delay(10);

QB1=0;

QB2=0;

QB3=1;

QB4=0;

QB5=0;

QB6=0;

P3=table[a3]; //第3个数码管显示

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=1;

QB5=0;

QB6=0;

P3=table[a4]; //第4个数码管显示,带小数点

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=0;

QB5=1;

QB6=0;

//第5个数码管显示

P3=table[a5];

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=0;

QB5=0;

QB6=1;

P3=table[a6]; //第6个数码管显示

delay(10);

QB1=0;

QB2=0;

QB3=0;

QB4=0;

QB5=0;

QB6=0;

}

void zd_clock() //整点报时函数

{

if(minu==59(sec==53||sec==55||sec==57))

{

fm=0;

delay(5);

fm=1;

delay(5);

}

fm=0;

if(minu==59sec==59)

{

fm=0;

delay(5);

fm=1;

delay(5);

fm=0;

}

}

void nz_clock() //闹钟函数

{

if(hour==n_hourminu==n_minusec==n_sec)

//if((sec%2==0)sec30)

{

fm=0;

delay(1);

fm=1;

delay(1);

}

}

void set_time() //设置时间函数

{

if(set_1==2)

{

if(set_2==1)

{

hour=incone(hour);

if(hour==24)

{hour=0;}

// if(hour0)

// {hour=23;}

hour=decone(hour);

}

if(set_2==2)

{

minu=incone(minu);

if(minu==60)

{minu=0;}

// if(minu0)

// {minu=59;}

minu=decone(minu);

}

}

}

void set_mdw() //设置月日星期函数

{

if(set_1==4)

{

if(set_2==1)

{

mon=incone(mon);

if(mon==13)

{mon=1;}

mon=decone(mon);

// if(mon==0)

// {mon=12;}

}

if(set_2==2)

{

day=incone(day);

if(day==32)

{day=0;}

day=decone(day);

// if(day==0)

// {day=0;}

}

if(set_2==3)

{

week=incone(week);

if(week==8)

{week=0;}

week=decone(week);

// if(week==0)

// {week=7;}

}

}

}

void set_clock() //设置闹钟函数

{

if(set_1==6)

{

if(set_2==1)

{

n_hour=incone(n_hour);

if(n_hour==24)

{n_hour=0;}

n_hour=decone(n_hour);

if(n_hour==0)

{n_hour=0;}

}

if(set_2==2)

{

n_minu=incone(n_minu);

if(n_minu==60)

{n_minu=0;}

n_minu=decone(n_minu);

if(n_minu==0)

{n_minu=0;}

}

}

}

uchar incone(uchar n) //加1函数

{

if(s3==0)

{ delay(200);

if(s3==0)

{

n++;

while(!s3);

}

}

return(n);

}

uchar decone(uchar m) //减1函数

{

if(s4==0)

{

delay(200);

if(s4==0)

{

m--;

while(!s4);

if(m0)

{m=0;}

}

}

return(m);

}

void delay(uint k) //延时函数

{

uint i,j;

for(i=k;i0;i--)

for(j=80;j0;j--);

}

1、 基于AT89C51单片机,利用定时器设计一个两位数码管显示电路。 设计要求:每隔2S显示数字加1,显示初值

这个我仿真过了   是有用的,,,是从00开始显示 到了99会从新开始从00开始加

#includereg51.h

#define uchar unsigned char

#define uint unsigned int

uchar code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar code bit_tab[]={0xfe,0xfd};

uchar disp_buf[2];

uchar shu;

uchar count;

void delay(uchar x)

{

uchar i,j;

for(i=0;ix;i++)

for(j=0;j120;j++);

}

void conv(uchar flag)

{

disp_buf[0]=flag/10;

disp_buf[1]=flag%10;

}

void display()

{

uchar tem,wei;

P2=bit_tab[wei];

tem=disp_buf[wei];

P0=disp[tem];

wei++;

if(wei==2)

wei=0;

}

void time0(void) interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

if(++count==40)

{

count=0;

shu++;

if(shu==99)

shu=0;

}

}

void time1(void) interrupt 3

{

TH1=(65536-5000)/256;

TL1=(65536-5000)%256;

display();

}

void init()

{

TMOD=0x11;

EA=1;

ET0=1;

ET1=1;

TR1=1;

TR0=1;

}

main()

{

init();

while(1)

{

conv(shu);

}

}

基于AT89C51单片机设计一个恒压无塔供水系统。该系统应满足的功能要求:

这个题目具有一定的实用价值哦:

第一:压力传感器选择相对容易,而且对压力要求不高,比较容易实现水压的测量。

第二:AD芯片既可以选择ADC0809,TLC2543等等都可以,也不存在问题,而且都可以实现多路测量的。

第三:单片机选择AT89C51,然后通过RS232通信,键盘自由选择。

第四:变频器,采用外部模拟量进行控制,使用模拟PWM波实现控制变频器的频率,然后通过单片机检测这个频率就知道变频器的输出频率。

第五:报警与电机都是简单的了,不说了。

单片机数码管程序设计AT89C51?

单片机设计程序,首先你需要明白单片机的一些基本原则的原理,你在明白之后才能够去根据软件的功能采取设计。

基于AT89C51单片机,利用定时器设计一个两位数码 管显示电路.求详细的设计过程。

硬件很简单,我就不画图了,简单描述一下吧。在单片机最小系统的基础上,P0口接数码管的数据端,P2.6,P2.7接数码管的控制端。

程序如下:

#includereg52.h

#define uint unsigned int

#define uchar unsigned char

sbit s1=P2^6;//十位

sbit s2=P2^7;//个位

uchar num0,num;

uchar code table[]=

{0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(uchar x)

{

uchar i,j;

for(i=x;i0;i--)

for(j=110;j0;j--);

}

void init()

{

TMOD=0x01; //设置定时器0工作方式01

TH0=(65536-45872)/256; //装初值11.0592晶振定时50ms

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

}

void TO_time() interrupt 1

{

TH0=(65536-45872)/256; //装初值11.0592晶振定时50ms

TL0=(65536-45872)%256;

num0++;

if(40==num0) //到了40,2秒时间到

{

num0=0;

num++;

}

}

void display()

{

s1=1;

P0=table[num/10];

s1=0;

P0=0xff;

delay(5);

s2=1;

P0=table[num%10];

s2=0;

}

void main()

{

init();

while(1)

{

display();

}

}

单片机89c51的电子时钟课程设计

#include reg52.h

#includestddef.h

#define uchar unsigned char

#define uint unsigned int

#define LCD1602_FLAG

#define LCD1602_PORT P0

sbit lcd1602_rs=P2^0;

sbit lcd1602_e=P2^2;

sbit lcd1602_rw=P2^1;

sbit lcd1602_busy=P0^7;

sbit key_ch=P3^5;

sbit key_add=P3^6;

sbit key_minus=P3^7;

uchar i,sec,min,h,date,month,flag;

uint year;

uchar *chgstr[7]={"  ","sec","min","hour","date","min","year"};

uchar j,k,m,n,o,p;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar timestr[10],datestr[10];

void init();

void delay(uint);

void time_display();

void date_display();

void control();

void time();

/*

************************************

* 函数名称:lcd1602_CheckBusy()

* 函数功能:状态查询

************************************

*/

void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1;

lcd1602_rs=0;

lcd1602_rw=1;

lcd1602_e=0;

lcd1602_e=1;

}

while(lcd1602_busy);

}

/*

***************************************

* 函数名称: lcd1602_WriteCmd()

* 函数功能:写命令

* 入口参数:命令字

* 出口参数:无

***************************************

*/

void lcd1602_WriteCmd(const uchar cmd)

{

lcd1602_CheckBusy();

lcd1602_rs=0;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=cmd;

lcd1602_e=0;

}

/*

*******************************************

* 函数名称:lcd1602_WriteData()

* 函数功能:写数据

* 入口参数:c--待写数据

* 出口参数:无

*********************************************

*/

void lcd1602_WriteData(const uchar c)

{

lcd1602_CheckBusy();

lcd1602_rs=1;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=c;

lcd1602_e=0;

}

/*

***********************************************

* 函数名称:lcd1602_Init()

* 函数功能:初始化LCD

* 入口参数:无

* 出口参数:无

***********************************************

*/

void lcd1602_Init()

{

lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵

lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06); //flag move to right,screen don't move

lcd1602_WriteCmd(0x01); //clear screen

}

/*

************************************************

* 函数名称:lcd1602_Display()

* 函数功能: 字符显示

* 入口参数:ptr--字符或字符串指针

* 出口参数:无

* 说    明:用户可通过以下方式来调用:

*           1)lcd1602_Display("Hello,world!");

*           2) INT8U 存储类型 txt[]="要显示的字符串";

*              或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'};

*              INT8U *ptr;

*              ptr=txt;

*              lcd1602_Display(ptr);

*              或 lcd1602_Display(txt);

*              或 lcd1602_Display(txt);

************************************************

*/

void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr)

{

uchar data i=0;

uchar *data q;

q=ptr;

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80+xaddr);

while(q!=NULL (*q!='\0') i16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

case 1:

lcd1602_WriteCmd(0xc0+xaddr);

while(q!=NULL (*q!='\0') i16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

}

}

void main()

{

lcd1602_Init();

init();

while(1)

{

time_display();

date_display();

control();

}

}

void init()

{

i=0;

sec=0;

min=30;

h=7;

date=17;

month=10;

year=2017;

flag=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;x0;x--)

for(y=110;y0;y--);

}

void time_display()

{

timestr[7]=0x30+sec%10;

timestr[6]=0x30+sec/10;

timestr[5]=':';

timestr[4]=0x30+min%10;

timestr[3]=0x30+min/10;

timestr[2]=':';

timestr[1]=0x30+h%10;

timestr[0]=0x30+h/10;

timestr[8]=0;

lcd1602_Display(timestr,1,3);

}

void date_display()

{

datestr[9]=0x30+date%10;

datestr[8]=0x30+date/10;

datestr[7]=':';

datestr[6]=0x30+month%10;

datestr[5]=0x30+month/10;

datestr[4]=':';

datestr[3]=0x30+year%10;

datestr[2]=0x30+year/10%10;

datestr[1]=0x30+year/100%10;

datestr[0]=0x30+year/1000;

lcd1602_Display(datestr,0,2);

}

void control()

{

if(!key_ch)

{

delay(5);

if(!key_ch)

{

flag++;

TR0=0;

if(flag==7)

{flag=0;TR0=1;lcd1602_Init();}

lcd1602_Display(chgstr[flag],1,12);

}

}

while(!key_ch);

if(flag==1key_add==0)

{

while(!key_add);

sec++;

if(sec==60)

sec=0;

}

if(flag==1key_minus==0)

{

while(!key_minus);

sec--;

if(sec==-1)

sec=59;

}

if(flag==2key_add==0)

{

while(!key_add);

min++;

if(min==60)

min=0;

}

if(flag==2key_minus==0)

{

while(!key_minus);

min--;

if(min==-1)

min=59;

}

if(flag==3key_add==0)

{

while(!key_add);

h++;

if(h==24)

h=0;

}

if(flag==3key_minus==0)

{

while(!key_minus);

h--;

if(h==-1)

h=23;

}

if(flag==4key_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==4key_minus==0)

{

while(!key_minus);

if(date1)date--;

}

if(flag==5key_add==0)

{

while(!key_add);

month++;

if(month==13)

month=1;

}

if(flag==5key_minus==0)

{

while(!key_minus);

month--;

if(month==0)

month=12;

}

if(flag==6key_add==0)

{

while(!key_add);

year++;

if(year==99)

year=1;

}

if(flag==6key_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++;

}

}

}

}

}

}

}

基于at89c51单片机的基础设计的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:基于at89c51单片机的基础设计

<