|
帮助广大51hei论坛友人快速解决HX711传感器的单片机电子称的设计问题
还带开题报告与完整的设计论文,毕业党这下有救了.
制作的成品实物图:
元件清单:
元件型号 | 元件名称 | 元件标号 | 数量 | 蜂鸣器 | Bell | B1 | 1 | 10uF | 电容 | C1 | 1 | 20pF | 电容 | C2, C3 | 2 | LCD1602 | 液晶 | LCD1 | 1 | Header 2 | 电源接口 | P1 | 1 | 9012 | 三极管 | Q5 | 1 | 2.7K | 电阻 | R1 | 1 | 10K | 电阻 | R2 | 1 | SW-PB | 按键 | S1, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17, S18 | 17 | sw-灰色 | 电源开关 | SW1 | 1 | U1 | 单片机 | U1 | 1 | 12M | 晶振 | Y1 | 1 |
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
DXP格式用 Altium designer Summer 软件打开
protel99格式用 protel99SE 软件打开
PDF格式用 PDF 软件打开
Word格式用 Word 或用WPS 软件打开
4种格式的原理图都内容是一样的 只是打开方式不同
请看原理图焊接,不要看仿真图焊接。
wrod格式里面的原理图是复制出来的,有一点点变行变形,麻烦大家注意一下,尽量看其他三种格式的图焊接,
如果论文里面的原理图和原理图文件夹内的图不一样的话,请大家以原理图文件夹内的为准,原理图文件夹的图是和实物配套的,可以自己截图或复制,然后粘贴到论文里面去。
资料包含以下目录(里面很多都有详细的视频教程,非常值得大家学习)
Altium Designer Sunner画图软件学习视频\
Altium Designer Sunner画图软件安装视频\
AltiumDesignerSummer9 画图软件安装包\
C语言视频教程\
KEIL 软件安装视频\
keil4软件安装包 开发工具地址\
MCU 单片机芯片资料\
PCB图\
Protel 99 软件安装包\
Protel 99 软件安装视频\
Protel 99画图软件学习视频\
Proteus ISIS 仿真软件学习视频\
Proteus 软件安装包\
PROTEUS仿真软件的安装方法\
元件清单\
制作过程\
单片机初学者视频教程 郭天祥老师\
单片机初学者视频教程 霖锋老师\
单片机程序下载软件 STC-ISP-V4.83\
原理图 电子称\
原理图 电子称 没有字\
参考论文\
实物照片\
工程新建 程序下载 视频教程\
开发工具地址 keil4软件安装包\
开题报告\
操作视频地址\
毕设答辩技巧\
焊接注意事项和调试讲解\
程序\
答辩常见问题解答\
设计资料\
使用前必读.doc
原理图 打开方式.txt
基于单片机的电子秤系统设计任务书.doc
电子秤文献翻译.doc
程序打开方法.txt
单片机源程序如下:
- #include <reg52.h> //调用单片机头文件
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- #define ulong unsigned long
- #include<intrins.h>
- uchar code table_num[]="0123456789abcdefg";
- sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit e =P1^2; //片选信号 下降沿触发
- sbit hx711_dout=P2^1;
- sbit hx711_sck=P2^0;
- sbit beep = P1^3; //蜂鸣器
- long weight;
- uint temp,qi_weight;
- bit chaozhong_flag;
- bit leiji_flag;
- bit flag_300ms ;
- ulong price,z_price; //单价 总价
- uchar flag_p;
- /***************
- 删除键
- 去皮
- 价格清零
- ***************/
- /******1ms延时函数***12M晶振**************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /********************************************************************
- * 名称 : delay_uint()
- * 功能 : 小延时。
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /********************************************************************
- * 名称 : write_com(uchar com)
- * 功能 : 1602命令函数
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /********************************************************************
- * 名称 : write_data(uchar dat)
- * 功能 : 1602写数据函数
- * 输入 : 需要写入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602上显示这字符函数************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- /***********************lcd1602初始化设置************************/
- void init_1602() //lcd1602初始化设置
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- }
- ////////////////在指定位置显示指定字符//////////
- void write_zifu(uchar hang,uchar add,uchar dat)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(dat);
- }
- /********************************************************************
- * 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
- * 功能 : 显示价格
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void write_sfm4_price(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/1000%10);
- write_data(0x30+date/100%10);
- write_data('.');
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /****************开机液晶显示函数 初始化液晶的内容********************************/
- void init_1602_dis_csf() //初始化液晶
- {
- write_string(1,0," W:0.000kg ");
- write_string(2,0,"P:00.00 Z:00.00");
- write_zifu(2,7,0x5c); //¥
- // write_zifu(2,15,0x5c); //¥
- }
- /*******************压力显示程序***********************/
- void write_1602_yl(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/1000%10);
- write_data('.');
- write_data(0x30+date/100%10);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
-
- }
- void Delay__hx711_us(void)
- {
- _nop_();
- _nop_();
- }
- ulong ReadCount(void) //增益128
- {
- ulong count,value = 0;
- uchar i;
- hx711_dout=1;
- Delay__hx711_us();
- hx711_sck=0;
- count=0;
- while(hx711_dout) ;
- for(i=0;i<24;i++)
- {
- hx711_sck=1;
- count=count<<1;
- hx711_sck=0;
- if(hx711_dout)
- count++;
- }
- hx711_sck=0;
- Delay__hx711_us();
- hx711_sck=1;
- return(count);
- }
- void get_pizhong() //获取皮重,秤盘重量
- {
- ulong hx711_dat;
- hx711_dat=ReadCount(); //HX711AD转换数据处理
- temp=(uint)(hx711_dat/100);
- }
- void get_weight() //获取被测物体重量
- {
- ulong hx711_data,a;
- uint get,aa;
- hx711_data=ReadCount(); //HX711AD转换数据处理
- get=(uint)(hx711_data/100);
- if(get>temp)
- {
- a=ReadCount();
- aa=(uint)(a/100)-temp;
- weight=(uint)((float)aa/4.9+0.05);//重量转换函数,传感器型号不同此函数要适当修改
- }
- }
- /************************************************/
- /* 由于称重传感器线性度参数的不同,而对获得的重量数据处理,
- 此处可能会根据不同称重传感器,程序的代码会有所不同 */
- /************************************************/
- /*************定时器0初始化程序***************/
- void time_init()
- {
- EA = 1; //开总中断
- TMOD = 0X01; //定时器0、定时器1工作方式1
- ET0 = 1; //开定时器0中断
- TR0 = 1; //允许定时器0定时
- }
- /********************独立按键程序*****************/
- uchar key_can; //按键值
- void key() //独立按键程序
- {
- static uchar key_new = 0, key_l;
- key_can = 20; //按键值还原
- P3 = 0x0f;
- if((P3 & 0x0f) != 0x0f) //按键按下
- {
- delay_1ms(1); //按键消抖动
- if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
- { //确认是按键按下
- key_new = 0;
- key_l = P3 | 0xf0; //矩阵键盘扫描
- P3 = key_l;
- switch(P3)
- {
- case 0xee: key_can = 1; break; //得到按键值
- case 0xde: key_can = 4; break; //得到按键值
- case 0xbe: key_can = 7; break; //得到按键值
- case 0x7e: key_can = 10; break; //得到按键值
-
- case 0xed: key_can = 2; break; //得到按键值
- case 0xdd: key_can = 5; break; //得到按键值
- case 0xbd: key_can = 8; break; //得到按键值
- case 0x7d: key_can = 0; break; //得到按键值
-
- case 0xeb: key_can = 11; break; //得到按键值
- case 0xdb: key_can = 9; break; //得到按键值
- case 0xbb: key_can = 6; break; //得到按键值
- case 0x7b: key_can = 3; break; //得到按键值
-
- case 0xe7: key_can = 15; break; //得到按键值
- case 0xd7: key_can = 14; break; //得到按键值
- case 0xb7: key_can = 13; break; //得到按键值
- case 0x77: key_can = 12; break; //得到按键值
- }
- beep = 0; //蜂鸣器叫一声
- delay_1ms(100);
- beep = 1;
- }
- }
- else
- key_new = 1;
- }
- /************按键控制函数*************/
- void key_with()
- {
- if(key_can <= 9) //数字键
- {
- if(flag_p >= 4)
- {
- flag_p = 0;
- }
- if(flag_p == 0)
- price = key_can;
- else
- {
- price = price * 10 + key_can;
- }
- write_sfm4_price(2,2,price); //显示单价
- flag_p ++;
- }
- if(key_can == 15) //删除键
- {
- if(price != 0 )
- {
- flag_p --;
- price /= 10; //删除
- write_sfm4_price(2,2,price);//显示单价
- }
- }
- if(key_can == 14) //去皮
- {
- get_pizhong(); //获取皮重,秤盘重量
- }
- if(key_can == 13) //价格清零
- {
- flag_p = 0;
- price = 0;
- write_sfm4_price(2,2,price);//显示单价
- }
- }
- /*****************主函数********************/
- void main()
- {
- beep = 0; //蜂鸣器叫一声
- delay_1ms(100);
- P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1
- time_init(); //初始化定时器
- init_1602(); //lcd1602初始化
- init_1602_dis_csf(); //lcd1602初始化显示
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供打包下载:
## 电子称 16键 1602.rar
(12.17 MB, 下载次数: 805)
|
评分
-
查看全部评分
|