|
|
15W系列是目前51單片機(jī)里面可用資源較多的處理器。一般的設(shè)計(jì)都可以用,本次分享下利用單片機(jī)自帶的AD轉(zhuǎn)換座一個(gè)數(shù)字電壓表。顯示用的LCD1602
單片機(jī)源程序如下:
- #include<15w.H>
- #include<math.h>
- #include <string.h>
- #include <stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned int WORD;
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標(biāo)志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
- #define ADC_SPEEDL 0x20 //360個(gè)時(shí)鐘
- #define ADC_SPEEDH 0x40 //180個(gè)時(shí)鐘
- #define ADC_SPEEDHH 0x60 //90個(gè)時(shí)鐘
- unsigned char ch = 0; //ADC通道號(hào)
- int time;
- int time1;
- int time2;
- float p;
- sbit RS = P5^5; //定義端口
- sbit RW = P5^4;
- sbit EN = P5^3;
- sbit pwm=P2^7;
- sbit key1 = P2^0;
- sbit key2=P2^1;
- sbit led=P5^1;
- unsigned char ti[]={'0','1',0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
- /*------------------------------------------------
- uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
- unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
- 長(zhǎng)度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
- unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 判忙函數(shù)
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- P4= 0xFF;
- RS=0;
- RW=1;
- EN=0;
- _nop_();
- EN=1;
- return (bit)(P4 & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=0;
- RW=0;
- EN=1;
- P4= com;
- _nop_();
- EN=0;
- }
- /*------------------------------------------------
- 寫入數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=1;
- RW=0;
- EN=1;
- P4= Data;
- _nop_();
- EN=0;
- }
- /*------------------------------------------------
- 清屏函數(shù)
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 寫入字符串函數(shù)
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數(shù)
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關(guān)閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標(biāo)移動(dòng)設(shè)置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/
- }
- void display(uint temp) //顯示程序
- {
- int A1,A2,A3;
- A1=temp/100;
- A2=temp%100/10;
- A3=temp%100%10/1;
-
- LCD_Write_Char(4,0,ti[A1]);
- LCD_Write_Char(5,0,ti[A2]);
- LCD_Write_Char(6,0,'.');
- LCD_Write_Char(7,0,ti[A3]);
- LCD_Write_Char(8,0,'V');
- }
- /*----------------------------
- 軟件延時(shí)
- ----------------------------*/
- void Delay(WORD n)
- {
- WORD x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
- /*----------------------------
- 初始化ADC
- ----------------------------*/
- void InitADC()
- {
- P1ASF = 0x01; //設(shè)置P1口為AD口
- ADC_RES = 0; //清除結(jié)果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
- Delay(2); //ADC上電并延時(shí)
- }
- void Timer0Init(void) //200微秒@11.0592MHz
- {
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x5C; //設(shè)置定時(shí)初值
- TH0 = 0xF7; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0=1;
- EA=1;
- }
-
- void main()
- {
- float i,j;
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P4M0 = 0x00;
- P4M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
- LCD_Init();
- LCD_Clear();//清屏
- InitADC(); //初始化ADC
- IE = 0xa0; //使能ADC中斷
- Timer0Init();
-
-
-
- while(1){
-
- i=p*5;
- j=((i/256)*10);
- display(j);
- DelayMs(500);
- }
- }
- /*----------------------------
- ADC中斷服務(wù)程序
- ----------------------------*/
- void adc_isr() interrupt 5 using 1
- {
- ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標(biāo)志
-
- p=ADC_RES ; //讀取高8位結(jié)果并發(fā)送到串口
- // SendData(ADC_LOW2); //顯示低2位結(jié)果
-
- ch = 0; //切換到下一個(gè)通道
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
- }
- void tm0_isr() interrupt 1
- {
- time++;
- time1++;
- time2++;
- if(time1>100)
- time1=0;
- if(time1>50)
- pwm=1;
- else
- pwm=0;
- if(time>5000)
- { time=0;
- led=~led ; }
- }
復(fù)制代碼
所有資料51hei提供下載:
15wAD轉(zhuǎn)換.rar
(57.32 KB, 下載次數(shù): 82)
2020-2-15 16:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|