8用串行口扩展并行输出口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CHANGZHOU INSTITUTE OF TECHNOLOGY 单片机实践报告
题目:用串行口扩展并行输出口
学院:延陵学院
班级:
姓名:
学号:
一、实验目的
1、掌握AT89C52串行口方式0的工作方式和编程
2、掌握利用串行口和移位寄存器扩展并行接口的方法
二、实验电路
元器件编号
元器件名称 说明 U1 AT89C52 AT89C52单片机 U2 74HC164.IEC 并行输出串行口移位寄存器
7SEG-BCD
7段BCD 数码管显示器
三、实验流程图
开始
初始化串口
I<8?
循环移位
100次? 置零
检查状态
i++
结束
N
Y
Y
N
四、调试步骤
用查询TI方式,在7段BCD数码管显示器循环显示0~99这100个数字。
五、实验代码
#include
#include
#include
#include
#include
#include
#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE unsigned char
#define WORD unsigned int
#define TRUE 1
#define FALSE 0
void initUart(void); //初始化串行口
void time(unsigned int ucMs); //延时单位:ms
sbit CTRL_OUT = P3^4; //=0,清零;=1,并行输出
/******HEXtoBCD*****/
unsigned char HEXtoBCD (unsigned char hex)
{
return ((hex/10)*16+(hex%10));
}
/********main c*********/
void main(void){
uchar i,wByte=0;
initUart(); //初始化串行口方式0
CTRL_OUT=1; //=1,允许并行输出
for(;;){
for(i=0;i<8;i++){
SBUF=HEXtoBCD(wByte); //循环右移i位,串行输出
wByte++;
if(wByte==100) //0-99循环
wByte=0;
while(!TI){} //状态查询
TI=0; //清发送中断标志
time(88); //状态维持
}
}
}
void delay_5us(void) //延时5us,晶振改变时只改变这一个函数{
_nop_();
_nop_();
//_nop_();
// _nop_();
}
/*delay_50us*/
void delay_50us(void) //延时50us
{
unsigned char i;
for(i=0;i<4;i++)
{
delay_5us();
}
}
/******************延时100us********************/
void delay_100us(void) //延时100us
{
delay_50us();
delay_50us();
}
/*延时单位:ms*/
void time(unsigned int ucMs)
{
unsigned char j;
while(ucMs>0)
{
for(j=0;j<10;j++)
delay_100us();
ucMs--;
}
}
/**********初始化串行口波特率********/
void initUart(void) //初始化串行口方式0 {
SCON=0x00; //串行口方式0工作ES=0; //禁止串行中断
}
六、运行效果