您的位置:控制工程论坛网论坛 » 软件与程序 » 单片机学习,C51单片机入门经典30课 第十七课

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

单片机学习,C51单片机入门经典30课 第十七课

xilinxue  发表于 2009/2/10 13:25:24      1259 查看 2 回复  [上一主题]  [下一主题]

手机阅读

第17课,写入按键次数到24c02,并读出来显示在4个LED上。并脱机运行验证结果。


这一课我们用24c02完成一个实际应用的场合,在24c02中记录按键次数并用二机制显示在4个LED上。下次开机时,将继续显示上次的按键次数。这些工作在工控领域有十分广泛的应用。


我们将在第一次运行过后,再断点,学习DX516的脱机运行,并看运行结果。


――――――――――――――――――――
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include //包括一个52标准内核的头文件
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
#define WriteDeviceAddress 0xa0 //定义器件在IIC总线中的地址
#define ReadDviceAddress 0xa1
sbit SCL=P2^7;
sbit SDA=P2^6;
sbit P10=P1^0;
sbit K1=P3^2;
//定时函数
void DelayMs(unsigned int number)
{
unsigned char temp;
for(;number!=0;number--)
{
for(temp=112;temp!=0;temp--) ;
}
}
//开始总线
void Start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
//结束总线
void Stop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
//发ACK0
void NoAck()
{
SDA=1;
SCL=1;
SCL=0;
}
//测试ACK
bit TestAck()
{
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
//写入8个bit到24c02
Write8Bit(unsigned char input)
{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
//写入一个字节到24c02中
void Write24c02(uchar ch,uchar address)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Write8Bit(ch);
TestAck();
Stop();
DelayMs(10);
}
//从24c02中读出8个bit
uchar Read8Bit()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--)
{
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
}
return(rbyte);
}
//从24c02中读出1个字节
uchar Read24c02(uchar address)
{
uchar ch;
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
ch=Read8Bit();
NoAck();
Stop();
return(ch);
}
//写入按键次数到24c02,并读出来显示在4个LED上
void main(void) // 主程序
{
uchar c1,c2;
while(1)
{
c1=Read24c02(0x01); //读出24c02第一个地址数据
P1=c1; //显示在P1口的4个LED上
if(!K1) //按键处理
{
c1++; //值加1
Write24c02(c1,0x01); //重新写入24c02
while(!K1); //等待按键松开
for(c2=0;c2<250;c2++); //松开按键去抖
}
}
}
――――――――――――――――――――――――――――――――


程序中,不断读出24c02的0x01位置的数据出来,并显示在P1口上,我们可以在4个LED上观察到低4位的数据变化。
当检查到按键时,就将前面读出来的值加1,写入在24c02中的同一个位置中。下一个循环中,值又被读出来并显示。
编译,联机,并运行。不断按K1,可以看到P1的4个LED不断以二机制变化显示。


下面我们试验脱机运行方式,并验证24c02的非挥发特性。


我们记住目前的led显示状态,再将dx516后面usb取电板拔下。使Dx516仿真器断电。再将仿真器上旁边的一个跳线跳到“RUN”的位置,这时仿真器就会像一个烧好了程序的51芯片一样工作,这就是DX516的脱机运行工作方式,这种方式对特殊的调试有很大的帮助,进入脱机方式后,就会直接运行上次调试过的程序。


跳好线之后,请重新插上usb取电板,上电。可以看到dx516上面的蓝灯闪烁3次,表示进入了脱机运行方式,并开始全速运行上次用户调试过的程序。


我们可以直接看到4个LED的显示状况,和上次断电之前是一样的。按K1,4个LED又继续按照二机制方式加1。程序继续正常工作。


好,试验完成,我们将脱机运行的跳线,跳回到“EMB”方向,以便下一次课程继续仿真运行。

1楼 0 0 回复
总共 , 当前 /