Proteus仿真:使用8255输出连续方波

举报
海轰Pro 发表于 2021/08/05 23:06:00 2021/08/05
【摘要】 实现目标 用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<DELAYTIMEScCounter++){}//延时 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。