完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我焊接的电路都是通的,1602能显示,电子称的程序也下去,1602就有黑格子,不知道是不是AD转换模块自己焊的时候焊得不好,大家帮我看一下程序,谢谢
#include #include #define uint unsigned int #define uchar unsigned char uchar i,ms,p,s; void Delay_us(unsigned char j); void Delay_ms(unsigned char i); unsigned long ReadAD(void); unsigned long xx,x,y; //重量数值返回(十六进制) unsigned char xx2=0x30; //多少单位重量数值 为0.1g unsigned long xx3=0x82BD9A; //零点值(十六进制) unsigned char xx4; ***it ADDO=P2^2; ***it ADSK=P3^6; bit key_4z; ***it rs=P3^5; ***it rw=P3^4; uchar c[]; uchar tab[]="0123456789"; unsigned long dat[]; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delayus(uint k) { for(;k>0;k--); } void write1602_com(uchar deman) { P0=deman; rs=0; rw=0; delay(2); rw=1; delay(5); rw=0; } void write_dat(uchar dat) { P0=dat; rs=1; rw=0; delay(2); rw=1; delay(5); rw=0; } void init(void) { delayus(15); write1602_com(0x38); delayus(5); write1602_com(0x38); delayus(5); write1602_com(0x38); write1602_com(0x38); write1602_com(0x08); write1602_com(0x01); write1602_com(0x06); write1602_com(0x0c); } void Delay_ms(unsigned char i) { do{ Delay_us(0); i--; } while(i); } //-------------------------------------------------------------------------- //函数名称: Delay_us() //函数功能: 延时( 2*J+2)微秒 //其他说明: //-------------------------------------------------------------------------- void Delay_us(unsigned char j) { do{j--;} while(j); } void delay_50ms(uint z) { uint x; for(;z>0;z--) for(x=6245;x>0;x--); } void delay_50us(uint k) { uint j; for(;k>0;k--) for(j=19;j>0;j--); } void display() { /*if(key_4z) c[0]=tab[11]; */ //为负加"-"前缀(tab[xx/10000]); //串口发送ASCII码十进制千位 c[5]=tab[xx/10000]; //串口发送ASCII码十进制百位 xx=xx%10000; c[6]=tab[xx/1000]; //串口发送ASCII码十进制十位 xx=xx%1000; c[7]=tab[xx/100]; xx=xx%100; xx=xx ; c[8]=tab[xx/10]; /* c //串口发送ASCII码十进制个位 c[4]=tab[10]; //小数点 c[5]=(tab[xx%10]);*/ //串口发送ASCII码十进制小数位 init(); write1602_com(0x80); for(i=0;i<16;i++) { write_dat(c[i]); delay(5); } } void main() { uchar i; delay_50ms(4); for(i=0;i<5;i++) { xx4=xx2; //备份g换算值 xx2=1; //取消g换算 xx3=0; //零点值置零 xx3=ReadAD(); //取得新的零点值 xx2=xx4; delay_50ms(1); } delay_50ms(2); while(1) { unsigned int temp,j,min; unsigned long yy=0,yy1=0; for(i=0;i<6;i++) { dat[i]=ReadAD();delay_50ms(2); } for(i=0;i<6;i++) { min=i; for(j=i+1;j<6;j++) if(dat[j] temp=dat[min]; dat[min]=dat[i]; dat[i]=temp; } for(i=3;i<5;i++) { yy=dat[i]; yy1+=yy; } xx=yy1/2; display(); delay_50ms(2); } } unsigned long ReadAD(void) { unsigned long Count; unsigned char j; ADSK=0; // 使能AD(PD_SCK 置低) ADDO=1; //51CPU 准双向I/0 输入使能 Count=0; //在这里一直等待有数据程序才会向下执行,即ADDO为低电平 while(ADDO); // 判断AD转换是否结束,若未结束则等待否则开始读取 for(j=24;j>0;j--) { ADSK=1; //PD_SCK 置高(发送脉冲) Count=Count<<1; //每个高电平到低电平的下降沿来时,变量count左移一位,右侧补零 ADSK=0; //PD_SCK 置低 if(ADDO)Count++; } ADSK=1; Count=Count^0x800000; //第25个脉冲下降沿来时,转化数据。Count与0x800000按位做xor运算。 ADSK=0; //我是用的B通道 //B通道 信号线是B+,B- A通道 信号线是S+,S- //A通道 把下面这句删了Delay_us(1);ADSK=1;Delay_us(1);ADSK=0; // // if (Count > xx3) { Count=(Count - xx3)/xx2;//值为正_根据 重量数值 计算出有多少个0.1g (十六进制) key_4z=0; //正负标志复位,表示值为正 } else { Count=(xx3 - Count)/xx2;//值为负_根据 重量数值 计算出有多少个0.1g (十六进制) key_4z=1; //正负标志置位,表示值为负 } return(Count); } |
|
相关推荐
3个回答
|
|
有人可以帮我看一下吗?程序有问题吗?
|
|
|
|
|
|
好长,不想看了,显示是没有错误的话,说明语句不是自己想要的
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STC32G8K64 单片机 的P00(ADC8)脚短路到GND 会死机,怎么解决?
794 浏览 1 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-Linux C接口编程入门之ioctl操作
883 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十七章 machine.WDT类实验
576 浏览 0 评论
1158 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-通用文件I/O模型之close
1332 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11491 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-20 00:59 , Processed in 0.424830 second(s), Total 40, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号