永发信息网

基于STC89C52单片机比赛记分牌的设计程序

答案:2  悬赏:30  手机版
解决时间 2021-04-24 05:06
  • 提问者网友:愿为果
  • 2021-04-23 04:19
能不能告诉你的QQ,我有些关于单片机的问题想向你请教,谢谢
最佳答案
  • 五星知识达人网友:撞了怀
  • 2021-04-23 05:15
单片机比赛记分牌很好做,程序也好写
关键是电池,用于室外的,难找足量的电池
全部回答
  • 1楼网友:底特律间谍
  • 2021-04-23 06:29

就弄个at24c02读写程序,注释详细看这个也应该用不到专门的时钟芯片,思路:开机进入主循环之前读取芯片中的数据,设置个标志位没30秒取反一次。或者但秒=0或为60时取反一次也是半分种吸和或断开,

利用单片机本身的定时器,例如每个50ms中断一次20次就是一秒,

bit ack;    //应答标志位

sbit sda=p2^1; sbit scl=p2^0;

void start_i2c() {   sda=1;   //发送起始条件的数据信号   _nop();   scl=1;   _nop();    //起始条件建立时间大于4.7us,延时   _nop();   _nop();   _nop();   _nop();      sda=0;    //发送起始信号   _nop();    //起始条件锁定时间大于4μ   _nop();   _nop();   _nop();   _nop();       scl=0;    //钳住i2c总线,准备发送或接收数据   _nop();   _nop(); } void stop_i2c() {   sda=0;    //发送结束条件的数据信号   _nop();   //发送结束条件的时钟信号   scl=1;    //结束条件建立时间大于4μ   _nop();   _nop();   _nop();   _nop();   _nop();   sda=1;    //发送i2c总线结束信号   _nop();   _nop();   _nop();   _nop(); }

void  sendbyte(unsigned char c) {  unsigned char bitcnt;    for(bitcnt=0;bitcnt<8;bitcnt++)  //要传送的数据长度为8位     {     if((c<<bitcnt)&0x80)sda=1;   //判断发送位     else  sda=0;         _nop();     scl=1;    //置时钟线为高,通知被控器开始接收数据位     _nop();     _nop();    //保证时钟高电平周期大于4μ     _nop();     _nop();     _nop();         scl=0;     }         _nop();     _nop();     sda=1;    //8位发送完后释放数据线,准备接收应答位     _nop();     _nop();       scl=1;     _nop();     _nop();     _nop();     if(sda==1)ack=0;         else ack=1;    //判断是否接收到应答信号     scl=0;     _nop();     _nop(); }

  unsigned char  rcvbyte() {   unsigned char retc;   unsigned char bitcnt;     retc=0;   sda=1;    //置数据线为输入方式   for(bitcnt=0;bitcnt<8;bitcnt++)     {     _nop();         scl=0;    //置时钟线为低,准备接收数据位     _nop();     _nop();    //时钟低电平周期大于4.7us     _nop();     _nop();     _nop();     scl=1;    //置时钟线为高使数据线上数据有效     _nop();     _nop();     retc=retc<<1;     if(sda==1)retc=retc+1; //读数据位,接收的数据位放入retc中     _nop();     _nop();     }   scl=0;      _nop();   _nop();   return(retc); }

void ack_i2c(void) {     sda=0;       _nop();   _nop();   _nop();       scl=1;   _nop();   _nop();    //时钟低电平周期大于4μ   _nop();   _nop();   _nop();    scl=0;    //清时钟线,钳住i2c总线以便继续接收   _nop();   _nop();    }

bit isendstr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) {    unsigned char i;  for(i=0;i<no;i++)     {    start_i2c();    //启动总线    sendbyte(sla);    //发送器件地址     if(ack==0)return(0);    sendbyte(suba);    //发送器件子地址     if(ack==0)return(0);       sendbyte(*s);    //发送数据     if(ack==0)return(0);     stop_i2c();    //结束总线   delayms(1);    //必须延时等待芯片内部自动处理数据完毕   s++;   suba++;     }   return(1); }

bit ircvstr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) {    unsigned char i;

   start_i2c();    //启动总线    sendbyte(sla);    //发送器件地址     if(ack==0)return(0);    sendbyte(suba);    //发送器件子地址     if(ack==0)return(0);

   start_i2c();    sendbyte(sla+1);     if(ack==0)return(0);

  for(i=0;i<no-1;i++)     {     *s=rcvbyte();    //发送数据     ack_i2c();    //发送就答位     s++;     }    *s=rcvbyte();     noack_i2c();    //发送非应位     stop_i2c();    //结束总线   return(1); }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