1、STC12C5A60SAD转换及LCD1602显示STC12C5A60SAD转换及LCD1602显示/*我写的51AD转换程序,LED灯显示,随着外部电压升高,亮的小灯数会逐渐增加*/#include/包含单片机寄存器的头文件#include /包含_nop_()函数定义的头文件unsigned char result; /A/D转换结果变量 void main(void) unsigned long i; unsigned char status; ADC_CONTR|=0x80; /开A/D转换电源,第一次使用时要打开内部模拟电源 for (i=0;i10000;i+); /适当延时 P1
2、ASF=0x04; /选择P1.2作为A/D转换通道 ADC_CONTR=0xE2; for (i=0;i10000;i+); /适当延时 while(1) /循环进行A/D 转换 ADC_CONTR|=0x08; /启动 A/D 转换 status=0; while(status=0) /等待A/D转换结束 status=ADC_CONTR&0x10; ADC_CONTR&=0xE7; /将ADC_FLAG清0 result=ADC_RES; /保存A/D转换结果 if(result32) P0=0xff; else if(result64) P0=0xfe; else if(result9
3、6) P0=0xfc; else if(result128) P0=0xf8; else if(result160) P0=0xf0; else if(result192) P0=0xe0; else if(result214) P0=0xc0; else if(result236) P0=0x80; else P0=0x00; /*-*/ /*-*功能【AD转换,液晶显示】*-*/*-*芯片:【STC12C5A60S2】*-*/*-*液晶:【LCD1602】*-*/*-*ADC管脚:【P1.0P1.7 】*-*/*-*检测范围:【0.004.99V】*-*/*-*/ #include reg
4、52.h #include intrins.h typedef unsigned char uchar; typedef unsigned int uint; #define _Nop() _nop_()/*-以下为LCD1602显示模块定义-*/unsigned char data_char_table= 0123456789ABCDEF; /LCD数据unsigned char Lcd_Dis1_table = Position:No. ; /第一行显示框架unsigned char pos_char_table = D ; / 显示位置unsigned char Lcd_Dis2_tab
5、le = Voltage : V; /第二行显示框架unsigned char num_char_table = 9A.CD V; / 显示位置sbit lcd_rs_port = P27; /定义LCD控制端口,根据硬件调整sbit lcd_rw_port = P26; sbit lcd_en_port = P24;#define lcd_data_port P0void lcd_delay(uchar ms); /LCD1602 延时void lcd_busy_wait(); /LCD1602 忙等待void lcd_command_write(uint command); /LCD160
6、2 命令字写入void lcd_system_reset(); /LCD1602 初始化void lcd_char_write(uint x_pos,y_pos,lcd_dat); /LCD1602 字符写入void lcd_bad_check(); /LCD1602 坏点检查void Num_to_Disp(uchar i, uint Num); /显示数据处理void LcdDisp(uchar j, uint num); /液晶显示函数/*-以下为ADC相应寄存器初始化及端口定义-*/ /* 定义与ADC相关的特殊功能寄存器 */ sfr ADC_CONTR = 0xBC; /ADC控制
7、寄存器 sfr ADC_RES = 0xBD; /ADC hight 8-bit result register sfr ADC_RESL = 0xBE; /ADC low 2-bit result register sfr P1ASF = 0x9D; /P1口功能控制寄存器P1ASF/*定义相应操作位*/ #define ADC_POWER 0x80 /ADC电源控制位,0:关闭,1:打开#define ADC_FLAG 0x10 /ADC结束标志位#define ADC_START 0x08 /ADC启动控制位 #define ADC_SPEEDLL 0x00 /540 clocks_选择
8、转换速度/*-以下为相关函数声明-*/ void InitADC(); /ADC初始化uint GetADCResult(uchar ch); void Delay(uint n); /延时程序void delay_1ms(uchar x);/*- 主函数 -*/ void main() uchar i; lcd_system_reset(); /LCD1602 初始化 lcd_bad_check(); /LCD1602 坏点检查 InitADC(); /初始化ADC特殊功能寄存器 while (1) i = 0; while(i 7) LcdDisp(i, GetADCResult(i);
9、/液晶1602显示输入电压值(P1.0 - P1.7) Delay(1000); i+; /*- ADC 取值 -*/ uint GetADCResult(uchar ch) ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); /Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG); /Wait complete flag ADC_CONTR &= ADC_FLAG; /Close ADC return (AD
10、C_RES*4 + ADC_RESL); /Return ADC result /*- 初始化ADC特殊功能寄存器 -*/ void InitADC( ) P1ASF = P1 | 0x3f; /Set P1.0 - P1.5 as analog input port ADC_RES = 0; /Clear previous result ADC_RESL = 0; ADC_CONTR = ADC_POWER | ADC_SPEEDLL ; Delay(20); /ADC power-on delay and Start A/D conversion /*- LCD1602相应函数 -*/ /
11、以下为LCD显示数据处理/void Num_to_Disp(uchar i, uint Num) float NUM; int xx, yy, zz; NUM = (Num * 5/ 1024.0); /计算公式:10-bit A/D Conversion Result = 1024 x (Vin / Vcc) xx = (int)NUM; yy = (int)(NUM - (float)(xx) * 10); zz = (int)(NUM - (float)(xx) * 100)%10; num_char_table9 = data_char_tablexx / 10; /电压值十位 num
12、_char_table10= data_char_tablexx % 10; /电压值个位 num_char_table12= data_char_tableyy; /电压值小数点后一位 num_char_table13= data_char_tablezz; /电压值小数点后两位? pos_char_table13= data_char_tablei; /当前ADC接口/以下为LCD显示/void LcdDisp(uchar j, uint num) uint i=0; for (i=0;i16;i+) lcd_char_write(i,0,Lcd_Dis1_tablei); lcd_cha
13、r_write(i,1,Lcd_Dis2_tablei); /显示框架 Num_to_Disp(j, num); lcd_char_write(13,0,pos_char_table13); for(i = 9; i 14; i+) lcd_char_write(i,1,num_char_tablei); /显示电压 delay_1ms(100);/以下是LCD1602驱动程序/void lcd_delay(uchar ms) /*LCD1602 延时*/ uchar j; while(ms-) for(j=0;j250;j+) ; void lcd_busy_wait() /*LCD1602
14、 忙等待*/ lcd_rs_port = 0; lcd_rw_port = 1; lcd_en_port = 1; lcd_data_port = 0xff; while (lcd_data_port&0x80); lcd_en_port = 0; void lcd_command_write(uint command) /*LCD1602 命令字写入*/ lcd_busy_wait(); lcd_rs_port = 0; lcd_rw_port = 0; lcd_en_port = 0; lcd_data_port = command; lcd_en_port = 1; lcd_en_por
15、t = 0; void lcd_system_reset() /*LCD1602 初始化*/ lcd_delay(20); lcd_command_write(0x38); lcd_delay(100); lcd_command_write(0x38); lcd_delay(50); lcd_command_write(0x38); lcd_delay(10); lcd_command_write(0x08); lcd_command_write(0x01); lcd_command_write(0x06); lcd_command_write(0x0c); void lcd_char_wri
16、te(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符写入*/ x_pos &= 0x0f; /* X位置范围 015 */ y_pos &= 0x01; /* Y位置范围 0 1 */ if(y_pos=1) x_pos += 0x40; x_pos += 0x80; lcd_command_write(x_pos); lcd_busy_wait(); lcd_rs_port = 1; lcd_rw_port = 0; lcd_en_port = 0; lcd_data_port = lcd_dat; lcd_en_port = 1; lcd_en_port =
17、0; void lcd_bad_check() /*LCD1602 坏点检查*/ char i,j; for(i=0;i2;i+) for(j=0;j16;j+) lcd_char_write(j,i,0xff); lcd_delay(200); lcd_delay(200); lcd_delay(200); lcd_delay(100); lcd_delay(200); lcd_command_write(0x01); /* clear lcd disp */以上是LCD1602驱动程序/*- 延时程序 -*/ void Delay(uint n) uint x; while (n-) x = 500; while (x-); /*1MS为单位的延时程序*/void delay_1ms(uchar x) uchar j;while(x-) for(j=0;j125;j+) ;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1