找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求高手画程序流程图

[复制链接]
跳转到指定楼层
楼主
ID:39694 发表于 2012-5-4 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include<reg52.h>
#include <intrins.h>
#define WRITE_SECOND       0x80
#define WRITE_MINUTE       0x82
#define WRITE_HOUR         0x84
#define READ_SECOND        0x81
#define READ_MINUTE        0x83
#define READ_HOUR          0x85
#define WRITE_PROTECT      0x8E
#define READ_YEAR          0x8D
#define READ_MONTH         0x89
#define READ_SUN           0x87
#define WRITE_YEAR         0x8C
#define WRITE_MONTH        0x88
#define WRITE_SUN          0x86
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^0;           //定义接口
sbit CE=P3^1;
sbit SCLK=P3^2;
sbit DIO=P3^3;
sbit ACC_7=ACC^7;
uchar code shuzi[10][16]={
{0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00},/*"0",0*/
{0x00,0x00,0x00,0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00},/*"1",1*/
{0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x30,0x30,0x18,0x0C,0x06,0x63,0x7F,0x00,0x00},/*"2",2*/
{0x00,0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x30,0x60,0x60,0x63,0x33,0x1E,0x00,0x00},/*"3",3*/
{0x00,0x00,0x00,0x30,0x38,0x3C,0x36,0x36,0x33,0x33,0x7F,0x30,0x30,0x7C,0x00,0x00},/*"4",4*/
{0x00,0x00,0x00,0x7F,0x03,0x03,0x03,0x1F,0x37,0x60,0x60,0x63,0x33,0x1E,0x00,0x00},/*"5",5*/
{0x00,0x00,0x00,0x3C,0x36,0x03,0x03,0x1F,0x37,0x63,0x63,0x63,0x36,0x1C,0x00,0x00},/*"6",6*/
{0x00,0x00,0x00,0x7F,0x33,0x33,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00},/*"7",7*/
{0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x36,0x1C,0x36,0x63,0x63,0x63,0x3E,0x00,0x00},/*"8",8*/
{0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x76,0x7C,0x60,0x60,0x36,0x1E,0x00,0x00},/*"9",9*/
};
uchar code wenzi1[8][16]={
{0x18,0xF8,0x8C,0x8C,0x86,0xFB,0x99,0x98,0x98,0x98,0xFF,0x80,0x80,0x80,0x80,0x80},
{0xF0,0x30,0x30,0x30,0xF0,0x30,0x30,0x30,0xF0,0x30,0x18,0x18,0x0C,0x06,0x03,0x00},
{0x00,0xFC,0x0C,0x0C,0x0C,0x0C,0xFC,0x0C,0x0C,0x0C,0x0C,0x0C,0xFC,0x0C,0x00,0x00},
{0x00,0x00,0x3F,0x33,0xF3,0x33,0x3F,0xF3,0xB3,0xB3,0x3F,0x00,0x00,0x00,0x00,0x00},
{0x98,0xB8,0x18,0x0C,0x0C,0x06,0x03,0xFD,0x30,0x30,0x30,0x30,0x18,0x8C,0x06,0x03},
{0x38,0x0F,0x0C,0xCC,0xFF,0xCC,0x6E,0x7E,0x3F,0x3F,0x0D,0x0C,0x0C,0x0C,0xCC,0x7C},
{0xC0,0x80,0xFE,0x66,0x66,0xFE,0x66,0xE6,0x06,0xF6,0x66,0xC6,0x86,0xC3,0x73,0x1D},
{0x00,0xF8,0x18,0xD8,0x18,0x18,0xF8,0x18,0xD8,0xD8,0xD8,0xD8,0xCC,0x0C,0x06,0x03},
};
uchar code wenzi2[8][16]={
{0x00,0x3F,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x01},/*"年",0*/
{0x0F,0x0C,0x0C,0x0C,0x0F,0x0C,0x0C,0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x0F,0x06,0x00},/*"月",1*/
{0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0x0F,0x0C,0x00,0x00},/*"日",2*/
{0x0C,0x0C,0x0C,0x0C,0x7F,0x0C,0x0C,0x0C,0x0D,0x0D,0x0C,0x0C,0x0C,0x0C,0x0F,0x06},/*"时",3*/
{0x01,0x01,0x03,0x06,0x0E,0x1C,0x78,0x37,0x06,0x06,0x06,0x06,0x06,0x07,0x03,0x00},/*"分",4*/
{0x06,0x06,0x06,0x1E,0x37,0x66,0x66,0x06,0x66,0x66,0x30,0x18,0x0C,0x07,0x01,0x00},/*"秒",5*/
{0x00,0x01,0x7F,0x06,0x06,0x3F,0x06,0x07,0x00,0x1F,0x0C,0x06,0x03,0x0E,0x78,0x30},/*"度",6*/
{0x00,0x7F,0x63,0x6F,0x63,0x63,0x7F,0x60,0x6F,0x6C,0x6C,0x6F,0x6C,0x60,0x78,0x30},/*"周",0*/
};
uchar code xinq1[7][16]={
{0x00,0xF8,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00},
{0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00},
{0x00,0xFE,0x66,0x66,0x66,0x66,0x66,0x66,0x36,0x36,0x1E,0x0E,0x06,0xFE,0x06,0x00},
{0x00,0xFE,0xC0,0xC0,0xC0,0xC0,0xC0,0xFC,0x60,0x60,0x60,0x60,0x60,0xFF,0x00,0x00},
{0x60,0xC0,0x80,0x80,0xFF,0x00,0x00,0x60,0xE0,0x60,0x30,0x30,0x18,0x0C,0x06,0x00},

};
uchar code xinq2[7][16]={
{0x00,0x1F,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x00,0x00},/*"日",6*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",0*/
{0x00,0x18,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0x00,0x00,0x00},/*"二",1*/
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00},/*"三",2*/
{0x00,0x7F,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x7E,0x60,0x60,0x60,0x7F,0x60,0x00},/*"四",3*/
{0x00,0x3F,0x00,0x00,0x00,0x00,0x0C,0x1F,0x0C,0x0C,0x0C,0x0C,0x6C,0xFF,0x00,0x00},/*"五",4*/
{0x00,0x01,0x03,0x01,0xFF,0x00,0x00,0x03,0x06,0x0C,0x18,0x38,0x70,0x70,0x30,0x00},/*"六",5*/


};

