找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6186|回复: 6
打印 上一主题 下一主题
收起左侧

单片机电冰箱控制系统PCB原理图+源程序设计

  [复制链接]
跳转到指定楼层
楼主
前期是用51单片机做的,后面会更新32制作图
Altium Designer画的电路原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <reg52.h>
  4. #include <string.h>

  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. uchar code table[];
  8. uint    door;
  9. uchar   fushu;
  10. uchar   fushu1;
  11. uint    temp;
  12. uchar   ys;
  13. uchar   yskey=20;
  14. uint    n=0;

  15. sbit    RS =P2^4;
  16. sbit    WRD=P2^5;
  17. sbit    E=  P2^6;
  18. sbit    PSB=P2^1;
  19. sbit    RES=P2^3;
  20. sbit    DQ=P1^7;//ds18b20 端口
  21. sbit    ysj_0=P1^1;
  22. //sbit    ysj_1=P3^4;                 
  23. //sbit    ysj_2=P3^5;                                 
  24. //sbit    ysj_3=P3^6;        //控制继电器
  25. sbit    KEY_1 = P3^3; //上
  26. sbit    KEY_2 = P3^1; //下
  27. sbit    KEY_3 = P3^2; //
  28. sbit    KEY_4 = P1^2; // 模拟电压是否正常


  29. void    lcd_w_gzztpd(void);
  30. void    lcd_w_menkg(void);
  31. void    LCD_w_wd(uchar add2,int wwd,uchar fs);
  32. void    TransferData(char data1,bit DI);
  33. void    delayms(uint n);
  34. void    delay(uint m);
  35. void    lcd_mesg(uchar code *adder1);
  36. void    lcd_mesg2(uchar add,uchar code *adder2);
  37. void    lcd_w_hz(char address,char *hanzi);
  38. uint    ReadTemperature(void);
  39. void    Init_DS18B20(void);
  40. uchar   ReadOneChar(void);
  41. void    WriteOneChar(unsigned char dat);
  42. void    delayds(unsigned int i);
  43. uchar   key(void);
  44. void    soft_reset(void);
  45. void    znkzysj(void);

  46. uchar code table[]={
  47. "贺州学院"
  48. "--李——袁——陀--"
  49. "机电——设计——通信"
  50. "  电冰箱智能控制  "
  51. };
  52. uchar code table1[]={
  53. "预设:        ℃"
  54. "                "
  55. "当前:        ℃"
  56. "工作状态:      "
  57. };

  58. uchar code men[]={"----门已打开----"};
  59. uchar code men1[]={"----门已关闭----"};
  60. uchar code gzzt0[]={"--电冰箱工作中--"};
  61. uchar code gzzt1[]={"--电冰箱未工作--"};
  62. uchar code gzzt2[]={
  63. "制冷片工作ON or OFF"
  64. "电压是否正常!  "
  65. "正常,请检查电源"
  66. "然后重启电冰箱!"
  67. };
  68. /*********************************************************************************/
  69. void     initinal(void)           //LCD字库初始化程序
  70.           {
  71.            delay(40);             //大于40MS的延时程序
  72.            PSB=1;                 //设置为8BIT并口工作模式
  73.            delay(1);              //延时
  74.            RES=0;                 //复位
  75.            delay(1);              //延时
  76.            RES=1;                 //复位置高
  77.            delay(10);
  78.            TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
  79.            delay(100);            //大于100uS的延时程序
  80.            TransferData(0x30,0);  //Function Set
  81.            delay(37);             ////大于37uS的延时程序
  82.            TransferData(0x08,0);  //Display on Control
  83.            delay(100);            //大于100uS的延时程序
  84.            TransferData(0x10,0);  //Cursor Display Control光标设置
  85.            delay(100);            //大于100uS的延时程序
  86.            TransferData(0x0C,0);  //Display Control,D=1,显示开
  87.            delay(100);            //大于100uS的延时程序
  88.            TransferData(0x01,0);  //Display Clear
  89.            delay(10);             //大于10mS的延时程序
  90.            TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动
  91.            delay(100);            //大于100uS的延时程序
  92.                    delay(100);  //大于100uS的延时程序
  93.                    lcd_mesg(table); //显示中文汉字
  94.                    delayms(50);
  95.                lcd_mesg(table1);
  96.           }

  97. /******************************************************************************/
  98. void    main(void)
  99.      {
  100.         initinal(); //调用LCD字库初始化程序
  101.                         /* 定时、中断初始化 */
  102.             TMOD = 0x10;    // T1使用定时模式,工作模式1,无门控位
  103.             TH1 = 0x15;    // 为T1填入初值,定时时间50ms
  104.                 TL1 = 0xA0;
  105.                 ET1 = 1;    // 允许定时器1中断
  106.                 EA = 1;    // CPU开放中断
  107.                  while(1)
  108.             {
  109.                   temp=ReadTemperature();
  110.                LCD_w_wd(0x93,temp,fushu);
  111.                   ys=key();
  112.               if(ys>=20){fushu1=0;ys=ys-20;}
  113.                   else {fushu1=1;ys=20-ys;}
  114.                   znkzysj();
  115.           ys=ys*10;LCD_w_wd(0x83,ys,fushu1);
  116.           lcd_w_menkg();
  117.           //delayms(50);
  118.                   lcd_w_gzztpd();
  119.                   delayms(50);
  120.           //delayms(240);

  121.         }
  122.       }

  123. /*************************以下是12864的代码***********************************/
  124. void   lcd_mesg(uchar code *adder1)
  125. {
  126.         uchar i;
  127.         TransferData(0x80,0);  //Set Graphic Display RAM Address
  128.         delay(100);
  129.         for(i=0;i<32;i++)
  130.                 {
  131.                           TransferData(*adder1,1);
  132.                            adder1++;
  133.                 }

  134.         TransferData(0x90,0);  //Set Graphic Display RAM Address
  135.         delay(100);
  136.         for(i=32;i<64;i++)
  137.                 {
  138.                           TransferData(*adder1,1);
  139.                            adder1++;
  140.                 }
  141. }

  142. void   lcd_mesg2(uchar add,uchar code *adder2)
  143. {        uchar i;
  144.         TransferData(add,0);  //Set Graphic Display RAM Address

  145.         delay(100);
  146.         for(i=0;i<16;i++)
  147.                 {
  148.                           TransferData(*adder2,1);
  149.                            adder2++;
  150.                 }
  151. }
  152. /******************************************************************************/
  153. //温度显示处理并送入LCD的指定区域
  154. void LCD_w_wd(uchar add2,int wwd,uchar fs)
  155. {uchar te1,te2,te3;
  156.   te1=wwd/100+48;te2=(wwd/10)%10+48;te3=wwd%10+48;if(te1==48)te1=0x20;
  157.         TransferData(add2,0);
  158.         if(fs)TransferData(0x2d,1);       
  159.         else TransferData(0x20,1);
  160.         TransferData(te1,1);
  161.         TransferData(te2,1);
  162.         TransferData(0x2e,1);
  163.         TransferData(te3,1);
  164. }

  165. /******************************************************************************/
  166. void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
  167.           {
  168.             WRD=0;
  169.             RS=DI;
  170.             delay(1);
  171.             P0=data1;
  172.             E=1;
  173.             delay(1);
  174.             E=0;
  175.            }
  176. /******************************************************************************/
  177. void    delayms(uint n)            //延时10×n毫秒程序
  178.                    {
  179.                       uint i,j;
  180.                       for(i=0;i<n;i++)
  181.                          for(j=0;j<2000;j++);
  182.                    }

  183. void    delay(uint m)            //延时程序
  184.                    {
  185.                       uint i,j;
  186.                       for(i=0;i<m;i++)
  187.                          for(j=0;j<10;j++);
  188.                    }

  189. void delayds(unsigned int i)//延时函数
  190. {
  191. while(i--);
  192. }
  193. /******************************************************************************/

  194. //关门与否显示处理
  195. void lcd_w_menkg(void)
  196. {  
  197.     if(door==1) {lcd_mesg2(0x88,men);};
  198.         if(door==0) {lcd_mesg2(0x88,men1);};
  199. }
  200. /******************************************************************************/
  201. //工作状态判断
  202. void lcd_w_gzztpd(void)
  203. {   
  204.     if(KEY_4==1&&ysj_0==1) lcd_mesg2(0x98,gzzt0);
  205.         if(KEY_4==1&&ysj_0==0) lcd_mesg2(0x98,gzzt1);
  206.         if(KEY_4==0)
  207.         {ysj_0=0;TR1=0; lcd_mesg(gzzt2);
  208.         while(KEY_4==0);
  209.         soft_reset();}
  210.                                
  211. }
  212. /***********************以上是12864的代码**************************************/
  213. /*********************以下是DS18B20 的代码************************************/
  214. //18b20初始化函数
  215. void Init_DS18B20(void)
  216. {
  217. unsigned char x=0;
  218. DQ = 1;    //DQ复位
  219. delayds(8);  //稍做延时
  220. DQ = 0;    //单片机将DQ拉低
  221. delayds(80); //精确延时 大于 480us
  222. DQ = 1;    //拉高总线
  223. delayds(10);
  224. x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  225. delayds(5);
  226. }

  227. //读一个字节
  228. unsigned char ReadOneChar(void)
  229. {
  230. unsigned char i=0;
  231. unsigned char dat = 0;
  232. for (i=8;i>0;i--)
  233. {
  234.   DQ = 0; // 给脉冲信号
  235.   dat>>=1;
  236.   DQ = 1; // 给脉冲信号
  237.   if(DQ)
  238.    dat|=0x80;
  239.   delayds(5);
  240. }
  241. return(dat);
  242. }

  243. //写一个字节
  244. void WriteOneChar(unsigned char dat)
  245. {
  246. unsigned char i=0;
  247. for (i=8; i>0; i--)
  248. {
  249.   DQ = 0;
  250.   DQ = dat&0x01;
  251.   delayds(5);
  252.   DQ = 1;
  253.   dat>>=1;
  254. }
  255. delayds(5);
  256. }

  257. //读取温度
  258. unsigned int ReadTemperature(void)
  259. {
  260. unsigned char a=0;
  261. unsigned char b=0;
  262. unsigned int t=0;
  263. float tt=0;
  264. Init_DS18B20();
  265. WriteOneChar(0xCC); // 跳过读序号列号的操作
  266. WriteOneChar(0x44); // 启动温度转换
  267. delayds(200);
  268. Init_DS18B20();
  269. WriteOneChar(0xCC); //跳过读序号列号的操作
  270. WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  271. a=ReadOneChar();
  272. b=ReadOneChar();
  273. if(b&0x80)
  274.         {fushu=1;b=0xff-b;a=0xff-a;}
  275.         else fushu=0;
  276.         t=(b<<8)+a;
  277. tt=t*0.0625;
  278. t= tt*10+0.5; //放大10倍输出并四舍五入
  279. return(t);
  280. }
  281. /******************************************************************************/
  282. uchar key(void)
  283. {
  284.         if(!KEY_1)
  285. {
  286.             delay(10); //去抖
  287.                 if(!KEY_1)
  288.             { yskey++;
  289.                  if(yskey>40)yskey=40;
  290.                 }
  291. }
  292.         if(!KEY_2)
  293. {
  294.             delay(10); //去抖
  295.                 if(!KEY_2)
  296.             { yskey--;
  297.                  if(yskey<=1)yskey=1;
  298.                 }
  299. }
  300.         if(!KEY_3)door=0;else door=1;
  301. return(yskey);               
  302. }

  303. /**************************************************************************/
  304. void znkzysj(void)//智能控制制冷片工作
  305. {
  306.         if(fushu==0&&fushu1==0){if(ys<=temp/10)TR1=1;else {ysj_0=0;TR1=0;n=0;}}
  307.         if(fushu==0&&fushu1==1)TR1=1;
  308.         if(fushu==1&&fushu1==0){ysj_0=0;TR1=0;n=0;}
  309.         if(fushu==1&&fushu1==1){if(ys<=temp/10){ysj_0=0;TR1=0;n=0;}else TR1=1;}
  310. }

  311. /**************************************************************************/
  312. /* T1溢出中断处理函数 */
  313. void timer1_int() interrupt 3 using 2                // T1溢出中断,使用工作组2
  314. {
  315.         n++;
  316.         if(n!=500){   TH1= 0x15;    // 重新填入初值
  317.                        TL1= 0xA0;}
  318.         else {ysj_0=1;n=0;TR1=0;}       
  319. }

  320. /**************************************************************************/
  321. void soft_reset(void)
  322. {
  323.    ((void(code*)(void))0x0000)();
  324. }

  325. /*在需要软件复位的地方使用语句:
  326. soft_reset();      
  327. 一般可实现软件复位。*/
复制代码

所有资料51hei提供下载:
电冰箱温控器设计.rar (5.4 MB, 下载次数: 112)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:727758 发表于 2020-4-13 15:47 | 只看该作者
电冰箱的温控能细分吗,比如储物,冷藏,冷冻等
回复

使用道具 举报

板凳
ID:936592 发表于 2021-6-11 16:37 | 只看该作者
显示屏图片?
回复

使用道具 举报

地板
ID:928284 发表于 2021-6-12 08:14 | 只看该作者
楼主好技术,好生敬佩!
回复

使用道具 举报

5#
ID:67838 发表于 2022-10-25 16:48 | 只看该作者
谢谢楼主分享,果断下载学习学习,不过仿真不能通过,屏幕只显示8个零
回复

使用道具 举报

6#
ID:72050 发表于 2022-11-1 07:42 | 只看该作者
温度控制,仿真我不会调试温度
回复

使用道具 举报

7#
ID:34392 发表于 2022-11-2 19:59 | 只看该作者
不错,改造一下老冰箱可以的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表