📄 tdw-as1110-4-590.c
字号:
//ICC-AVR application builder : 2005-02-16 12:18:59
// Target : M8
// Crystal: 6.0000Mhz
//三孔水浴控制程序
//Mg8(pb0,pb1,pb2,pb3)==> LCD (DB4,DB5,DB6,DB7)
//Mg (pb4,pb5 ) ==> LCD (R/S,E)
//用比较器和time1的输入捕获噪声抑制中断处理过零点,接PD7。
//Mg8(pd0,pd1,pd2) ==> 控制第1,2,3路加热。
//Mg8(pd5,pd6) ==> 选择第1,2,3路温度。
//ads1110,ED4,地址位为4
#include <iom8v.h>
#include <macros.h>
#include "Twi.h"
// 定义全局变量
//unsigned int temp [2];
unsigned char ib, ibb = 0;
unsigned char ibc = 0,ibcd=0; //温度采集段变量
unsigned char warmk;//第1,2,3路加热控制量
unsigned int warm_old1,warm_old2,warm_old3,warm_old4;//温度采集数据
unsigned int warmold;//温度采集数据
unsigned int warmset;//第1,2,3路温度设定值
unsigned char warm1,warm2,warm3,warm4; //温度显示
unsigned char setwarm1,setwarm2,setwarm3,setwarm4; //设定第二路值百位,十位,个位
unsigned char key_sign = 0x20; //位7延时标志,位6为是否置延时,位0键盘处理标志,
//位5为F2键按下标志 位3为调用显示标志(为1时调用)
unsigned char time_sign;//
unsigned char light = 0x83; //光标闪烁地址值
unsigned char lcd_sign=0x00;
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x3f;
DDRC = 0x00;//pc口输入
PORTC = 0x3f;//PC 0-5上拉有效即twi和按键上拉有效
PORTD = 0X00;
DDRD = 0x67;//
}
void twi_init(void)
{
TWCR= 0X00; //disable twi
TWBR= 0x0c; //set bit rate TWBR=10,TWSR=0,在6M晶振下TWI为150KHz
TWSR= 0x00; //set prescale
TWAR= 0x02; //set slave address
TWCR= 0x44; //enable twi
}
void timer1_init(void)
{
TCCR1B = 0x80; //start Timer
}
void comparator_init(void)
{
ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
ACSR = 0x44;
}
#pragma interrupt_handler timer1_capt_isr:6
void timer1_capt_isr(void)
{
ibb++;
ib++;//加热周期
if(warmk < 10)
if(ib == warmk )
PORTD &= ~0x04;//pd5=0关第3路加热
if (ib >= 10)
{
ib=0;
if(warmk > 0)//如果warm_k>0,条件判断为真,执行后面语句,开加热
PORTD |= 0x04;//开加热3
else PORTD &= ~0x04;//关加热3
}
if (key_sign & 0x40 )//如果(是否置延时标志位)置位,
{
key_sign |= 0x80;//置延时标志位
key_sign &=~ 0x40;// 清(是否置延时标志位)
}
if (ibb >= 30 )//如果有0.4秒,
{
ibb=0;
lcd_sign = 1;
}
ibcd++;
if (ibcd>4)
{ibcd = 0;
time_sign |= 0x10;
}
}
//写指令
void pr1 (unsigned char ab )
{ unsigned char bb;
bb=ab;
bb>>=4;
PORTB &=~0x10;//PB第4位清0,即R/S=0;
//PORTB &=~0x10;//PB第4位清0,即RW =0;
PORTB &= 0XF0;//PB低4位清0
PORTB |= bb; //
// DDRB |= 0X0F;//PB低4位设为输出
PORTB |= 0X20;//PB第5位置1,即E=1
;
PORTB &=~0X20;//PB第5位清0,即E=0
//bb=ab;
ab &= 0x0f; //ab高4位清0
PORTB &= 0xf0;//PB低4位清0
PORTB |= ab;//
//DDRB |= 0X0F;//
PORTB |= 0X20;//E=1
;
PORTB &=~ 0X20;//E=0
}
//写指令
//写数据
void pr2 (unsigned char ab )
{ unsigned char bb;
bb=ab;
bb>>=4;
PORTB |= 0x10;//PB第4位置1,即R/S=1;
//PORTB &=~0x10;//PB第4位清0,即RW =0;
PORTB &= 0XF0;//PB低4位清0
PORTB |= bb; //
//DDRB |= 0X0F;//PC低4位设为输出
PORTB |= 0X20;//PB第5位置1,即E=1
;
PORTB &=~0X20;//PB第5位清0,即E=0
// bb=ab;
ab &= 0x0f; //ab高4位清0
PORTB &= 0XF0;//PB低4位清0
PORTB |= ab;//
//DDRB |= 0X0F;//
PORTB |= 0X20;//E=1
;
PORTB &=~ 0X20;//E=0
}
//写数据
void delay1 ( )
{ unsigned int i;
for (i=0;i<1800;i++)
;
}
void delay ( )
{ unsigned int i;
for (i=0; i<40;i++)
;
}
//lcd初始化
void lcdon ( )
{ unsigned char i;
PORTB &=~ 0X10;//pb4=0 R/S=0
//PORTB &=~ 0X10;//RW=0
PORTB &= 0XF0;
PORTB |= 0X03;//设置8位数据总线
for (i=0;i<3;i++)
{ PORTB |= 0X20;//E=1
;
PORTB &=~ 0X20;//E=0
delay ( );
}
PORTB &= 0XF0;
PORTB |= 0X02;//设置4位数据总线
PORTB |= 0X20;//E=1;
;
PORTB &=~ 0X20;//E=0;
delay ( );
pr1 (0x28);
delay1 ( );
pr1 ( 0x01);
delay1 ( );
pr1 (0x06);
delay ( );
pr1 ( 0x0f);
delay ( );
}
//lcd初始化
//LCD显示程序
void lcd_work ( )
{
if ( key_sign & 0x20 )
{
pr1 ( 0x82);
delay ();
pr2 ( setwarm1+0x30);
delay ( );
pr2 ( setwarm2+0x30);
delay ( );
pr2 ( setwarm3+0x30);
delay ( );
pr2 ( 0x2e );
delay ( );
pr2 (setwarm4 + 0x30);
delay ( );
pr1(0xc1);
delay ();
pr2 (warm1 + 0x30);
delay ( );
pr2 (warm2 + 0x30);
delay ( );
pr2 (warm3 + 0x30);
delay ();
pr2 (0x2e );
delay ( );
pr2 (warm4 + 0x30);
delay ();
pr1 (light); //光标闪烁地址
delay ( );
pr1 (0x0f);
delay ( ); //开光标显示及闪烁
}
else {
pr1 ( 0x82);
delay ();
if (setwarm1 == 0 )
pr2 (0x20);
else pr2 ( setwarm1+0x30);
delay ( );
pr2 ( setwarm2+0x30);
delay ( );
pr2 (setwarm3 + 0x30);
delay ( );
pr2 ( 0x2e );
delay ( );
pr2 (setwarm4 + 0x30);
delay ( );
pr1(0xc1);
delay ();
if (warm1 == 0)
pr2 (0x20);
else pr2 (warm1 + 0x30);
delay ( );
pr2 (warm2 + 0x30);
delay ( );
pr2 (warm3 + 0x30);
delay ();
pr2 (0x2e );
delay ( );
pr2 (warm4 + 0x30);
delay ();
pr1 (0x0c);//关光标显示及闪烁
delay ( ); //
}
}
//LCD显示程序
//按键F1处理函数
void keyf1()
{
if (key_sign & 0x20)
{
light++;
if (light == 0x85)
light = 0x86;
if (light == 0x87)
light = 0x82;
}
}
//按键F1处理函数
//按键F2处理函数
void keyf2()
{
key_sign |= 0x20;//置F2键处理标志 key-sign第5位
light = 0x83;
}
//按键F2处理函数
//按键增加键处理函数
void keyadd()
{
if( key_sign & 0x20 )
{
switch (light )
{
case 0x82 : setwarm1++; if (setwarm1 == 1)
{ setwarm2 = 0;
setwarm3 = 0;
setwarm4 = 0;
}
if ( setwarm1 > 1) //温度十位最高为1
setwarm1 = 0 ; break;
case 0x83 : setwarm2++; if ( setwarm1 == 1)
setwarm2 = 0;
else if (setwarm2 > 9)
setwarm2 = 0; break;
case 0x84 : setwarm3++; if (setwarm1 == 1)
setwarm3 = 0 ;
else if( setwarm3 > 9 )
setwarm3 = 0; break;
case 0x86 : setwarm4++; if ( setwarm1 == 1)
setwarm4 = 0;
else if (setwarm4 > 9 )
setwarm4 = 0; break;
break;
}//switch
}//if
}
//按键增加键处理函数
//按键开始处键理函数
void keystart()
{
key_sign &=~0x20; //清F2按键标志位
warmset = setwarm1*1000 + setwarm2*100 + setwarm3*10+ setwarm4;
//把设定值传入控制部分
}
//按键开始键处理函数
//按键崭停处理函数
void keystop()
{;
}
//按键崭停处理函数
//键盘处理函数
void key_work()
{ unsigned char keydata ;
keydata = PINC ;
keydata &= 0x0f; //取低4位的值
if (keydata < 0x0f )//有键按下为真,没有键按下为假
{
if (!(key_sign & 0x01))//按键处理过为假,按键没有处理过为真
{
if (key_sign & 0x80) //位7,经过延时为真,没有经过延时为假
{ //键值处理部分
switch ( keydata )
{// case 120 : keystop( ); break;//调用F1键处理函数
case 14 : keystart( );break;//调用F2键处理函数
case 13 : keyf2( ); break;//调用开始处理函数
case 11 : keyf1( ); break;//调用开增加理函数
case 7 : keyadd( ); break;//调用崭停处理函数
break;
}
key_sign |= 0x01; //置处理标志
key_sign &= ~0x80; //清延时标志
}
else key_sign |= 0x40; //置延时要处理标志位6为1,在中断中置延时标志
}
}
else if ( key_sign & 0x01) // 键处理标志为1时为真
key_sign &= ~0x01; //清键处理标志key-sign的位0
}
//键盘处理函数
//初始化ADS1100,Twi写数据到ADS1100
unsigned char twi_write(unsigned char reg)
{
Start();//I2C启动
Wait();
if(TestAck()!=START) return 1;//ACK
Write8Bit(0x98);//写I2C从器件地址和写方式地址为4
Wait();
if(TestAck()!=MT_SLA_ACK) return 1;//ACK
Write8Bit(reg);//写数据到ADS1100,
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
Stop();//I2C停止
return 0;
}
//初始化ADS1100
//Twi读ADS1100数据,
unsigned int twi_read()
{
signed int temp2;
unsigned char temp1;
Start();//I2C启动
Wait();
Write8Bit(0x99);//写I2C从器件地址(4)和读方式
Wait();
Twi();//启动主I2C读方式
SetAck();
Wait();
temp2=TWDR;//读取I2C接收数据
temp2 <<= 8;
Twi();//启动主I2C读方式
SetAck();
Wait();
temp1=TWDR;//读取I2C接收数据
temp2+=temp1;
//temp2>>=1;//采集数据除以2
Twi();
Wait ();
temp1 = TWDR;
Stop();//I2C停止
if (temp1 & 0x80)
return 0;
else return temp2;
}
//Twi读ADS1100数据,
//数据采集函数
void cj1( )
{
if (time_sign & 0x10)
{
time_sign &= ~0x10;
warm_old1 = twi_read( );
warmold = warm_old1 + warm_old2 + warm_old3 + warm_old4;
warmold >>=4;//warmold除以16
warm_old4 = warm_old3;
warm_old3 = warm_old2;
warm_old2 = warm_old1;
}
}
//数据采集函数
//数据采集函数
void cj( )
{
if (time_sign & 0x10)
{
time_sign &= ~0x10;
warm_old1 = twi_read( );
if(warm_old2 >= warm_old1)//
{ if((warm_old2 - warm_old1)>=0x10)//
warm_old1 = warm_old2;//
}
else if((warm_old1-warm_old2)>=0x10)
warm_old1 = warm_old2;
warmold = warm_old1 + warm_old2 + warm_old3 + warm_old4;
warmold >>=4;//warmold除以16
warm_old4 = warm_old3;
warm_old3 = warm_old2;
warm_old2 = warm_old1;
}
}
//数据采集函数
//控制量计算函数
void js (void )
{
if ( warmset >= warmold )
{
if (( warmset - warmold) > 5 )
warmk = 10;
else warmk = warmset - warmold + 1;
}
else warmk = 0;
}
//控制量计算函数
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
twi_init();
timer1_init ();
comparator_init();
MCUCR = 0x00;//外部中断0中断方式,0低电平1上升和下降2下降沿3上升沿
GICR = 0x00;//不用外部中断0使能
//TIMSK = 0x01; //位0,T0溢出 位2,T1溢出 位3输出B 位4输出A
TIMSK |= 0x20;//位5 T1输入捕获 位6 T2溢出 位7 T2输出比较匹配
SEI(); //re-enable interrupts
}
void main(void)
{
init_devices();
PORTD |= 0X60;
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
twi_write (0x84 );//初始化ads1110,14b,连续转换PGA=1
lcdon ( );
lcd_work ( );
for(ibc=0;ibc<12;)
{
while(!(time_sign & 0x10));
cj1();
ibc++;
}
while (1)
{
key_work () ;
cj ();
js ();
if (lcd_sign == 1)
{ lcd_sign = 0;
warm1=warmold/1000;
warm2=(warmold-1000*warm1)/100;
warm3=(warmold-1000*warm1-100*warm2)/10;
warm4= warmold-1000*warm1-100*warm2-10*warm3;
lcd_work ( );
}
}//while
}//mail
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -