|
Keil u Vision 3中单片机硬件资源仿真入门
日期:2009年4月20日
参考书籍:51单片机开发与应用技术详解 赵建领 薛园园等著 电子工业出版社 二十一章
在Keil u Vision3集成开发环境中,对标准的8051单片机及各个公司推出的新型单片机均提供了仿真模拟程序的支持。
下面进行几个方面片上资源仿真实例。
1)并行I/O接口
2)定时器/计数器
3)串行接口
4)寄存器
5)看门狗定时器
6)A/D转换器
7)D/A转换器
8)低功耗模式
9)I2C总线
10)CAN总线
一、并行I/O端口仿真
在Keil 中建立一个以AT89S51的工程文件。 后面的仿真实例都是相同的方式建立相似的工程文件,后不再提示。
仿真程序如下:
#include<reg51.h>
void main()
{
int ReadPort; //声明变量
while(1) //大循环
{
ReadPort=P1; // 读端口P1
P2=ReadPort; //写端口P2
}
}
进入程序仿真环境,点击Peripherals I/O port 选择Port1、Port2。进行仿真,在P1口点击仿真,P2口中会相应的动作出现。
二、定时器/计数器的仿真
以定时器/计数器的工作模式0为例。介绍定时器/计数器的仿真操作,假设外接晶振为6MHz,采用定时器T0产生1ms的定时,并在P1.1端口输出周期为2ms的方波。
下面是该实例的源程序
菜单中的View/Logic Analyzer 选项,在仿真时运行时启用。
/*************************************************************************
程序名称:仿真实例
程序注释:使用Logic Analyzer Windows 中的Logic Analyzer 窗口观察P1^1口波形变化
编译时间:2009年4月20日
编译者:yangloong
版本:
*************************************************************************/
#include<reg51.h>
#include< intrins.h>
sbit b=P1^1; //位定义
void T0ISR(void) interrupt 1
{ //定时器T0中断响应
TL0=0x0c; //重置计数初值
TH0=0xF0;
b=~b; //反向
}
void main()
{
b=0; //初始化P1^1
TMOD=0X00; //设置定时器模式T0为模式0
TL0=0X0C; //初始化
TH0=0X0FC;
TR0=1; //启动TR0
ET0=1;
EA=1; //开中断
while(1)
{
_nop_(); //空动作
}
}
三、 串行接口仿真
串行接口仿真界面
利用串行接口仿真界面进行简单的仿真操作
字符串输入输出的仿真操作
/************************************************************************
程序名称:仿真实例
程序注释:串行接口寄存器实现数据发送和接受的仿真操作
编译时间:2009年4月20日
编译者:yangloong
版本:
*************************************************************************/
#include<reg51.h>
#include<stdio.h>
void main()
{
char ch;
SCON=0x50; // 串口模式1,允许接受
TMOD=0x20; // 初始化TI,模式2
PCON=0x80; //
TL1=0xf4; //波特率4800bit/s ,初值
TH1=0xf4; //
IE=0x90; //中断
TR1=1; // 启动定时器
printf("Please input a char!\n");
while( ( ch=_getkey())!=0x0d) //获取字符 输出字符
{ printf(" The input char= %c, the hex number=%bx\n",ch, ch);}
}
三、 中断仿真
下面是仿真源程序
/*****************************************************************************
程序名称:仿真实例
程序注释:外部中断源的仿真操作
编译时间:2009年4月20日
编译者:yangloong
版本:
*****************************************************************************/
#include<reg51.h>
#include<intrins.h>
void T0ISR(void) interrupt 0 //外部中断0服务例程
{ P1=P1+1 ;} //P1端口递增
void T1ISR(void) interrupt 2 //外部中断1服务例程
{ P2= ~P2 ; } //P2端口反相
void main()
{
IP=0x05 ; //外部中断0和外部中断1设置为高优先级
IT0=1; //外部中断0为下降沿触发
IT1=1; //外部中断1为下降沿触发
EX0=1; //开EX0中断
EX1=1; //
EA=1; //开全中断
P1=0; //
while(1)
{ _nop_(); }
}