找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1915|回复: 1
打印 上一主题 下一主题
收起左侧

求此程序的proteus仿真图

[复制链接]
跳转到指定楼层
楼主
ID:84140 发表于 2015-6-30 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define IO_ADDR P2
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit RST=P1^3;
sbit PSB=P1^5;
sbitmode=P0^0;                                            //key1     模式
sbitinc=P0^1;                                                       //kye2     
sbitdec=P0^2;                                                      //key3  
sbitfmq=P3^4;                                                     //蜂鸣器接口
//=============================================
  code uchar data1[16]={"作息时间控制系统"};
  code uchar   data2[]={"某某某 2011026103"};
  code uchar   data3[]={"时间: :  :     "};
  code uchar   data4[]={"打铃: :  :     "};
  uchar disp_buff[4][16];//定义一个二维数组,4行,16个字符
  uchar hour,min,sec,minisec;
  uchar mode_value=0 ,xf;                   //调节模式
  uchar ds[20][2] =
{
{8,0},{8,45},{8,55},{9,40},{10,0},{10,45},{10,55},{11,40},{14,0},{14,45},
{14,55},{15,40},{16,0},{16,45},{16,55},{17,40},{19,0},{19,45},{19,55},{20,40}
};
//======================================================
/*******************************************************************/
void delay(int ms)
{
   while(ms--)
       {
     uchar i;
         for(i=0;i<250;i++)  
          {
           _nop_();                  
              _nop_();
              _nop_();
              _nop_();
          }
       }
}     
//=========================
void delayus(uint i)
{
uchar y;
while(--i)
for(y=0;y<2;y++)
{;}
}
//======================================================
uchar read_data(void)//读状态。//返回值1---空。0-----忙。
{
uchar temp;
RS=0;
RW=1;
delayus(2);
EN=1;
delayNOP();
IO_ADDR=0XFF;
temp=IO_ADDR;//读输入口。
temp=temp&0x80;
EN=0;
if(temp==0x00)
  {
  return(0);
  }
else
  {
  return(1);}//注:如需软件仿真,需要将此处改为1
}
//============================
void write_data(uchar type,uchar date)//写命令或写数据。
{
while(read_data());
//delayus(100);
if(type)//写数据1
  {
  RS=1;
  }
else//0//写命令
  {
  RS=0;
  }
delayus(1);//15US
RW=0;
delayus(1);//15US
EN=0;
delayus(1);
delayus(1);
delayus(1);
IO_ADDR=date;
delayNOP();
EN=1;
delayNOP();
EN=0;
delayus(10);
}
//***************************************************************
voidinit_system()//12864初始化部分。
{
PSB=1;
RST=1;
delayus(4);
RST=0;
delay(3);
RST=1;
delay(3);
write_data(0,0x30);//功能设定,8位并行接口
delay(5);
write_data(0,0x30);//功能设定,基本指令集。
delay(5);
write_data(0,0x30);//功能设定,8位并行接口
delay(5);
write_data(0,0x01);//清屏,
delay(5);
write_data(0,0x01);//清屏,
delay(5);
write_data(0,0x02);//将地址指针移到开头位置。
write_data(0,0x0c);//整体显示开。
write_data(0,0x01);//清屏,
write_data(0,0x01);//清屏,
}
//=========================================
//==============================================
void display_buff()//显示2维数组内的内容。
{
uchar i;
uchar *point;
point=&disp_buff[0][0];
//write_data(0,0x01);//清屏,
//delayus(5);
//write_data(0,0x02);//地址归0
//delayus(10);
//write_data(0,0x06);//地址归0
///////////////一行一行的显示////////////////
//行地址:0X80 0X90 0X88 0X98
write_data(0,0X80);//移到0X80位置。
delayus(1);
for(i=0;i<16;i++)
{
  write_data(1,*point);
point++;
delayus(1);
}   
//=======================================
//=========================================
write_data(0,0X90);
delayus(1);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[1]);
delayus(1);
}
write_data(0,0X88);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[2]);
delayus(1);
}
write_data(0,0X98);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[3]);
delayus(1);
}
}
//=====================================
voidtime0() interrupt 1
{
  TH0=0X4C;
  TL0=0X00;
  if(minisec++>20)
   {
     minisec=0;
       if(++sec>59)
        {sec=0;
         if(++min>59)
         {min=0;
          if(++hour>24)
          {
            hour=0;
              min=0;
          sec=0;     
          }
         }
        }  
   }
}
voiddelaysj(unsigned char j)//延时程序
{
       unsignedchar i;
       while(j--)
       {
              for(i=0;i<50;i++);
       }
}
//蜂鸣器
voids_fmq()
{
       unsignedchar j=2;
                                      //蜂鸣器叫
       while(j--)
              {
                     fmq=0;
                     delaysj(200);
              }
}
/*************************闹铃判断**********************************/
void nling()
{ uchar i ;
for(i=0;i<20;i++)
      {
              if(hour==ds[0]&&min==ds[1])          //判断是否到闹铃时间
              {     if(sec<10)
                      s_fmq();                                                  //调用蜂铃
              }
       }
}
//调节模块
voidtiaojie()
{ uchar i;
       if(mode==0)
       {
              while(!mode);
              mode_value++;
       }
       //zifu(0xbc,0xb8,2,mode_value,&shu);
       switch(mode_value)
       {                                                                                                                                     //模式0:正常工作。显示“天天向上”
              case0:{//uchar i;
  for(i=0;i<16;i++)
   {
  disp_buff[0]=data1;
  disp_buff[1]=data2;
   }} break ;
              case1:{                                                                                                            //    模式1:可以修改时间,其中inc是改分钟,dec是改小时
                            if(inc==0){while(!inc);min++;if(min==60) min=0;}
                            if(dec==0){while(!dec);if(min==0) min=60; min--;}
                            //if(dec==0){while(!dec);hour++; if(hour==24) hour=0;}
                     //     uchar i;
  for(i=0;i<16;i++)
   {
  disp_buff[2]=data3;   
    }
  disp_buff[2][5]=(hour/10)+0x30;
   disp_buff[2][6]=(hour%10)+0x30;
  disp_buff[2][8]=(min/10)+0x30;
  disp_buff[2][9]=(min%10)+0x30;
  disp_buff[2][11]=(sec/10)+0x30;
  disp_buff[2][12]=(sec%10)+0x30;
  display_buff();
                            };break;
              case2:{if(inc==0){ while(!inc);hour++;if(hour==24) hour=0; }                                               //   模式2:选择一个需要改变的闹铃
                            //if(inc==0){while(!inc);min+;if(min==60) min=0;}
                            if(dec==0){while(!dec);if(hour==0) hour=24;hour--; }
                     //     uchar i;
  for(i=0;i<16;i++)
   {
  disp_buff[2]=data3;   
    }
  disp_buff[2][5]=(hour/10)+0x30;
  disp_buff[2][6]=(hour%10)+0x30;
  disp_buff[2][8]=(min/10)+0x30;
  disp_buff[2][9]=(min%10)+0x30;
  disp_buff[2][11]=(sec/10)+0x30;
  disp_buff[2][12]=(sec%10)+0x30;
  display_buff();
                            //zifu(0xbe,0x40,2,xf/10,&shu);
                     //     zifu(0xbe,0x48,2,xf%10,&shu);
                     //     zifu(0xbe,0x68,2,2,&fuhao);  
                     //     zifu(0xbe,0x70,2,ds[xf][1]/10,&shu);
                     //     zifu(0xbe,0x78,2,ds[xf][1]%10,&shu);
                     ///    zifu(0xbe,0x50,2,0,&fuhao);
                     //     zifu(0xbe,0x58,2,ds[xf][0]/10,&shu);   //     显示“调整后的闹铃时间”
                     //     zifu(0xbe,0x60,2,ds[xf][0]%10,&shu);
                            }  ;break;
              case3: {                                                                                                                     // 模式3:修改选定的闹铃的分钟
                            if(inc==0){while(!inc);ds[xf][1]++;if(ds[xf][1]==60) ds[xf][1]=0;}
                            if(dec==0){while(!dec);if(ds[xf][1]==0) ds[xf][1]=60;ds[xf][1]--;}
                             //   uchari;
                                for(i=0;i<16;i++)
                               {
                               disp_buff[3]=data4;   
                                }
                               disp_buff[3][5]=ds[xf][0]/10+0x30;
                               disp_buff[3][6]=ds[xf][0]%10+0x30;
                               disp_buff[3][8]=ds[xf][1]/10+0x30;
                               disp_buff[3][9]=ds[xf][1]%10+0x30;
                               disp_buff[3][11]=0+0x30;
                               disp_buff[3][12]=0+0x30;
                               display_buff();//       显示“调整后的闹铃时间”
                            }  ;break ;
              case4:{                                                                                                                     // 模式4:修改选定的闹铃的小时
                             if(inc==0){ while(!inc);ds[xf][0]++;if(ds[xf][0]==24)ds[xf][0]=0;}
                             if(dec==0){ while(!dec);ds[xf][0]--;if(ds[xf][0]==0) ds[xf][0]=23;}
                              //  uchari;
                                //for(i=0;i<16;i++)
                              // {
                             // disp_buff[3]=data4;   
                             //   }
                               disp_buff[3][5]=ds[xf][0]/10+0x30;
                               disp_buff[3][6]=ds[xf][0]%10+0x30;
                               disp_buff[3][8]=ds[xf][1]/10+0x30;
                               disp_buff[3][9]=ds[xf][1]%10+0x30;
                               disp_buff[3][11]=0+0x30;
                               disp_buff[3][12]=0+0x30;
                               display_buff();
                            //hanzi(0xbe,0x40,2,2,&zi);                       //    显示“时”
                     //      zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); //     显示“调整后的闹铃时间”
                     //      zifu(0xbe,0x60,2,ds[xf][0]%10,&shu);
                     //     zifu(0xbe,0x68,2,2,&fuhao);     
              //            zifu(0xbe,0x70,2,ds[xf][1]/10,&shu);
              //            zifu(0xbe,0x78,2,ds[xf][1]%10,&shu);
                            }  ;break;
              case5:{ mode_value=0 ;};break;   //模式5:确认修改,返回正常工作状态
              default:break;
       }
}
//从打铃时间表中找出下一个要打铃的时间
uchar Locate (void)
{//uchar  xf;//n;
  xf=0;               
  while(xf<20)
   {  if(hour<ds[xf][0]) break;
      else if((hour==ds[xf][0])&&(min<=ds[xf][1])) break;
      xf++;
          //n++;
    }
if(xf==20) xf=0;//xf=0;     
return(xf);        
}
void shizhong()
{ uchar i;
  for(i=0;i<16;i++)
   {
  disp_buff[0]=data1;
  disp_buff[1]=data2;
  disp_buff[2]=data3;
  disp_buff[3]=data4;
    }
  disp_buff[2][5]=(hour/10)+0x30;
  disp_buff[2][6]=(hour%10)+0x30;
  disp_buff[2][8]=(min/10)+0x30;
  disp_buff[2][9]=(min%10)+0x30;
  disp_buff[2][11]=(sec/10)+0x30;
  disp_buff[2][12]=(sec%10)+0x30;
   //闹铃
  disp_buff[3][5]=ds[xf][0]/10+0x30;
  disp_buff[3][6]=ds[xf][0]%10+0x30;
  disp_buff[3][8]=ds[xf][1]/10+0x30;
  disp_buff[3][9]=ds[xf][1]%10+0x30;
  disp_buff[3][11]=0+0x30;
  disp_buff[3][12]=0+0x30;
  display_buff();
}
/*******************************************************************/
/*                                                                */
/*  延时函数                                                      */
/*                                                               
//==========================================        */
//*******************************************************************
voidmain(void)
{
  P0=0XFF;
  P2=0XFF;
  EA=1;
  ET0=1;
  TH0=0X4C;
  TL0=0X00;
  TMOD=0X01;
  TR0=1;
  init_system();
  while(1)
  {
  tiaojie();
  shizhong();
  nling();
  Locate ();
  //s_fmq();
  }
  }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:84392 发表于 2015-6-30 19:04 | 只看该作者
你有万年历程序没,求帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表