預期實現功能:在1602上顯示電壓值,同時用P2口顯示ADC結果寄存器中的八位數值
現在好像是一個都不好使
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sfr P1ASF=0X9D; //P1口模擬功能控制寄存器
sfr ADC_CONTR=0XBC; //ADC控制寄存器
sfr ADC_RES=0XBD; //AD轉換結果存放
sfr ADC_RESL=0XBE; //AD轉換結果存放
sfr AUXR1=0XA2;
//sfr IE=0XA8;
//sfr IPH=0XB7; //中斷優先級控制寄存器高
//sfr IP=0XB8; //中斷優先級控制寄存器低
sbit k1=P3^1;
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
uchar temp;
unsigned int result=0,resulth=0;
void delay1ms(unsigned int d) //誤差 0us
{
unsigned char a,b,c;
for(c=d;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void lcd_wcom(uchar com)
{
rs=0;
rw=0;
P0=com;
delay1ms(5);
en=1;
en=0;
}
void lcd_wdat(uchar dat)
{
rs=1;
rw=0;
P0=dat;
delay1ms(5);
en=1;
en=0;
}
void lcd_init()
{
lcd_wcom(0x38);
lcd_wcom(0x0c);
lcd_wcom(0x06);
lcd_wcom(0x01);
}
void ADinit()
{
P1ASF=0x01; //P1^0口作為AD輸入口
ADC_CONTR=0x20; //P1^0口作為AD輸入口,360個時鐘周期轉換一次
AUXR1=0x00; //高八位存放于ADC_RES,低二位存放于ADC_RESL
IE=0XA0; //開總中斷允許AD中斷
}
void ADser() interrupt 5
{
lcd_wcom(0x80+0x40);
lcd_wdat(0x31);
_nop_();
_nop_();
_nop_();
_nop_(); //延時4個時鐘周期,使其趨于穩定
temp=ADC_CONTR|0x10<<4; //此時ADC_FLAG的值被移入CY位;
if(CY)
{
ADC_CONTR=0xC0; //轉換完成,將ADC_FLAG清零
resulth=ADC_RES; //讀取高8位值
P2=ADC_RES; //把ADC_RES的值以點亮小燈的形式顯示出來P2口接有八個共陽極的led
result=(unsigned int)(resulth*5/256);
lcd_wcom(0x80);
lcd_wdat(result/100+0x30);
lcd_wdat(result%100/10+0x30);
lcd_wdat(result%10+0x30);
}
}
void main()
{
ADinit();
lcd_init();
while(1)
{
ADC_CONTR=0XA8;;//開始AD轉換
delay1ms(1000);
delay1ms(1000);
delay1ms(1000);
delay1ms(1000);
ADC_CONTR=0X20;;//關閉AD轉換
}
}
|