📄 控制系统.c
字号:
{// 图片数字9
0x01,0xFE,0x00,0x07,0xC7,0x80,0x0F,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x00,0xF0,0x3E,
0x00,0xF8,0x3C,0x00,0x78,0x3C,0x00,0x78,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,
0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x3C,0x00,0xFC,0x3E,0x00,0xFC,0x3E,0x01,0xFC,
0x1F,0x03,0xFC,0x1F,0x8F,0xFC,0x0F,0xFF,0x7C,0x03,0xFC,0x7C,0x00,0x00,0x7C,0x00,
0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF0,0x00,0x01,0xF0,0x0F,0x01,
0xE0,0x1F,0x01,0xE0,0x1F,0x03,0xC0,0x1F,0x07,0x80,0x0F,0x9F,0x00,0x03,0xFC,0x00}};
/*========================== 标记及点图片(宽度x高度=16*16)===========================*/
uchar code running[7][32]={
{// 警报标记16*16
0x00,0x00,0x00,0x39,0x00,0x7B,0x00,0xFE,0x01,0xDC,0x0F,0x98,0x0F,0x18,0x0C,0x1F,
0x0C,0x1F,0x0F,0x18,0x0F,0x98,0x01,0xDC,0x00,0xFE,0x00,0x7B,0x00,0x39,0x00,0x00,},
{// 闹铃开启标记16*16
0x00,0x00,0x00,0x40,0x00,0xE0,0x01,0xB0,0x01,0xB0,0x03,0x18,0x03,0x18,0x06,0x0C,
0x0C,0x06,0x0C,0xE6,0x1B,0x1B,0x0C,0x06,0x06,0x0C,0x03,0xF8,0x00,0xE0,0x00,0x00},
{// 键盘锁标记16*16
0x00,0x00,0x01,0xF8,0x03,0xFC,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0xFC,0x06,0x96,
0x0E,0xA7,0x0E,0xC7,0x0E,0xA7,0x0E,0x97,0x07,0xFE,0x03,0xFC,0x01,0xF8,0x00,0x00,},
{// 温度计标记16*16
0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
0x01,0x90,0x01,0x98,0x01,0x9C,0x01,0x9E,0x01,0x9C,0x00,0x18,0x00,0x10,0x00,0x00},
{// 模式3点16*16
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{// 模式2点16*16
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{// 篮球器运行标记16*16
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x90,
0x01,0x98,0x01,0x9C,0x01,0x9E,0x01,0x9C,0x01,0x98,0x01,0x90,0x00,0x00,0x00,0x00}};
/*========================== 菜单按钮图片(宽度x高度=16*8)============================*/
uchar code menu_key[]=
{//菜单按钮
0x7F,0xFE,0x81,0x81,0x83,0xC1,0x87,0xE1,0x8F,0xF1,0x9F,0xF9,0x80,0x01,0x7F,0xFE};
/*=====================================================================================
函数名称:定时器中断处理与初始化,延时
功能描述:时钟更新、篮球器计时
全局变量:time_tick、time_tick1、resu[2]、resu[3]、resu[4]、temp_delay、temp_min
参数说明:无
返回说明:t0_isr(中断标记)、b20time(温度更新标记)
设 计 人:LIJH
版 本:1.0
说 明:
======================================================================================*/
/*延时(一次10个机器周期不等) 参数格式:延时数*/
void delay(unsigned int det)
{
while(det--);
}
/*1s延时*/
void delay_pw()
{
delay(60000);
delay(60000);
}
/*6个周期 6us */
void delay_b20(uchar n)
{
while(n--);
}
/*主时钟中断处理*/
void time0_isr(void) interrupt TF0_VECTOR using 1
{
TR0=0;
TL0=(time_count&0x00FF);
TH0=(time_count>>8);
TR0=1;
if(--time_tick) return;
time_tick=20;
t0_isr=1;
if(nba_tim&!oth_run) // 当在篮球器界面时 nba_tim==1、oth_run==0
{
if(resu[3]==0)
{
resu[3]=59;
if(resu[2]>0) resu[2]--;
}
else resu[3]--;
if(resu[2]==0&resu[3]==0) // 比赛时间到后停止
{
TR0=0;TR1=0;EA=0;
}
return;
}
if((++temp_min)==60) // 实现温度的更新
{
temp_min=0;
temp_delay--;
if(temp_delay==0)
{
b20time=1;temp_delay=5;
}
}
}
/*24时钟中断处理*/
void time1_isr(void) interrupt TF1_VECTOR using 2
{
TR1=0;
TL1=(time_count&0x00FF);
TH1=(time_count>>8);
TR1=1;
if(--time_tick1) return;
time_tick1=20;
if(resu[4]>0)resu[4]--; // 篮球器24秒中断
t0_isr=1;
if(resu[4]==0)
{ TR0=0;TR1=0;EA=0;}
}
/*定时器初始化*/
void time_init()
{
EA=0;
TR0=0;
TR1=0;
TMOD=0x11;
TL0=(time_count&0x00FF);
TH0=(time_count>>8);
TL1=(time_count&0x00FF);
TH1=(time_count>>8);
IE=0;
ET0=1;
ET1=1;
}
/*=====================================================================================
函数名称:LCD驱动
功能描述:基本驱动(写1个字节、清屏、初始化)
全局变量:无
参数说明:dat_comm(0:命令 1:数据),content(数值)
返回说明:无返回值
设 计 人:LIJH
版 本:1.0
说 明:
======================================================================================*/
/*检查忙碌位*/
void chk_busy (void)
{
lcd_data = 0xff;
lcd_rs = 0; // 命令
lcd_rw = 1; // 读
lcd_e = 1;
while(busy==1);
lcd_e = 0;
}
/*写LCD 参数格式:0:命令,1:数值 ,数据*/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();
lcd_rs=dat_comm;
lcd_rw = 0; // 写
lcd_data=content; // 输出数据或命令
lcd_e=1;
lcd_e=0;
}
/*清绘图*/
void clrgdram(void)
{
uchar i,j;
for(j=0;j<32;j++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+j);
wr_lcd(comm,0x80);
wr_lcd(comm,0x30);
for(i=0;i<32;i++)
wr_lcd(dat,0x00); // 写入0x00
}
wr_lcd(comm,0x36);
}
/*清除显示*/
void clear_dis(void)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x01); // 清屏,地址指针指向00H
clrgdram(); // 请绘图RAM
}
/*开机LCD初始化*/
void init_lcd (void)
{
lcd_rst=1;
wr_lcd(comm,0x30); // 30---基本指令动作
wr_lcd(comm,0x06); // 光标的移动方向
wr_lcd(comm,0x0c); // 开显示,关游标
clear_dis();
}
/*=====================================================================================
函数名称:DS1302驱动
功能描述:基本驱动(读写数据、读写日期,时间、初始化)
全局变量:无
参数说明:w_adder(写地址),r_adder(读地址),w_data(写入数据)
返回说明:返回读取的数据
设 计 人:LIJH
版 本:1.0
说 明:上升沿写入数值,下降沿读出数值,没用设立后背电池充电
======================================================================================*/
/*向1302写数据 参数格式:地址,数据*/
void w1302(uchar w_adder,uchar w_data)
{
uchar d;
ret_ds1302();
for(d=0;d<16;d++)
{
if(d==8) w_adder=w_data;
d02_data=(bit)(w_adder&0x01);
d02_sclk=0; // 上升沿
w_adder>>=1;
d02_sclk=1;
}
end_ds1302();
}
/*接收1302一个字节的数据 参数格式:读地址*/
uchar r1302(uchar r_adder)
{
uchar d=0;
ret_ds1302();
for(d=0;d<8;d++) // 写地址
{
d02_data=(bit)(r_adder&0x01);
d02_sclk=0;
r_adder>>=1;
d02_sclk=1;
}
r_adder=0;
for(d=0;d<8;d++) // 读数据
{
d02_data=1;
d02_sclk=1; // 下降沿
r_adder>>=1;
d02_sclk=0;
if(d02_data) r_adder|=0x80;
}
end_ds1302();
return(r_adder);
}
/*写入时间与日期*/
void wds1302_time_date(void)
{
w1302(d02_wrc,0x00); // 写允许
w1302(0x90,0xa5); // 单二极管2K电阻充电
w1302(d02_year,today.year); // 年
w1302(d02_weeks,today.week); // 星期
w1302(d02_month,today.month); // 月
w1302(d02_day,today.day); // 日
w1302(d02_hour,0x7f&now.hour); // 时
w1302(d02_minute,now.minute); // 分
w1302(d02_second,0x7f&now.second); // 秒
w1302(d02_wrc,0x80); // 写禁止
}
/*初始化写DS1302 RAM*/
void init_wds1302_ram(void)
{
w1302(d02_wrc,0x00);
w1302(0x90,0xa5); // 单二极管2K电阻充电
w1302(d02_signs,0x00); // 状态寄存
w1302(d02_passw,0x74); // 密码储存首位
w1302(d02_passw+2,0x14); // 初始值为:741456
w1302(d02_passw+4,0x56); // 密码最后一位
w1302(d02_alm,0x12); // 闹铃时(12小时)
w1302(d02_alm+2,0x00); // 闹铃分(0分)
w1302(d02_temp,0xff); // 温度上限(255为关闭)
w1302(d02_temp+2,0xff); // 温度下限(关闭)
w1302(d02_initsi,0xb4); // 是否要初始化标记(0xb4为已经初始化)
w1302(d02_wrc,0x80);
}
/*写DS1302一字节的RAM*/
void wds1302_data(uchar adder,uchar _data)
{
w1302(d02_wrc,0x00);
w1302(adder,_data);
w1302(d02_wrc,0x80);
}
/*读取日期*/
void rds1302_date(void)
{
today.year=r1302(d02_year+1);
today.week=r1302(d02_weeks+1);
today.month=r1302(d02_month+1);
today.day=r1302(d02_day+1);
}
/*读取时间*/
void rds1302_time(void)
{
now.hour=(r1302(d02_hour+1));
now.minute=r1302(d02_minute+1);
now.second=r1302(d02_second+1);
if(now.hour==alarm_time[0]&&now.minute==alarm_time[1]) alm_run=1;
else // 闹铃时间比较
{
alm_run=0;buzstop=0;buzzer=close;
}
}
/*开机读数据*/
void rds1302_data(void)
{
signs=r1302(d02_signs+1);
alarm_time[0]=r1302(d02_alm+1);
alarm_time[1]=r1302(d02_alm+3);
als_temp[0]=r1302(d02_temp+1);
als_temp[1]=r1302(d02_temp+3);
}
/*DS1302初始化*/
void init_ds1302(void)
{
wds1302_time_date();
init_wds1302_ram();
}
/*=====================================================================================
函数名称:DS18b20驱动
功能描述:基本驱动(读写数据、数据转换、初始化)
全局变量:无
参数说明:无
返回说明:返回读取的数据
设 计 人:LIJH
版 本:1.0
说 明:调试中。。。
======================================================================================*/
/*18B20初始化*/
void init_ds18b20()
{
b20_io=1;
b20_io=0;
delay_b20(120); // 延时≥480us
b20_io=1;
delay_b20(12); // 拉高为高电平后在15—60us出现低电平,并维持60—240us
ds18b20=~b20_io;
delay_b20(40);
}
/*向18B20发送一个字节*/
void send18b20_byte(uchar data_send)
{
uchar d=0;
for (d=0;d<8;d++)
{
b20_io=0; // 拉低电平后向总线写入一个位,15us后18B20接收
b20_io=data_send&0x01;
delay_b20(10); // 延时60us后完成一次
b20_io=1;
data_send>>=1; // 下位开始
}
}
/*从18B20读出温度值 12位分辨率*/
void receive18b20(void)
{
uchar n=1,d;
for (d=0;d<16;d++)
{
if(d==8) n=0;
b20_io=0; // 拉低总线
temp.t_data[n]>>=1;
b20_io=1; // 拉高总线
if(b20_io) // 读入总线数值
temp.t_data[n]|=0x80;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -