本帖最后由 1045878760 于 2018-7-1 11:19 编辑
全部手写输入,求加精,求回帖,这样我才会有更多的动力继续分享更好的设计经验。 这是一个温控器产品的设计实例,设计已经产品化,进入了量产阶段。
这个设计已经做成成品了
本文旨在学习与交流,如果大家对本文有兴趣,可以去淘宝购买配套的电路板成品,用于当实验板学习开发测试,在淘宝上搜索关键字“HTC-10 电路板”,即可找到。
不磨叽,上图
Mcu的选择原来的设计的mcu采用了stm8s003f3,后来这ic价格大涨,从1.3元狂飙到4元,后来我将它换成新唐n76e003,结果发现新唐这芯片实在是超强的啊,比起原来的stm8s003f3,它的AD精度竟然是12位的,这使得在设计温度计时有更好的温度检测精度,大爱啊!
N76E003 和 STM8S003F3 的管脚图对比
根据管脚对比,可以看出硬件是兼容的,但是软件需要更改
N76E003
和 STM8S003F3
的特性对比
液晶驱动的选择段式液晶由于其功耗低、价格便宜在很多家电中得到广泛的应用,其驱动其实并不复杂,大多是情况下都是用HT1621B进行驱动。
HT1621是128 点内存映象和多功能的LCD驱动器HT1621 的软件配置特性使它适用于多种LCD应用场合包括LCD模块和显示子系统用于连接主控制器和HT1621的管脚只有4 或5 条HT1621 还有一个节电命令用于降低系统功耗。在使用HT1621进行驱动时,首先得根据订做的液晶进行原理设置。驱动液晶实际上就是往HT1621的内部寄存器中写数据,至于数据如何去驱动液晶我们可以不去理会它。下面也一款订做的液晶为例进行说明:
液晶的逻辑图
液晶的显示实例图样
HT1621的驱动程序参考//1 led1 p05//2 data p06//3 wr p07//10 cs p15void ini_io_lcd(void){ P05_PushPull_Mode; P06_PushPull_Mode; P07_PushPull_Mode; P15_PushPull_Mode; clr_P05; clr_P06; clr_P07; clr_P15;}
//
锁定显示数据 3v=300khz=0.3M=3.3us 5v=500khz=0.5M=2us 16M=1/16us delay(40/16)=2.5us
参考ht1621b
串行数据时钟void lock_data(void){ delay(40); LCD_WR_0 ; delay(40); LCD_WR_1 ; delay(40);}//
移位送8
位数据void shift(uchar i){ uchar j ; for(j = 0; j < 8; j++) { if(i & 0x80)LCD_DATA_1 ; else LCD_DATA_0 ; lock_data(); i <<= 1 ; }}//
移位送n
位数据void shift2(uchar i, uchar n){ uchar j ; for(j = 0; j < n; j++) { if(i & 0x80)LCD_DATA_1 ; else LCD_DATA_0 ; lock_data(); i <<= 1 ; }
}
//
写命令void disp_cmd(uchar cmd){ //uchar i=0 ; LCD_CS_0 ; LCD_DATA_1 ; lock_data(); LCD_DATA_0; lock_data(); LCD_DATA_0 ; lock_data(); shift(cmd); //
空数据 lock_data(); LCD_CS_1 ;}void beep(uchar t){ if(BeeEn) { disp_cmd(0x09); beep_time = t ; }}void beep3(void){ beep_count = 3; beep_delay = 1;}uchar disp_hi(uchar temp){ return num[temp/10%10];}
uchar disp_low(uchar temp){ return num[temp%10];}
uchar disp_hi2(uchar temp){ return num2[temp/10%10];}
uchar disp_low2(uchar temp){ return num2[temp%10];}
//
写全部数据void disp_all(void){ uchar i = 0 ; LCD_CS_0 ; //101,addr=0 LCD_DATA_1 ; lock_data(); shift(0x40); for(i = 0; i < 4; i++) { shift(DisBuf); DisBuf = 0x00 ; } shift2(DisBuf[4], 4); for(i = 5; i < 16; i++) { shift(DisBuf); DisBuf = 0x00 ; } LCD_CS_1 ;}
//
初始化显示void Ini_Disp(void){ disp_cmd(0x00); //
关闭系统振荡器与LCD
偏压器 disp_cmd(0x18); //
系统时钟源,片内RC
振荡器 disp_cmd(0x80); //IRQ
输出失效 disp_cmd(0xa7);//? //
时基wdt
输出 disp_cmd(0x01); //
打开系统振荡器 disp_cmd(0x29); //1/3
偏压,4
个公共口 disp_cmd(0x03); //
打开偏压发生器 disp_cmd(0x08); //
关闭声音输出 disp_cmd(0x60); //2kHZ
声音}
void disp(void){ uchar temp; uchar d1, d2, d3, d4, d5, d6, d7, d8, d9; uchar TT1, TT2, TT3, TT4, TT5, TT6, TT7, TT8, TT9, TT10, TT11, TT12,TT13, TT14, TT15, TT16, TT17, TT18;
....................................................................................
if(ACFg)TT9 = 1;
temp = 0; //0 if(d6 != 99)temp |= num2[d6];//led6 if(T2dot)temp |= 0x08; //5p . DisBuf[0] = temp;
temp = 0; //1 if(d5 != 99)temp |= num2[d5];//led5 if(TT14)temp |= 0x08; DisBuf[1] = temp;
temp = 0; //2 if(d4 != 99)temp |= num2[d4];//led4 if(TT15)temp |= 0x08;//T15
启动温度 DisBuf[2] = temp;
temp = 0; //3 if(TT1)temp |= 0x01;//T1
实测温度 if(TT4)temp |= 0x08;//T4 C if(TT2)temp |= 0x02;//T2
暖 if(TT3)temp |= 0x04; //T3
冷 if(TT5)temp |= 0x10;//T5
温度控制 if(TT6)temp |= 0x20;//T6
间隙控制 if(TT7)temp |= 0x40;//T7
倒计时开 if(TT8)temp |= 0x80;//T8
倒计时关 DisBuf[3] = temp;
temp = 0; //4 if(TT10)temp |= 0x10; //T10
停止温度 if(TT11)temp |= 0x20; //T11 c if(TT13)temp |= 0x80; //h if(TT12)temp |= 0x40; DisBuf[4] = temp;
temp = 0; //5 if(d1 != 99)temp |= num[d1];//led1 DisBuf[5] = temp;
temp = 0; //6 if(d2 != 99)temp |= num[d2];//led2 DisBuf[6] = temp;
temp = 0; //7 if(d3 != 99)temp |= num[d3];//led3 if(T1dot)temp |= 0x80; //2p . DisBuf[7] = temp;
temp = 0; //8 if(TT9)temp |= 0x80;//T9 AC if(d7 != 99)temp |= num[d7];//led7 DisBuf[8] = temp;
temp = 0; //9 if(d8 != 99)temp |= num[d8];//led8 DisBuf[9] = temp;
temp = 0; //10 if(d9 != 99)temp |= num[d9];//led9 if(T3dot)temp |= 0x80; //8p . DisBuf[10] = temp;
temp = 0; //11 if(TT16)temp |= 0x10;//T16 C if(TT18)temp |= 0x40;//T18 min if(TT17)temp |= 0x20;//T17
关 DisBuf[11] = temp;
disp_all();}
一周热门 更多>