本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
/********************************************
项目:模数0801学习
版本:初级版
硬件:proteus仿真
具体描述:把可调电阻上的电压显示在1602上
时间:2009年8月
作者:电子隐者
*********************************************/
#include<reg51.h>
#include <intrins.h> //包含_nop_()函数
#define uchar unsigned char
#define uint unsigned int
#define LCD P1
sbit wr=P3^0; //0801转换启动控制端口
sbit RS=P3^6; //LCD1602命令数据控制端口
sbit EN=P3^7; //LCD1602使能端口
uchar table[4];
/*延时函数*/
Delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
{
for(y=100;y>0;y--);
}
}
/*计算2的N次幂函数*/
uchar My2pow(uchar tempnum) //需要的参数是2的次
{
uchar num;
uchar cj=1;
for(num=0;num<tempnum;num++)
{
cj=cj*2;
}
return(cj);
}
/*BCD二进制转换为十进制*/
uint Mybcd(uchar k) //需要的参数是要转换的二进制
{
uchar tempk;
uchar m;
uchar n;
uint sum=0;
tempk=k;
for(m=0;m<8;m++)
{
n=tempk&0x01;
sum=sum+n*My2pow(m);
tempk>>=1;
}
return(sum) ;
}
/*0801AD转换函数*/
Adc()
{
wr=0;
_nop_();
wr=1;
}
/*数据处理函数*/
int Nummangement(int q)
{
float show;
int rel;
show=(q/255.0)*5;
rel=(int)(show*100+0.5);
return(rel) ;
}
/*数值转换为字符串*/
IntcString(int c)
{
table[0]=0x30|(c/100);
table[1]=0x2e;
table[2]=0x30|(c%100/10);
table[3]=0x30|(c%10);
}
/*1602写命令函数*/
Lcd_writecommand(uchar command)
{
RS=0; //选择输入命令
LCD=command; //命令字输入P0口
Delay(10);
EN=1;
EN=0; //下降沿运行指令
}
/*1602写数据函数*/
Lcd_writedata(uchar ddata)
{
RS=1; //选择输入数据
LCD=ddata; //数据输入P0口
Delay(10);
EN=1;
EN=0; //下降沿运行指令
}
/*1602初始化函数*/
Lcd_init()
{
Lcd_writecommand(0x38);
Lcd_writecommand(0x0c); //开启显示屏,关光标,光标不闪烁
Lcd_writecommand(0x01); //清屏
}
/*在指定的位置显示一个字符*/
Lcd_displayOneChar(uchar x,uchar y,uchar Data)
{
x=x&0x0f;
y=y&0x01;
if (y==0)
x |= 0x80; //当要在第一行显示时 地址+0x80;
if(y==1)
x |= 0xC0; //在要在第二行显示时 地址码+0xC0;
Lcd_writecommand(x); //发送地址码
Lcd_writedata(Data); //发送要显示的字符编码
}
/*外部中断0初始化*/
Ext0init()
{
IT0=0;
PX0=1;
EX0=1;
EA=1;
}
/*外部中断0中断处理函数*/
Ext0()interrupt 0
{
uchar adcnum;
uchar b;
int mybcd;
int num;
EA=0;
adcnum=P2;
mybcd=Mybcd(adcnum);
num=Nummangement(mybcd);
IntcString(num);
for(b=0;b<4;b++)
{
Lcd_displayOneChar(b,1,table);
}
EA=1;
}
/*主函数*/
main()
{
Ext0init();
Lcd_init();
while(1)
{
Adc();
}
}
上面的程序是我学习模数0801转换的时候写的
但是不知道为什么0801的那个INTR管脚为什么一直为高电平 (INTR为低电平的时候说明转换完毕)
|
|