您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页单片机时钟秒表代码

单片机时钟秒表代码

来源:小侦探旅游网
word #include

#define uchar unsigned char

#define uint unsigned int

bit write=0; sbit sda=P2^3; sbit scl=P2^2;

sbit dula=P3^6;

sbit wela=P3^7;

sbit LED_CS=P2^5;

sbit MOTOR_CS=P2^7;

sbit key1=P1^0;

sbit key2=P1^1;

sbit key3=P1^2;

//写24C02的标志;

1 / 19

word sbit key4=P1^3;

uint min,sec,tt,ge,shi,bai,qian;

uchar a=0;

uchar flag=0;

uchar code table[]={

0xC0,0xF9,0xA4,0xB0,

0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,

0xC6,0xA1,0x86,0x8E};

void delay()

{ ;; }

void delayms(uint z)

{

2 / 19

word uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void start() {

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

//开始信号:scl为高电平期间, sda发生负跳变

3 / 19

word void stop() //停止信号:scl为高电平, sda发生正跳变

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

void respons()

//应答信号:scl为高电平期间, sda被承受设备拉为低电平, 最后//scl置0

{

uchar i;

4 / 19

word scl=1;

delay();

while((sda==1)&&(i<255))

i++;

scl=0;

delay();

}

void init() {

sda=1;

delay();

scl=1;

delay();

//总线初始化:将总线拉高以释放总线5 / 19

word }

/*写字节数据: 将8位数据通过左移到CY(进位),然后赋值给数据线SDA

每发送一位,scl出现正跳变 ,发送完数据后,需要将scl置0, sda置1 */

void write_byte(uchar date)

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

delay();

sda=CY;

6 / 19

word delay();

scl=1;

delay();

}

scl=0;

delay();

sda=1;

delay();

}

/*读字节数据: 将数据一位一位从sda中获取, 每读取一位scl出现负跳变

通过变量k将8位数据整合为1个字节数据,读数据前, 先将scl置0, sda置1*/

uchar read_byte()

{

7 / 19

word uchar i,k;

scl=0;

delay();

sda=1;

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

k=(k<<1)|sda;

scl=0;

delay();

}

8 / 19

word return k;

}

//数码管显示程序

void display(uchar qian,uchar bai,uchar shi,uchar ge)

{

P0 = table[ge];

dula = 1;

dula = 0;

P0=0x08;

wela = 1;

wela = 0;

delayms(1);

P0 = table[shi];

9 / 19

word dula = 1;

dula = 0;

P0=0x04;

wela = 1;

wela = 0;

delayms(1);

P0 = table[bai];

dula = 1;

dula = 0;

P0 = 0x02;

wela= 1;

wela= 0;

delayms(1);

10 / 19

word P0 = table[qian];

dula = 1;

dula = 0;

P0 = 0x01;

wela= 1;

wela= 0;

delayms(1);

}

//判断按键

void keyscan()

{

MOTOR_CS=0;

LED_CS=0;

/ 19

11 word if(key1==0)

{

delayms(10); //消抖

if(key1==0)

{

sec=0;

min=0;

while(!key1);

} }

if(key2==0)

{

delayms(10);

12 / 19

word if(key2==0)

{

TR0=1;

while(!key2);

}

}

if(key3==0)

{

delayms(10);

if(key3==0)

{

TR0=0;

while(!key3); 13 / 19

word }

}

if(key4==0)

{

delayms(10);

if(key4==0)

{

TR0=0;

sec=sec+1;

while(!key4); }

}

}

14 / 19

word void led()

{

LED_CS=1;

P0=0x00;

delayms(250);

P0=0xff;

LED_CS=0;

}

void beep()

{

MOTOR_CS=1;

P0 = 0x3f;

delayms(250);

15 / 19

word P0 = 0x7f;

MOTOR_CS=0;

}

void main()

{

LED_CS = 0;

MOTOR_CS=0;

sec=read_add(2); //读出保存的数据赋于sec

TMOD=0x01; //定时器工作在方式1

ET0=1; //打开定时器、计数器0中断允许位

EA=1; //打开全局中断

// TR0=0;

TH0=(65536-50000)/256; //对TH0 TL0赋值

16 / 19

word while(1)

{

shi=sec/10;

ge=sec%10;

bai = min%10;

qian = min/10;

display(qian,bai,shi,ge);

keyscan();

if(write==1) //判断计时器是否计时一秒

{

write=0; //置零

write_add(2,sec); //在24c02的地址2中写入数据sec

}

17 / 19

word }

}

void t0() interrupt 1 //定时中断服务函数

{

TH0=(65536-50000)/256; //对TH0 TL0赋值

TL0=(65536-50000)%256; //重装计数初值

tt++; //每过50ms tt加一

if(tt==20) //计满20次〔1秒〕时

{

tt=0; //重新再计

sec++;

write=1; //1秒写一次24C02

if(sec==60) //定时60秒,再从零开始计时

18 / 19

word {

sec=0;

led();

beep();

min++;

if(min==60)//是否满1h {

min=0;

}

}

}

19 / 19

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务