uint temp,num;
void delay(uint t)
{
for(;t>0;t--);
}
void ys(uint z)//延时z毫秒
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}           
void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
{
DQ = 1; 
delay(10);                     //DQ复位,不要也可行。          
DQ = 0;                    //单片机拉低总线
delay(80);                //精确延时,维持至少480us
DQ = 1;                    //释放总线,即拉高了总线
delay(20);                //此处延时有足够,确保能让DS18B20发出存在脉冲。
}

uchar Read_One_Byte()       //读取一个字节的数据read a byte date
                            //读数据时,数据以字节的最低有效位先从总线移出
{
uchar i   = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                  //将总线拉低,要在1us之后释放总线
                           //单片机要在此下降沿后的15us内读数据才会有效。
   _nop_();                 //至少维持了1us,表示读时序开始
   dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
   DQ = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上                //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
   if(DQ)                   //控制器进行采样
   {
    dat |= 0x80;            //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
   }       
   delay(8);               //此延时不能少,确保读时序的长度60us。
}
return (dat);
}

void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                        //拉低总线
   _nop_();                       //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
   DQ = dat&0x01;                 //从字节的最低位开始传输
                                 //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
                                 //因为15us后DS18B20会对总线采样。
   delay(10);                     //必须让写时序持续至少60us
   DQ = 1;                        //写完后,必须释放总线,
   dat >>= 1;
   delay(8);
}
}


uint Get_Tmp()                   //获取温度get the temperature
{
float tt;
uchar a,b;
Init_Ds18b20();                //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0x44);          //温度转换指令
Init_Ds18b20();                 //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0xbe);          //读暂存器指令
a = Read_One_Byte();           //读取到的第一个字节为温度LSB
b = Read_One_Byte();           //读取到的第一个字节为温度MSB
temp = b;                      //先把高八位有效数据赋于temp
temp <<= 8;                    //把以上8位数据从temp低八位移到高八位
temp = temp|a;                //两字节合成一个整型变量
tt = temp*0.0625;              //得到真实十进制温度值
                                //因为DS18B20可以精确到0.0625度
                                //所以读回数据的最低位代表的是0.0625度
temp = tt*10+0.5;               //放大十倍
                                //这样做的目的将小数点后第一位也转换为可显示数字
                                //同时进行一个四舍五入操作。
return temp;
}
void Write1302 (uchar addr,dat)  //地址、数据发送子程序
{
 uchar i,temp;
    CE=0;                             //CE 引脚为低,数据传送 中止
    SCLK=0;                           //清零时钟总线
    CE=1;                          //CE 引脚为高,逻辑控制有效
    for(i=8;i>0;i--)     //循环8次移位  发送地址
    {
     SCLK=0;
        temp=addr;
        DIO=(bit)(temp&0x01);             //每次传输低字节
        addr>>=1;                        //右移一位
        SCLK=1;
   }
 for(i=8;i>0;i-- )   //发送数据
    {
     SCLK=0;
        temp=dat;
        DIO=(bit)(temp&0x01);
        dat>>=1;
        SCLK=1;
    }
    CE = 0;
}
uchar Read1302(uchar addr) //数据读取子程序
{
         uchar i,temp,dat1,dat2;
         CE=0;
         SCLK=0;
         CE = 1;
         for ( i=8; i>0; i-- )                  //循环8次移位 发送地址
         {
           SCLK=0;
           temp=addr;
           DIO=(bit)(temp&0x01);             //每次传输低字节
           addr>>=1;                         //右移一位
           SCLK=1;
         }
         //读取数据
         for ( i=8; i>0; i-- )
         {
          ACC_7=DIO;
          SCLK = 1;
         ACC>>=1;
          SCLK = 0;
          }
          CE=0;
          dat1=ACC;
          dat2=dat1/16;                                       //数据进制转换
          dat1=dat1%16;                                     //十六进制转十进制
          dat1=dat1+dat2*10;
          return (dat1);
 }
