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)