找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

0801

[复制链接]
admin 发表于 2012-9-2 23:07:24 | 显示全部楼层 |阅读模式

本文包含原理图、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为低电平的时候说明转换完毕)
5_47528_f2b343b92c8bf73.jpg
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 13:50 , Processed in 0.060366 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表