门禁源代码Word格式.docx
《门禁源代码Word格式.docx》由会员分享,可在线阅读,更多相关《门禁源代码Word格式.docx(66页珍藏版)》请在冰豆网上搜索。
ATmega16
晶振频率:
7.3728MHZ
版本:
V0.1
编程:
于军峰
编译日期:
2007-05-01
******************************************************************************************************************/
#include<
iom16v.h>
macros.h>
stdio.h>
#include"
LCD_12864.H"
//LCD头文件
read_card.H"
//读卡头文件
#definekey_inc(PINC&
(1<
<
PC0))//按键,选择日期、时间时用
#definekey_dec(PINC&
PC1))//按键-,选择日期、时间时用
#defineBAUDRATE9600//波特率
#defineF_CPU7372800//晶振频率
#defineLCD_LAMP60//LCD默认30S后关闭
#defineBATTERY_TIME5//每十分钟检测一次电池电量
#defineADC_PINA00x00//ADC0按键AD单端通道,不放大
#defineADC_PINA10x01//ADC1温度采样
#defineADC_PINA20x02//ADC2电平电量检测
#defineLCD_BACK_ONPORTC&
=~(1<
PC5)
#defineLCD_BACK_OFFPORTC|=(1<
#definebuzzer_onPORTD&
PD7)
#definebuzzer_offPORTD|=(1<
#definecharge_onPORTC&
PC6)
#definecharge_offPORTC|=(1<
#defineLOCK_ONPORTC&
PC3)
#defineLOCK_OFFPORTC|=(1<
#defineCHARGE_STATUS(PINC&
PC2))
#definenull0
#definevref5000//AD转换参考电压
#defineOVER_FLOW10//进入菜单设置时,如果在10S内没有按下任何键,则自动退出
#pragmadata:
code
//constucharmanage_card[5]={0x0b,0,0x2d,0x23,0x5f};
//住房卡-----当作管理卡
constucharmanage_card[5]={0x33,0,0x7c,0x09,0xb1};
//0008128945-----当作管理卡
//*************************************************温度测定查表****************************************************
//******************************************温度范围是:
-30度----99度*********************************************
constuinttemp_1[130]={
4304,4270,4235,4198,4161,4122,4083,4042,4001,3958,
3914,3870,3824,3778,3731,3683,3635,3585,3535,3484,
3433,3381,3329,3276,3223,3169,3116,3062,3008,2953,
2899,2844,2789,2733,2678,2622,2568,2514,2459,2405,
2353,2299,2248,2196,2145,2095,2045,1996,1948,1901,
1854,1808,1763,1719,1676,1599,1590,1549,1508,1468,
1429,1391,1354,1318,1282,1247,1214,1181,1149,1117,
1087,1057,1028,1000,973,946,920,895,870,846,
823,800,777,755,755,713,692,673,654,632,
617,600,583,567,551,536,521,506,491,478,
465,452,440,428,417,405,394,384,373,364,
354,345,335,326,318,310,302,294,286,279,
271,265,258,252,245,239,233,227,222,216,
};
//*****************************************************************************************************************
data
ucharcard_data[5][5]={
{0,0,0,0,0},//卡1
{0,0,0,0,0},//卡2
{0,0,0,0,0},//卡3
{0,0,0,0,0},//卡4
{0,0,0,0,0},//卡5
};
uchartem[7]={7,5,1,8,0,0,6};
//日期、时间、星期数组
//年/月/日/H/M/S/W
//********************************************目录结构体定义*******************************************************
structmenu_item
{
shortmenu_count;
char*display_string;
void(*subs)();
structmenu_item*children_menus;
structmenu_item*parent_menus;
};
//**********************************************结构数组声明*******************************************************
structmenu_itemmain_menu[4];
structmenu_itemalarm_menu[2];
structmenu_iteminfrared_menu[2];
structmenu_itemlamp_menu[2];
structmenu_item(*menu_point)=main_menu;
structmenu_itemcard_main_menu[4];
structmenu_itemcard_inc_menu[2];
structmenu_itemcard_dec_menu[2];
structmenu_item(*menu_card)=card_main_menu;
ucharuser_choose=0;
ucharmax_items=0;
uinttemp_value=0;
//温度检测AD值
//********************************************变量定义*************************************************************
ucharsecond_temp=0;
//秒变量
ucharscan_en=0;
//主屏扫描标志位
ucharkey=0;
//按键变量
ucharkk=0;
//按键按下标志位
ucharauto_return=0;
//菜单自动返回变量
ucharreturn_en=0;
//菜单自动返回标志位
ucharleft_right=0;
//左右键变量
ucharchoose_temp=0;
//子菜单标题变量
ucharreturn_temp=0;
//返回临时变量
ucharset_time_temp=0;
//设置时间时菜单变量,如果=1表示屏显在设置时间菜单
uchartwinkling_addr=0x91;
//设置时间时闪动显示位置变量
ucharinc_card_en=0;
//添加新卡允许变量
ucharmanage_card_inc_en=0;
//管理卡
ucharcold=0;
//温度正负极标志位
uchartemp0=0;
//温度值变量
ucharxx=88;
//温度更新变量,开机赋一个比较大的数,目的是开机就显示温度
ucharclose_read=0;
lcd_back_en=0;
//LCD背光计时变量允许
lcd_back_time=0;
//LCD背光计时变量
voiddelay_ms(unsignedintm);
//延时
voidread_adc(void);
//按键ADC处理
voiddate_time_display(void);
//时间日期显示
voidroot_directory(void);
//引导主画面
voidset_menu(void);
//设置菜单
voidclear_screen(void);
//清屏
voidclear_gdram(void);
//清全部GDRAM
voidselect_menu(uchardata1);
//选择菜单时,标志
voidtime_set_display(void);
//时间、日期设置显示
uintadc_sampling(ucharadc_input);
//ADC采样
ucharget_degree(void);
//温度查表
uchartemperature_check(void);
//室温检测
ucharcharge_tem=0;
//每十分钟,检测一次电池电量,此变量主要是计时
uintbattery_temp=0;
//电平电压变量
//************************************************函数声明区***************************************************
voidmain_menu_initial(void);
//主菜单初始化
voidalarm_menu_initial(void);
//报警菜单初始化
voidinfrared_menu_initial(void);
voidlamp_menu_initial(void);
voidmenu_initial(void);
voidcard_main_menu_initial(void);
voidcard_inc_menu_initial(void);
voidcard_dec_menu_initial(void);
voidshow_menu(void);
voiddate_time_set(void);
voidalarm_set(void);
voidinfrared_set(void);
voidlamp_set(void);
voidnullsubs(void);
voidtwinkling_addr_pro(void);
voidlcd_week_pro(void);
voidkey_inc_dec(void);
voidlcd_menu_set(void);
voidcard_pro(void);
voidbuzzer_pro(ucharp);
voidinc_new_card(void);
//添加新卡的处理函数
voidquery_card(void);
//查询卡函数
voidsave_card(void);
//保存卡时处理函数
voidno_save_card(void);
//取消保存卡时处理函数
voidclear_card(void);
//删除全部卡
voidno_clear_card(void);
//取消删除卡
voidcard_menu_show(void);
//管理卡菜单显示
voidcard_menu_pro(void);
//管理卡菜单处理
voidchar_twinkling(uchardata_1);
//字符消隐
voideeprom_write(uinteeprom_address,uchareeprom_data);
//写----EEPROM操作
uchareeprom_read(uinteeprom_address);
//读----EEPROM操作
//*************************************************主程序**********************************************************
voidmain(void)
{
PORTA=0XF8;
//PA0---按键AD;
PA1---室内温度AD;
PA2---电平电量检测
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
DDRA=0XF8;
//AD转换时要设为输入、且端口要清0
DDRB=0XFF;
DDRC=0b11111000;
DDRD=0b11110010;
//INT0、INT1、RXD设成输入;
TXD设成输出
TIMSK=(1<
OCIE1A);
//输出比较A匹配中断使能
TCCR1A=0;
TCCR1B=0X0D;
//CTC模式,1024分频
OCR1A=7200;
//定时1S
GICR=(1<
INT1)|(1<
INT0);
//打开外部中断0、1
MCUCR=(1<
ISC00);
//INT0引脚上任意的逻辑电平变化都将引发中断
ADCSRA=(1<
ADEN)|0x06;
//使能ADC,时钟64分频125KHz@8MHzsystemclock
WDTCR=0x0f;
//(1<
WDE)|(1<
WDP2)|(1<
WDP1);
//打开看门狗,溢出时间为2.1S
write_com(0x01);
//清除显示,并且设定地址指针为00H
menu_initial();
//菜单数组初始化
send_initial();
//串口初始化
WDR();
//喂狗
card_pro();
//读EEPROM,到RAM中
lcd_reset();
//LCD初始化
write_com(0x90);
buzzer_on;
LCD_BACK_ON;
//打开LCD背光
han_zi_display("
系统正在启动"
);
write_com(0x88);
请稍后......"
delay_ms(500);
clear_gdram();
//清除GDRAM--绘图RAM
clear_screen();
//清屏
buzzer_off;
//峰鸣器指示
lcd_back_en=0xaa;
//打开计时变量
lcd_back_time=0;
//计时变量清0
SEI();
//使能全局中断
while
(1)
{
WDR();
//喂狗
if(scan_en==0)//只有在scan_en=0的时候扫描主屏,平时只更新时间
{
scan_en=~scan_en;
clear_screen();
temp0=temperature_check();
//温度检测
root_directory();
}
if(second_temp!
=tem[5])//每秒钟扫描一次
second_temp=tem[5];
date_time_display();
}
if(close_read==1)
if(xx>
=5)
{
xx=0;
close_read=0;
second_temp=0;
GICR=((1<
INT0));
//开外部中断0、1
}
if(kk)//=1表示有按键按下
kk=0;
read_adc();
//AD转换,取得键值
buzzer_pro
(1);
//峰鸣器指示
LCD_BACK_ON;
//打开LCD背光
lcd_back_en=0xaa;
lcd_back_time=0;
//计时变量清0
if(key==1)
GICR&
//关闭读卡外部中断0
lcd_menu_set();
//LCD菜单设置
elseif(key==8)
=~((1<
//关闭部中断0、1
key=0;
clear_screen();
//清屏
write_com(0x80);
han_zi_display("
警告"
write_com(0x88);
版权归于军峰所有"