/***************************************************************************
晶振:11.0592M
跳線設置:跳線設置:J2的34端插上跳線帽
這個程序的上位機就用附帶串口調試程序,在51hei單片機開發(fā)板上實驗成功,發(fā)送01后
旋動電壓調整電位器RP2,當前電壓即可顯示在串口調試程序的接受區(qū)如上圖
單片機上電后等待從上位機發(fā)送來的命令,同時在數(shù)碼管的前三位以十進制方式顯
示A/D采集的數(shù)值,在未收到上位機發(fā)送來的啟動A/D轉換命令之前數(shù)碼管始終顯示000。
當收到上位機以十六進制發(fā)送來的01后,向上位機發(fā)送字符串“Turn on ad!”,同時
間隔一秒讀取一次A/D的值,然后把A/D采集回來的8位二進制數(shù)轉換為十進制數(shù)表示的
實際電壓浮點數(shù)。并且從串口發(fā)送給上位機,形如“The voltage is 3.398438V”,發(fā)送周
期也是一秒一次,同時在數(shù)碼管上也要每秒刷新現(xiàn)在的數(shù)值。
當收到上位機以十六進制發(fā)送來的02后,向上位機發(fā)送字符串“Turn off ad!”,然后
停止發(fā)送電壓值,數(shù)碼管上顯示上次結束時保持的值。
當收到上位機發(fā)來的其他任何數(shù)時,向上位機發(fā)送字符串“Error!”。
*****************************************************************************/
由于代碼太長篇幅有限本文只列出了部分代碼,完整版本下載請到: http://www.torrancerestoration.com/ziliao/51hei-5/AD采樣值數(shù)碼管顯示+串口發(fā)送.rar #include<reg52.h> #include <intrins.h> #include<stdio.h> #define uint unsigned int #define uchar unsigned char unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; sbit diola=P2^5; sbit dula=P2^6; sbit wela=P2^7; sbit adwr=P3^6; sbit adrd=P3^7; sbit adcs=P2^0; uchar flag,a,flag_uart,flag_time,flag_on,num0,ad_val; float ad_vo; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=111;y>0;y--); P0=0xfF; wela=1; wela=0; } void display(uchar value) { uchar shu1,shu2,shu3; shu1=value/100; shu2=value%100/10; shu3=value%10; P0=table[shu1]; dula=1; dula=0; P0=0xff; P0=0xfe; wela=1; wela=0; delay(1); P0=table[shu2]; dula=1; dula=0; P0=0xff; P0=0xfd; wela=1; wela=0; delay(1); P0=table[shu3]; dula=1; dula=0; P0=0xff; P0=0xfb; wela=1; wela=0; delay(1); } void init() { adcs=0; diola=1; P1=0xff; diola=0; wela=1; P0=0x7f; wela=0; TMOD=0x21; // SCON=0x50; TH0=(65536-46080)/256; TL0=(65536-46080)%256; TH1=0xfd; TL1=0xfd; TR1=1; ET0=1; SM0=0; SM1=1; REN=1; EA=1; ES=1; } uchar get_ad() { uchar adval; adwr=1; _nop_(); adwr=0; _nop_(); adwr=1; P1=0xff; adrd=1; _nop_(); adrd=0; _nop_(); adval=P1; adrd=1; return adval; } void main() { init(); while(1) { if(flag_uart==1) { flag_uart=0; ES=0; TI=1; switch(flag_on) { case 0:puts("Turn on ad!\n"); TR0=1; break; case 1:puts("Turn off ad!\n"); TR0=0; break; case 2:puts("Error!\n"); break; } while(!TI); TI=0; ES=1; } if(flag_time==1) { flag_time=0; ad_val=get_ad(); ad_vo=(float)ad_val*5.0/256.0; ES=0; TI=1; printf("The voltage is %fV\n",ad_vo); while(!TI); TI=0; ES=1; } display(ad_val); } } void T0_time() interrupt 1 { TH0=(65536-46080)/256; TL0=(65536-46080)%256; num0++; if(num0==20) { num0=0; flag_time=1; } } void ser() interrupt 4 { RI=0; a=SBUF; flag_uart=1; if(a==1) flag_on=0; else if(a==2) flag_on=1; else flag_on=2; }