单片机课设报告(万年历的制作) - 图文 联系客服

发布时间 : 星期二 文章单片机课设报告(万年历的制作) - 图文更新完毕开始阅读19275e2bb4daa58da0114a0d

洛阳理工学院课程设计报告

3.2 源程序:

3.2.1 总体程序:

#include #include #include \

#define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^5; sbit lcden=P3^4;

sbit key1=P3^0; //时间功能键。 sbit key2=P3^2; //增大键。 sbit key3=P3^3; //减小键。 sbit key4=P3^1; //闹钟功能键。 sbit beep1=P2^3;

//标准音符频率对应的延时表。 uchar code High_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};

uchar code Low_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3}; //待写入24C02的音符。

uchar code Song_24C02[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5}; uchar index; //读取音符索引值。 uchar count,key1num,key4num,flag,soundflag; uchar

hour,min,sec,week,year,month,day,nz_hour,nz_min,nz_sec,nz_week,nz_year,nz_month,nz_day;

uchar code table[]=\定义初始上电时液晶默认的显示状态。 //延时。

void delayms(uint xms) {uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);}//蜂鸣器发声函数。 void beep() {beep1=0;

delayms(200);

beep1=1;}//1602液晶写命令函数。 void write_com(uchar com) {lcdrs=0;

12

洛阳理工学院课程设计报告

lcden=0; P0=com;

delayms(5); lcden=1; delayms(5);

lcden=0;}//1602液晶写数据函数。 void write_date(uchar date) {lcdrs=1; lcden=0; P0=date; delayms(5); lcden=1; delayms(5);

lcden=0;}//写时分秒函数。

void write_hms(uchar address,uchar date)

{uchar shi,ge; //1602液晶刷新时分秒函数,4为时,7为分,10为秒。

shi=date/10; ge=date;

write_com(0x80+0x40+address); write_date(0x30+shi);

write_date(0x30+ge); }//写年月日函数。 void write_ymd(uchar address,uchar date)

{uchar shi,ge; //1602液晶刷新年月日函数,2为年,5为月,8为日。

shi=date/10; ge=date;

write_com(0x80+address); write_date(0x30+shi);

write_date(0x30+ge);}//写液晶星期显示函数。 void write_week(uchar date)

{write_com(0x80+15); //1602液晶刷新星期函数,15为星期。 write_date(0x30+date);}//初始化函数。 void init() {uchar num; lcden=0; hour=0; min=0; sec=0; week=1; day=0; month=0; year=0; count=0;

13

洛阳理工学院课程设计报告

key1num=0; init_24c02();

write_com(0x38); //设置16*2显示,5*7点阵,8位并行数据接口。 write_com(0x0c); //设置开显示,不显示光标。 write_com(0x06); //写一个字符后地址指针加1。 write_com(0x01); //显示清0,数据指针清0。 write_com(0x80); //设置初始显示位置。 for(num=0;num<16;num++) {write_date(table[num]); delayms(5);}

write_com(0x80+0x40+6);

write_date(0x3a); //写出时间显示部分的两个冒号。 delayms(5);

write_com(0x80+0x40+9); write_date(0x3a); delayms(5);

sec=read_add(1); //首次上电时从24C02中读取出存储的数据。 min=read_add(2); hour=read_add(3); week=read_add(4); day=read_add(5); month=read_add(6); year=read_add(7);

write_hms(10,sec); //分别送去液晶显示。 write_hms(7,min); write_hms(4,hour); write_week(week); write_ymd(8,day); write_ymd(5,month); write_ymd(2,year); TMOD=0x01; //定时器T0工作方式1,定时器T1工作方式0。 TH0=(65536-50000)/256; //装初值,50ms。 TL0=(65536-50000)%6; EA=1; ET0=1; ET1=1; PT0=1;

TR0=1; //开始计时。}//按键扫描函数。 void keyscan()

{void shijiantiaojie(); //时间调节函数声明部分。 void naozhongtiaojie(); //闹钟调节函数声明部分。 if(key1==0) {delayms(10); if(key1==0)

14

洛阳理工学院课程设计报告

{key1num++; //按键值加1。

while(!key1); //等待按键释放。

beep(); //每当有按键释放蜂鸣器发出滴声。 if(key1num==1)

{TR0=0; //关闭定时器。

write_com(0x80+0x40+10); //光标定位到秒的位置。 write_com(0x0f); //光标开始闪烁。 }

if(key1num==2)

{write_com(0x80+0x40+7); //光标定位到分的位置。} if(key1num==3)

{write_com(0x80+0x40+4); //光标定位到时的位置。} if(key1num==4)

{write_com(0x80+15); //光标定位到星期的位置。} if(key1num==5)

{write_com(0x80+8); //光标定位到日的位置。} if(key1num==6)

{write_com(0x80+5); //光标定位到月的位置。} if(key1num==7)

{write_com(0x80+2); //光标定位到年的位置。} if(key1num==8)

{key1num=0; //记录按键数清0。 write_com(0x0c); //取消光标闪烁。

TR0=1; //启动定时器使时钟开始走。} } }

if(key4==0) {delayms(10); if(key4==0)

{key4num++; //按键值加1。

while(!key4); //等待按键释放。

beep(); //每当有按键释放蜂鸣器发出滴声。 flag=1; //标志进入了闹钟设置。 TR0=0; //关闭定时器 if((flag==1)&&(key4num==1))

{ write_com(0x80+0x40); //标志进入了闹钟设置模式。 write_date('R'); write_date('i');

nz_sec=read_add(8); //首次进入时从24C02中读取出存储的数据。 nz_min=read_add(9); nz_hour=read_add(10); nz_week=read_add(11); nz_day=read_add(12); nz_month=read_add(13);

15