📄 gq-1.c
字号:
#include<ht46r47.h>
// TY-Temp
// 2007-10-27 9:26
//-----------------------------------------------
// 表格
//-----------------------------------------------
const unsigned char frg[16] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
//-----------------------------------------------
#define data _pa4
#define clk _pa5
#define sda _pa6 //模拟I2C数据传送位
#define sdar _13_6
#define scl _pa7 //模拟I2C时钟控制位
#define w_address 0xa0 //定义器件在IIC总线中的地址
#define r_address 0xa1
#define port_com _pa0 //按键检测脚定义
#define port_buzzer _pb2 //蜂鸣器引脚定义
#define port_temp _pd0 //温度控制
#define ad_eoc _22_6
#define ad_start _22_7
unsigned char num1; //十六进制转十进制个位
unsigned char num2; //十六进制转十进制十位
unsigned char num3; //十六制进转十进制百位
unsigned char time_temp_keep; //进入保温状态的时间
unsigned char time_keep;
unsigned char time_temp_close; //进入关机状态的时间
unsigned char time_close;
unsigned char data_keep; //保温数据交换处
unsigned char time_15s; //15s无操作
unsigned char time_ms;
unsigned char time_sec; //秒
unsigned char time_second;
unsigned char time_delay; //延时设定
unsigned char time_delay1; //自动到烤杯计数器的延时时间
unsigned char time_delay_check; //延时操作寄存器
unsigned char temp_set; //设定温度
unsigned char time_set; //设定时间
unsigned char temp_low; //保温温度
unsigned char temp_high; //高温报警
unsigned char data_disp; //显示内容交换处
unsigned char data_key; //认为长闭合的时间
unsigned char temperature; //实际温度
unsigned char temp_check; //用于恒温比较(实际温度)
unsigned char data_buzzer; //按键音的长度
unsigned char windows; //界面
unsigned char win_delay; //P标志显示延时
unsigned char product_count; //产品计数器
unsigned char time_pid; //间歇加热90秒计时寄存器
unsigned char data_pid; //导通的宽度
unsigned char data_pid_change; //导通宽度变化的比较值
unsigned char time_alarm; //音乐报警频率
unsigned char time_alarm1; //音乐报警频率1
unsigned char alarm_count; //音乐报警短音次数
unsigned char time_high;
unsigned char data_at24;
unsigned long ad_zong;
unsigned char ad_count;
bit temp_tall_e;
bit flag_alarm; //音乐报警短音后的标志
bit flag_temp2; //实际温度与设定温度只差2度的标志
bit flag_temp15; //实际温度与设定温度只差15度的标志
bit flag_pid_90; //加热90秒没到温度的标志
bit ack; //应答标志位
bit flag_disp; //显示P的标志
bit flag_win; //开始计时清P的标志
bit flag_buzzer; //响蜂鸣器的标志
bit flag_inc; //增加键状态
bit flag_inc_check;
bit flag_dec; //减少键状态
bit flag_dec_check;
bit flag_soon; //按键长闭合的标志
bit flag_close; //加或减闭合的标志
bit flag_ok; //OK键状态
bit flag_enter; //回车键状态
bit flag_temp_on; //加热的标志
bit flag_temp_music;
bit flag_temp_reach; //实际温度达到设定温度的标志
bit flag_time_auto; //自动倒计时的标志
bit flag_set; //设定状态标志
bit flag_temp_close;
bit flag_temp_keep;
#pragma vector isr_8 @ 0x8
//-----------------------------------------------
// 4ms中断
//-----------------------------------------------
void isr_8()
{
_clrwdt();
//-----------------------------------------------
// 清蜂鸣器
//-----------------------------------------------
if(flag_alarm==0)
{
if(flag_buzzer==0)
{
if(data_buzzer==25)
{
flag_buzzer=1;
data_buzzer=0;
port_buzzer=0;
}
else
{
data_buzzer++;
}
}
}
//-----------------------------------------------
// 清蜂鸣器
//-----------------------------------------------
if(flag_alarm==1)
{
if(flag_buzzer==0)
{
if(data_buzzer==50)
{
flag_buzzer=1;
data_buzzer=0;
port_buzzer=0;
}
else
{
data_buzzer++;
}
}
}
//-----------------------------------------------
// 快速加减
//-----------------------------------------------
if(flag_soon==0)
{
if(flag_close==1)
{
data_key++;
if(data_key==250)
{
flag_soon=1;
}
}
}
else
{
flag_inc=0;
flag_dec=0;
}
//-----------------------------------------------
// 音乐报警
//-----------------------------------------------
if(flag_alarm==0&&flag_temp_music==1&&windows!=0&&windows!=1&&windows!=2&&windows!=3&&windows!=4&&windows!=5)
{
time_alarm++;
if(time_alarm==60)
{
time_alarm=0;
flag_buzzer=0;
port_buzzer=1;
alarm_count++;
if(alarm_count==4)
{
alarm_count=0;
flag_alarm=1;
}
}
}
//-----------------------------------------------
if(temp_tall_e==1)
{
time_high++;
if (time_high==240)
{
port_buzzer=1;
flag_buzzer=0;
time_high=0;
}
}
//-----------------------------------------------
//-----------------------------------------------
// 以下是1s
//-----------------------------------------------
time_ms++;
if (time_ms==250)
{
time_ms=0;
//-------------------------------
//以下为1秒
//-------------------------------
if(windows==10&&flag_time_auto==1)
{
if(time_sec!=0)
{
time_sec--;
}
else
{
flag_time_auto=0;
time_delay_check=time_delay;
flag_temp_music=1;
product_count++;
data_at24=5;
if(product_count==250)
{
product_count=0;
}
}
}
//-------------------------------
time_alarm1++;
if(time_alarm1==3)
{
time_alarm1=0;
flag_alarm=0;
}
//-------------------------------
//"P"标志清除
//-------------------------------
if (flag_win==1)
{
if (flag_disp==1)
{
win_delay++;
if(win_delay==2)
{
flag_disp=0;
flag_win=0;
}
}
}
//-------------------------------
//间歇加热
//-------------------------------
if(flag_pid_90==0)
//间歇加热时间小于90秒
{
if(flag_temp15==1 && flag_temp2==0)
//实际温度在设定温度15度附近,但小设定温度2度
{
time_pid++; //90秒间歇加热计时
if(time_pid==90)
{
flag_pid_90=1; //90秒间歇加热还没有达到设定温度置标志
}
}
}
//-----------------------------------------------
if(flag_pid_90==0)
{
data_pid_change=2; //90秒以内是加热1秒停1秒
}
else
{
data_pid_change=4; //90秒以内是加热3秒停1秒
}
//-----------------------------------------------
// 间歇加热
//-----------------------------------------------
if(flag_temp15==1 &&flag_temp2==0 && windows==0)
{
data_pid++;
if(data_pid==data_pid_change)
{
port_temp=1;
data_pid=0;
flag_temp_on=0; //清加热指示的标志
}
else
{
port_temp=0;
flag_temp_on=1; //置加热指示的标志
}
}
//------------------------------------------------
// 自动倒计时
//------------------------------------------------
if(flag_temp_reach==1&&windows==0)
{
if(time_delay_check>0)
{
time_delay_check--;
}
else
{
flag_time_auto=1;
windows=10;
time_sec=time_set;
//flag_alarm=0;
//alarm_count=0;
}
}
//------------------------------------------------
// 自动到烤杯计数器
//------------------------------------------------
if(windows==10&&time_sec==0)
{
time_delay1++;
if(time_delay1==5)
{
windows=8;
time_delay1=0;
time_sec=time_set;
}
}
//------------------------------------------------
// 自动回到实际温度显示
//------------------------------------------------
if(windows!=0&&windows!=10&&flag_set==1)
if (time_15s>=15)
{
flag_disp=0;
data_keep=temp_set;
flag_set=0;
windows=0;
data_at24=10;
}
else
{
time_15s++;
}
//-----------------------------------------------
// 自动到保温状态
//-----------------------------------------------
if(flag_set==0&&windows==8&&flag_temp_keep==0)
{
if(time_keep==time_temp_keep)
{
data_keep=temp_low;
flag_temp_music=0;
flag_temp_keep=1; //进入保温状态的标志置1
}
else
{
time_keep++;
}
}
//-----------------------------------------------
// 自动到关机状态
//-----------------------------------------------
if(flag_temp_keep==1)
{
if(time_close==time_temp_close)
{
flag_temp_close=1;
num3=0xc0;
num2=0x8e;
num1=0x8e;
}
else
{
time_second++;
if(time_second==60)
{
time_second=0;
time_close++;
}
}
}
//-----------------------------------------------
}
}
//-----------------------------------------------
// 初始化
//-----------------------------------------------
void safeguard_int() {
_intc = 0;
_tmrc = 0;
_tmr = 0;
_pac = 0xff;
_pbc = 0xff;
_pdc = 0xff;
_mp = 0x40;
}
//-----------------------------------------------
void clr_ram()
{
unsigned char i;
for (i=0;i<64;i++)
{
_iar=0;
_mp++;
}
}
//------------------------------------------------
void start()
{
_intc = 0x25;
_tmrc = 0x96; //64分频
_tmr = 0x6; //计时初值为6(满250中断一次)
_pac = 0x1;
_pbc = 0x8;
_pdc = 0;
_pa = 0x0;
_pb = 0x4;
_pd0 = 1;
}
//-----------------------------------------------
void check_at24()
{
data_at24 = read24c02(0x127);
if(data_at24!=100)
{
write24c02(180,0x0);
write24c02(30,0x1);
write24c02(150,0x2);
write24c02(190,0x3);
write24c02(10,0x4);
write24c02(20,0x5);
write24c02(5,0x6);
write24c02(0,0x7);
write24c02(100,0x127);
}
}
//-----------------------------------------------
void auto_wt()
{
if(data_at24==10)
{
data_at24=0;
write24c02(temp_set,0x0);
write24c02(time_set,0x1);
write24c02(temp_low,0x2);
write24c02(temp_high,0x3);
write24c02(time_delay,0x4);
write24c02(time_temp_keep,0x5);
write24c02(time_temp_close,0x6);
write24c02(product_count,0x7);
}
if(data_at24==5)
{
write24c02(product_count,0x7);
data_at24=0;
}
}
//-----------------------------------------------
// 延时
//-----------------------------------------------
void delay(unsigned char x) //48ms
{
unsigned char i;
while(x--)
{
for (i = 0; i<150; i++)
{
}
}
}
//===============================================
// iic总路线
//===============================================
//定时函数
void delayms(unsigned int number)
{
unsigned char temp;
for(;number!=0;number--)
{
for(temp=112;temp!=0;temp--);
}
}
//开始总线
void iic_start()
{
sdar=0;
sda=1;
scl=1;
sda=0;
scl=0;
}
//结束总线
void stop()
{
sdar=0;
scl=0;
sda=0;
scl=1;
sda=1;
}
//发acko
void noack()
{
sdar=0;
sda=1;
scl=1;
scl=0;
}
//测试ack
bit testack()
{
bit errorbit;
sda=1;
scl=1;
errorbit=sda;
scl=0;
return(errorbit);
}
//写入8个bit到24c02
write8bit(unsigned char input)
{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
sda=(bit)(input&0x80); // 一位一位的传,&80是为了有零输出零,有1输出1并屏蔽了低七位
scl=1;
scl=0;
input=input<<1;
}
}
//写入一个字节到24c02中
void write24c02(unsigned char ch,unsigned char address)
{
iic_start();
write8bit(w_address);
testack();
write8bit(address);
testack();
write8bit(ch);
testack();
stop();
delayms(10);
}
//从24c02中读出8个bit
unsigned char read8bit()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--)
{
sdar=1;
scl=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(sda));
scl=0;
}
return(rbyte);
}
//从24c02中读出1个字节
unsigned char read24c02(unsigned char address)
{
unsigned char ch;
iic_start();
write8bit(w_address);
testack();
write8bit(address);
testack();
iic_start();
write8bit(r_address);
testack();
ch=read8bit();
noack();
stop();
return(ch);
}
//-----------------------------------------------
// 移位
//-----------------------------------------------
void qdz8(unsigned char x)
{
unsigned char i, txbuf;
txbuf = x;
for(i=0;i<8;i++)
{
data = txbuf & 0x01;
clk=0;
clk=1;
txbuf=txbuf>>1;
}
}
//-----------------------------------------------
// 16-10
//-----------------------------------------------
void d_aa(unsigned char x)
{
unsigned char daa_low;
if(flag_disp==0&&flag_temp_close==0)
{
daa_low = x;
num3 = daa_low/100;
num3 = frg[num3];
daa_low = daa_low%100;
num2 = daa_low/10;
num2 = frg[num2];
num1 = daa_low%10;
num1 = frg[num1];
}
}
//-----------------------------------------------
// 显示
//-----------------------------------------------
void display()
{
if(num3==0xc0&&num2==0xc0)
{
num2=num2|0x7f;
}
if(num3==0xc0&&flag_temp_close==0)
{
num3=num3|0x7f;
}
//-----------------------------------------------
if(temp_tall_e==1)
{
num3=num3-0x80;
}
qdz8(num3);
_pa1=0;
_pa2=1;
_pa3=1;
delay(3);
_pa1=1;
delay(1);
if(flag_temp_on==1)
{
num2=num2-0x80;
}
qdz8(num2);
_pa1=1;
_pa2=0;
_pa3=1;
delay(3);
_pa2=1;
delay(1);
qdz8(num1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -