Proteus仿真:使用8255输出连续方波
        【摘要】     实现目标 
用8255C口的PC3引脚向外输出连续的正方波信号,频率为500hz 
Proteus仿真图 
 
C51代码(软件延时) 
/* 采用软件延时实现 */
#include <REG52.H> /* special function register declarations */
#include <intrins.h>
#def...
    
    
    
    实现目标
用8255C口的PC3引脚向外输出连续的正方波信号,频率为500hz
Proteus仿真图

C51代码(软件延时)
/* 采用软件延时实现 */
#include <REG52.H> /* special function register declarations */
#include <intrins.h>
#define PA8255 		XBYTE[0xe000] 	/* 定义8255A口地址 */
#define PB8255 XBYTE[0xe001] 	/* 定义8255B口地址 */
#define PC8255 XBYTE[0xe002] 	/* 定义8255C口地址 */
#define COM8255 	XBYTE[0xe003] 	/* 定义8255控制寄存器地址 */
void time(unsigned int ucMs);
void init8255(void) { 
	COM8255=0x80;/*工作方式选择字送入8255控制寄存器,设置A、B、C口为基本I/O输出方式 */
}
/******** main 函数 *********/
void main (void) { init8255();
	while (TRUE) { COM8255=0x07;	/*PC3置1*/
		time(1);/* 延时1ms */
		COM8255=0x06; 	/*PC3清0*/
		time(1);/* 延时1ms */
	}
}
/******** time C *********/
void time(unsigned int ucMs)//延时单位:ms
{ #define DELAYTIMES  239 unsigned char ucCounter;	
	while(ucMs>0){
		while(ucMs!=0);
	for(ucCounter=0;ucCounter<DELAYTIMEScCounter++){}//延时 ucMs--;
	}
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
笔记
- COM8255=0x80,定义8255的工作方式选择字,强调C口用于输出。
- COM8255=0x07,定义8255的C口置/复位控制字,07=0000 0111,011表示PC3,1表示置位,也就是将PC3置为1
- COM8255=0x06,定义8255的C口置/复位控制字,06=0000 0110,011表示PC3,0表示复位,也就是将PC3置为0
- 具体查询8255初始化规则
思路:采用软件延时的方法,直接对PC3引脚的电位进行修改,达到输出连续方波的效果。
C51代码(中断)
/* 采用工作方式1定时器1中断实现 */
#include <REG52.H> /* special function register declarations */
#include <Absacc.h>
#define TRUE  1
#define FALSE 0
bit	bitFF;/* 位计数器 */
#define PA8255 		XBYTE[0xe000] 	/* 定义8255A口地址 */
#define PB8255 XBYTE[0xe001] 	/* 定义8255B口地址 */
#define PC8255 XBYTE[0xe002] 	/* 定义8255C口地址 */
#define COM8255 	XBYTE[0xe003] 	/* 定义8255控制寄存器地址 */
/* 初始化8255 */
/*工作方式选择字送入8255控制寄存器,设置A、B、C口为基本I/O输出方式 */
void init8255(void) { 
	COM8255=0x80;
}
/******** main 函数 *********/
void main (void) {	
	init8255();	/* 初始化8255 */
	TMOD=0x10; /* 设置定时器1为工作方式1 */ TH1=-500>>8;TL1=-500 % 256;/* 定时器1每1000计数脉冲发生1次中断,12MHz晶振,定时时间1000us */
	TCON=0x40; /* 内部脉冲计数 */
	IE=0x88;   /*打开定时器中断*/	
	while (TRUE) {
		time(1);/* 延时1ms */
	}
}
/******* 定时器/计数器1中断服务程序 ***/
void timer1int(void) interrupt 3
{	
	EA=0;/* 关总中断 */
	TR1=0;/*停止计数*/	
	TH1=-500>>8;TL1=-500 % 256;/* 重置计数初值 */	
	TR1=1;/*启动计数*/
	if(bitFF)
		COM8255=0x07;	/*PC3置1*/
	else
		COM8255=0x06; 	/*PC3清0*/
	bitFF=!bitFF;	
	EA=1;/* 开总中断 */
}
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
上述代码同样可以实现输出连续方波的效果,只是利用中断替代了软件延时,效率高一些
文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。
原文链接:haihong.blog.csdn.net/article/details/114135043
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)