这是干嘛的 void main() { init_eeprom(); //开始初始化保存的数据 P1=0xff; // delay(2000); lcd_init(); //调用液晶屏初始化子函数 ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 led1=0; //打开LCD的背光电源 buzzer=0; //蜂鸣器长响一次 delay(100); buzzer=1; init_eeprom(); while(1) //无限循环下面的语句: { keyscan(); //调用键盘扫描子函数 led=led1; if(timerOn==1) alarm(); //闹钟输出 if((fen==0)&&(miao==0)) { if(shi>12) temp_hour=shi-12; else { if(shi==0) temp_hour=12; else temp_hour=shi; } shangyimiao=miao; baoshi=1; } if(baoshi==1) { ZD_baoshi(); do keyscan(); while(shangyimiao==miao); shangyimiao=miao; } } }
时间: 2024-04-22 15:25:54 浏览: 56
这是一个基于单片机的时钟闹钟程序的主函数。主要包括以下几个部分:
1. 初始化:对EEPROM、LCD、DS1302时钟、定时计数器等进行初始化。
2. 执行键盘扫描子函数,读取按键的输入状态。
3. 控制LED灯的亮灭状态。
4. 如果闹钟定时器的标志位timerOn为1,则触发闹钟输出。
5. 如果当前时间到了整小时,触发蜂鸣器发声和计数器计数。
6. 在上一步中,如果计数器达到预设值,则清零计数器和蜂鸣器标志位,停止蜂鸣声。
7. 无限循环以上步骤,保持程序运行。
需要注意的是,在程序的一些部分中,还有一些其他的功能实现,比如读取当前时间并在LCD上显示出来、设置闹钟时间等等。
相关问题
void main() { init_eeprom(); P1=0xff; // delay(2000); lcd_init(); ds1302_init(); init(); led1=0; buzzer=0; delay(100); buzzer=1; init_eeprom(); while(1) { keyscan(); led=led1; if(timerOn==1) alarm(); if((fen==0)&&(miao==0)) { if(shi>12) temp_hour=shi-12; else { if(shi==0) temp_hour=12; else temp_hour=shi; } shangyimiao=miao; baoshi=1; } if(baoshi==1) { ZD_baoshi(); do keyscan(); while(shangyimiao==miao); shangyimiao=miao; } } }
这段代码是一个嵌入式系统的主函数。主要功能是实现一个时钟闹钟功能,其中使用了DS1302时钟芯片和LCD屏幕等外设。具体分析如下:
1. `init_eeprom()` 函数是初始化EEPROM存储器的函数。
2. `P1 = 0xff;` 设置P1口为输入模式,这是为了避免悬空引脚的影响。
3. `lcd_init()` 函数初始化LCD屏幕。
4. `ds1302_init()` 函数初始化DS1302时钟芯片。
5. `init()` 函数初始化其他外设,包括按键、LED和蜂鸣器等。
6. `led1 = 0; buzzer = 0; delay(100); buzzer = 1;` 控制LED和蜂鸣器的亮灭,用于开机提示。
7. `while(1)` 表示一直循环执行以下代码。
8. `keyscan()` 函数用于检测按键输入,根据按键输入进行相应的操作。
9. `led = led1;` 控制LED的亮灭,根据 `led1` 变量的值设置LED的状态。
10. `if(timerOn == 1) alarm();` 如果定时器开启,则执行 `alarm()` 函数,即闹钟响铃。
11. `if((fen == 0) && (miao == 0))` 如果当前时间是整点,则进入设置闹钟模式。
12. `if(baoshi == 1)` 如果已经设置了闹钟,则执行 `ZD_baoshi()` 函数,即闹钟到时时的提示操作。
13. `do keyscan(); while(shangyimiao == miao); shangyimiao = miao;` 在设置闹钟模式下,等待用户设置完毕。当分钟数发生变化时,说明用户已经完成了设置,退出设置模式。
编写基于STC89C51单片机代码,要求如下: 1、基于RC522读写卡模块,设计程序实现RFID卡号读取。 2、单片机片内EEPROM或外界EEPROM存储,多组卡号 3、实现刷卡开门(开门使用继电器模拟) 4、设计适当界面完成行卡注册和删除等管理工作。 5、刷卡时卡号读取成功蜂鸣器叫一下,卡号与EEPROM中的卡号比对成功继电器吸合,15秒后释放。 6、使用LCD1602或12864显示必要的提示信息。
以下是基于STC89C51单片机的代码实现,实现了基于RC522读写卡模块,卡号存储在单片机内部EEPROM中,刷卡开门,卡号读取成功蜂鸣器叫一下,卡号与EEPROM中的卡号比对成功继电器吸合,15秒后释放,并使用LCD1602显示必要的提示信息。
首先,需要配置RC522读写卡模块和LCD1602屏幕的引脚和初始化函数。
```c
#include<reg51.h>
#include<RC522.h>
#include<LCD1602.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3; //蜂鸣器接口
sbit led=P2^4; //LED接口,用于调试
sbit relay=P2^5; //继电器接口
sbit beep=P2^3; //蜂鸣器接口
// RC522读写卡模块引脚定义
sbit SDA = P1^7; //数据线
sbit SCK = P1^5; //时钟线
sbit MOSI = P1^6; //MOSI线
sbit MISO = P1^4; //MISO线
sbit NSS = P1^3; //NSS线
void init_RC522(); //初始化RC522模块
uchar read_card(uint *id); //读取卡号
void init_eeprom(); //初始化EEPROM
void write_eeprom(uchar addr, uchar dat); //写入EEPROM
uchar read_eeprom(uchar addr); //读取EEPROM
void register_card(); //注册卡号
void delete_card(); //删除卡号
void open_door(); //开门
void display_id(uint id); //在LCD上显示卡号
```
接下来是主函数部分,包括初始化和主循环。
```c
void main()
{
uchar mode, i;
uint id[5];
init_RC522(); //初始化RC522模块
init_lcd(); //初始化LCD1602
init_eeprom(); //初始化EEPROM
while(1)
{
mode = read_card(id); //读取卡号
if(mode == MI_OK)
{
beep = 1; //蜂鸣器叫一下,表示读取成功
delay(1000);
beep = 0;
for(i = 0; i < 5; i++)
{
if(read_eeprom(i) == (id[i] & 0xff)) //比对卡号
{
open_door(); //开门
break;
}
}
if(i == 5) //卡号不匹配
{
lcd_clear();
lcd_write_string("Card Not Found");
delay(1000);
}
}
}
}
```
接下来是各个函数的实现。
初始化RC522模块:
```c
void init_RC522()
{
uchar i;
init_io(); //初始化IO口
P2 = 0x00; //清除端口
delay(1000); //延时1ms
RC522_Reset(); //复位RC522
write_MFRC522(TModeReg, 0x8D); //设置定时器的时钟频率
write_MFRC522(TPrescalerReg, 0x3E); //设置定时器分频系数
write_MFRC522(TReloadRegL, 30); //设置定时器重载值
write_MFRC522(TReloadRegH, 0);
write_MFRC522(TxAutoReg, 0x40); //设置发送自动模式
write_MFRC522(ModeReg, 0x3D); //设置RC522为工作模式
write_MFRC522(CommandReg, 0x00); //清空命令缓冲区
for(i=0; i<6; i++) //写入卡片的默认密钥,用于验证卡片
{
write_MFRC522(KeyReg+i, 0xFF);
}
}
```
读取卡号:
```c
uchar read_card(uint *id)
{
uchar status;
uchar i, len;
status = MFRC522_Request(PICC_REQIDL, id); //寻卡
if(status == MI_OK)
{
status = MFRC522_Anticoll(id); //防冲撞
len = 4;
for(i = 0; i < len; i++)
{
*(id + i) = id[i];
}
return MI_OK;
}
else
{
return MI_ERR;
}
}
```
初始化EEPROM:
```c
void init_eeprom()
{
uchar i;
for(i = 0; i < 5; i++)
{
write_eeprom(i, 0xFF); //EEPROM清零
}
}
```
写入EEPROM:
```c
void write_eeprom(uchar addr, uchar dat)
{
IAP_CONTR = 0x87; //打开IAP功能
IAP_ADDRH = 0x00; //设置要写入的地址
IAP_ADDRL = addr;
IAP_DATA = dat; //设置要写入的数据
IAP_CMD = 0x02; //执行写入操作
_nop_(); //等待IAP操作完成
IAP_CONTR = 0x00; //关闭IAP功能
}
```
读取EEPROM:
```c
uchar read_eeprom(uchar addr)
{
uchar dat;
IAP_CONTR = 0x81; //打开IAP功能
IAP_ADDRH = 0x00; //设置要读取的地址
IAP_ADDRL = addr;
IAP_CMD = 0x01; //执行读取操作
_nop_(); //等待IAP操作完成
dat = IAP_DATA; //获取读取的数据
IAP_CONTR = 0x00; //关闭IAP功能
return dat;
}
```
注册卡号:
```c
void register_card()
{
uchar i;
uint id[5];
uchar mode;
lcd_clear();
lcd_write_string("Place Card");
while(1)
{
mode = read_card(id);
if(mode == MI_OK)
{
for(i = 0; i < 5; i++)
{
write_eeprom(i, (id[i] & 0xff)); //将卡号写入EEPROM
}
break;
}
}
lcd_clear();
lcd_write_string("Card Registered");
delay(1000);
}
```
删除卡号:
```c
void delete_card()
{
uchar i;
uint id[5];
uchar mode;
lcd_clear();
lcd_write_string("Place Card");
while(1)
{
mode = read_card(id);
if(mode == MI_OK)
{
for(i = 0; i < 5; i++)
{
write_eeprom(i, 0xFF); //将EEPROM中对应的卡号清除
}
break;
}
}
lcd_clear();
lcd_write_string("Card Deleted");
delay(1000);
}
```
开门:
```c
void open_door()
{
relay = 1; //继电器吸合
delay(15000); //保持15秒
relay = 0; //继电器释放
}
```
在LCD上显示卡号:
```c
void display_id(uint id)
{
uchar i;
lcd_clear();
for(i = 0; i < 5; i++)
{
lcd_write_hex(id[i]); //将卡号以十六进制形式显示在LCD上
lcd_write_char(' ');
}
}
```
阅读全文