|
本程序由本人亲身调试已硬件实现,采用51单片机控制,lcd1602显示采集的数据,我的硬件是采集电压。 #include"absacc.h" #include "reg52.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define ADCOM XBYTE[0xff7c] //启动 A0=0,CS=0;RC=0; #define ADLO XBYTE[0xff7f] //读低四位 CS="0";A0=1;RC=1; #define ADHI XBYTE[0xff7d] //读高四位 CS="0";A0=0;RC=1; char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节 //void AD_pro(); //void data_pro(); void display(); void beep(); void delay0(uchar x); //x*0.14MS sbit LCD_RS = P3^0; sbit LCD_RW = P3^1; sbit LCD_EN = P3^2;
sbit STS="P3"^7; //转换标志位 uchar dis_buf; //显示缓存 uchar dis_buf1; uchar dd="0",aa=0; ulong bb,cc; uchar code cdis1[ ] = {"OUT V: "}; uchar code cdis2[ ] = {"IN V: "}; uchar data cdis4[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//uint temp,temp1,temp3; uint temp,temp1; ulong sbuff; uchar qian,bai,shi,ge; uchar display_buf[3]; uint addate[7]; uint ad_team; uchar s; uint idata result; uint temp="0"; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; /*************************************************************/ /* */ /* 延时子程序 */ /* */ /*************************************************************/ void delay(uchar x) { uchar j; while((x--)!=0) { for(j=0;j<125;j++) {;} } } /*************************************************************/ /* */ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */ /* */ /*************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P2&0x80); LCD_EN = 0; return(result); } /************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P2 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /************************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P2 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*************************************************************/ void lcd_init() { delay(15); lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay(5); lcd_wcmd(0x38); delay(5); lcd_wcmd(0x38); delay(5); lcd_wcmd(0x0c); //显示开,关光标 delay(5); lcd_wcmd(0x06); //移动光标 delay(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); } /*************************************************************/ /* */ /* 设定显示位置 */ /* */ /*************************************************************/ void lcd_pos(uchar pos) { lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 } /*************************************************************/ /* */ /* 延时 x*0.14ms */ /* */ /*************************************************************/ void delay0(uchar x) { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } /************************************************************ *转换读出AD数据 ************************************************************/ uint ad574() { ADCOM=0; while(STS==1); return((uint)(ADHI<<4)+(ADLO&0xf0)); //return(4050); } void AD_pro() //unsigned char AD_por() { for(s=0;s<8;s++) //AD采样8次 { temp="0"; result=ad574(); addate[s]=result; //采样数据保存 delay(8); } for(s=0;s<8;s++) //8次AD相加后除8求平均AD值 { ad_team=ad_team+addate[s]; } temp=(uint)ad_team/8; sbuff=(uint)(temp); sbuff=(sbuff*948)/4095; temp=(uint)sbuff; ad_team=0; }
/*********************************************************** *AD574数据处理及结果显示 ***********************************************************/ /*void data_pro() { uchar n; cdis4[3]=temp%10+0x30; temp=temp/10; cdis4[2]=temp%10+0x30; temp=temp/10; cdis4[1]=temp%10+0x30; temp=temp/10; cdis4[0]=temp+0x30; lcd_pos(0x07); //设置显示位置为第一行 for (n = 3; n > 0; n--) //高位为"0"不显示 { if (cdis4[n] == 0x30) cdis4[n] = 0x20; else break; } for(n=0;n<4;n++) lcd_wdat(cdis4[n]); }*/
void data_pro() { unsigned char n; for (n = 0; n <=2; n++) //数据转换 { cdis4[n] = temp % 10+0x30; temp = temp / 10; } cdis4[3] = temp + 0x30; for (n = 3; n > 0; n--) //高位为"0"不显示 { if (cdis4[n] == 0x30) cdis4[n] = 0x20; else break; } lcd_pos(0x07); //显示实际频率值 for(n=3;n!= 0xff;n--) lcd_wdat(cdis4[n]); }
/********************************************************** *主函数 **********************************************************/ main() { uchar m; lcd_init(); //初始化LCD lcd_pos(0); //设置显示位置为第一行 for(m=0;m<16;m++) lcd_wdat(cdis1[m]); lcd_pos(0x40); //设置显示位置为第二行 for(m=0;m<16;m++) lcd_wdat(cdis2[m]);
while(1) { AD_pro(); data_pro(); delay(10); } } |
|