#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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务