at89s51数码管秒表c语言程序,AT89s51-AT24c02记忆秒表计时实验

21173f754a62e9da48232dbbbf7bedb1.png

/**********************************************《郭天祥新概念51单片机》P188,有改动。利用定时器产生0-99计时秒表,每过1秒,将计数的的数值写入AT24c02,关闭电源再打开,单片机将原来写入的值读出来,接着此数继续按秒变化,并显示在数码管上**********************************************//**********************************************数码管显示:数据P0 段选P2^6 位选 P2^7 AT24C02:地址设置为1010111x x为0表示写 x为1表示读SDA==P2^0 SCL==P2^1 WP接GND(表示允许读/写)**********************************************/#includereg51.h>#define uchar unsigned char#define uint unsigned intbit write=0; //写24C02的标志;sbit sda=P2^0; sbit scl=P2^1;sbit dula=P2^6;sbit wela=P2^7;uchar sec,tcnt; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*******************************************延时函数*******************************************/void delay(){ ;; }void delay1ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}/*******************************************开始信号*******************************************/void start() { sda=1;delay();scl=1;delay();sda=0;delay();}/*******************************************停止信号*******************************************/void stop() {sda=0;delay();scl=1;delay();sda=1;delay();}/*******************************************应答信号*******************************************/void respons() {uchar i;scl=1;delay();while((sda==1)(i250)) i++;scl=0;delay();}/*******************************************总线初始化*******************************************/void init(){sda=1;delay();scl=1;delay();}/*******************************************写入一个字节*******************************************/void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i8;i++){temp=temp1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}/*******************************************读出一个字节*******************************************/uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i8;i++){scl=1;delay(); k=(k1)|sda;scl=0;delay(); }return k;}/*******************************************指定地址写入数据*******************************************/void write_add(uchar address,uchar date){start();write_byte(0xae);respons();write_byte(address);respons();write_byte(date);respons();stop();}/*******************************************指定地址读出数据*******************************************/uchar read_add(uchar address){uchar date;start();write_byte(0xae);respons();write_byte(address);respons();start();write_byte(0xaf);respons();date=read_byte();stop();return date;}/*******************************************显示程序*******************************************/void display(uchar bai_c,uchar sh_c) {dula=0;P0=table[bai_c]; //显示第一位dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay1ms(5);dula=0;P0=table[sh_c]; //显示第二位dula=1;dula=0;wela=0;P0=0xfd;wela=1;wela=0;delay1ms(5);}/*******************************************MAIN*******************************************/void main(){init();sec=read_add(2); //读出保存的数据赋于secif(sec>100) //防止首次读取出错误数据sec=0;TMOD=0x01; //定时器工作在方式1ET0=1; EA=1;TH0=(65536-50000)/256; //对TH0 TL0赋值TL0=(65536-50000)%256; //使定时器0.05秒中断一次TR0=1; //开始计时while(1){display(sec/10,sec%10);if(write==1) //判断计时器是否计时一秒{write=0; //清零write_add(2,sec); //在24c02的地址2中写入数据sec}} }/*******************************************Interrupt service routine*******************************************/void t0() interrupt 1 //定时中断服务函数{TH0=(65536-50000)/256; //对TH0 TL0赋值TL0=(65536-50000)%256; //重装计数初值tcnt++; //每过50ms tcnt加一if(tcnt==20) //计满20次(1秒)时{tcnt=0; //重新再计sec++;write=1; //1秒写一次24C02if(sec==100)//定时100秒,再从零开始计时sec=0;}}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值