void dushij()
{
 uchar i,j,xin,yue,ri,m;
 uint nian;
 nian=2012;
 temp=Get_Tmp();
 ri=Read1302(READ_SUN);
 yue=Read1302(READ_MONTH);
 nian=Read1302(READ_YEAR);
 if(yue==1)
 m=13;
 if(yue==2)
 m=14;
 if(yue>2)
 m=yue;
 xin=((nian%100)+((nian%100)/4)+((nian/100)/4)-(2*(nian/100))+((26*(m+1))/10)+ri-1)%7;
 for(i=0;i<230;i++)
  for(j=0;j<3;j++)
   for(num=0;num<16;num++)
   {
    if(num+i<16)
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=shuzi[Read1302(READ_YEAR)/10][num+i];
     P2=shuzi[Read1302(READ_YEAR)%10][num+i]; 
     ys(2);
    }
    else if((num+i>=16)&(num+i<32))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[0][num+i-16];
     P2=wenzi2[0][num+i-16]; 
     ys(2);
    }
    else if((num+i>=32)&(num+i<48))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=shuzi[Read1302(READ_MONTH)/10][num+i-32];
     P2=shuzi[Read1302(READ_MONTH)%10][num+i-32]; 
     ys(2);
    }
    else if((num+i>=48)&(num+i<64))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[1][num+i-48];
     P2=wenzi2[1][num+i-48];  
     ys(2);
    }
    else if((num+i>=64)&(num+i<80))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=shuzi[Read1302(READ_SUN)/10][num+i-64];
     P2=shuzi[Read1302(READ_SUN)%10][num+i-64]; 
     ys(2);
    }
    else if((num+i>=80)&(num+i<96))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[2][num+i-80];
     P2=wenzi2[2][num+i-80];  
     ys(2);
    }
    else if((num+i>=96)&(num+i<112))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=shuzi[Read1302(READ_HOUR)/10][num+i-96];
     P2=shuzi[Read1302(READ_HOUR)%10][num+i-96]; 
     ys(2);
    }
    else if((num+i>=112)&(num+i<128))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[3][num+i-112];
     P2=wenzi2[3][num+i-112];  
     ys(2);
    }
    else  if((num+i>=128)&(num+i<144))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=shuzi[Read1302(READ_MINUTE)/10][num+i-128];
     P2=shuzi[Read1302(READ_MINUTE)%10][num+i-128]; 
     ys(2);
    }
    else if((num+i>=144)&(num+i<160))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[4][num+i-144];
     P2=wenzi2[4][num+i-144];  
     ys(2);
    }
    else if((num+i>=160)&(num+i<176))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[7][num+i-160];
     P2=wenzi2[7][num+i-160];
      
     ys(2);
    }
    else if((num+i>=176)&(num+i<192))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=xinq1[xin][num+i-176];
     P2=xinq2[xin][num+i-176];  
     ys(2);
    }
    else if((num+i>=192)&(num+i<208))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=shuzi[temp/100][num+i-192];
     P2=shuzi[temp%100/10][num+i-192]; 
     ys(2);
    }
    else if((num+i>=208)&(num+i<224))
    {
     P0=0X00;
     P2=0X00;
     P1=num;
     P0=wenzi1[6][num+i-208];
     P2=wenzi2[6][num+i-208];  
     ys(2);
    }
    else
    {
     P0=0X00;
     P2=0X00;
     P1=num;  
     ys(2);
    }
   }
}
void main()
{
 while(1)
 dushij();
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:18852 发表于 2012-5-7 14:53 | 只看该作者

画流程图有没有奖金呀 ???

回复

使用道具 举报

板凳
ID:18852 发表于 2012-5-7 14:54 | 只看该作者

画流程图有没有奖金呀 ???

QQ 85385639 可以联系我
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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