15W系列是目前51單片機里面可用資源較多的處理器。一般的設計都可以用,本次分享下利用單片機自帶的AD轉換座一個數字電壓表。顯示用的LCD1602
單片機源程序如下:
- #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完成標志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個時鐘
- #define ADC_SPEEDL 0x20 //360個時鐘
- #define ADC_SPEEDH 0x40 //180個時鐘
- #define ADC_SPEEDHH 0x60 //90個時鐘
- unsigned char ch = 0; //ADC通道號
- 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延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 判忙函數
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- P4= 0xFF;
- RS=0;
- RW=1;
- EN=0;
- _nop_();
- EN=1;
- return (bit)(P4 & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=0;
- RW=0;
- EN=1;
- P4= com;
- _nop_();
- EN=0;
- }
- /*------------------------------------------------
- 寫入數據函數
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=1;
- RW=0;
- EN=1;
- P4= Data;
- _nop_();
- EN=0;
- }
- /*------------------------------------------------
- 清屏函數
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 寫入字符串函數
- ------------------------------------------------*/
- 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 ++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數
- ------------------------------------------------*/
- 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);
- }
- /*------------------------------------------------
- 初始化函數
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標移動設置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標設置*/
- }
- 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');
- }
- /*----------------------------
- 軟件延時
- ----------------------------*/
- void Delay(WORD n)
- {
- WORD x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
- /*----------------------------
- 初始化ADC
- ----------------------------*/
- void InitADC()
- {
- P1ASF = 0x01; //設置P1口為AD口
- ADC_RES = 0; //清除結果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
- Delay(2); //ADC上電并延時
- }
- void Timer0Init(void) //200微秒@11.0592MHz
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x5C; //設置定時初值
- TH0 = 0xF7; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- 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中斷服務程序
- ----------------------------*/
- void adc_isr() interrupt 5 using 1
- {
- ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標志
-
- p=ADC_RES ; //讀取高8位結果并發送到串口
- // SendData(ADC_LOW2); //顯示低2位結果
-
- ch = 0; //切換到下一個通道
- 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 ; }
- }
復制代碼
所有資料51hei提供下載:
15wAD轉換.rar
(57.32 KB, 下載次數: 82)
2020-2-15 16:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|