完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
实验课题
今天微机原理实验老师布置了一道课后作业,就是利用51单片机做一个秒表,本来单片机是有P0,P1,P2,P3共计32个I/O口可以用的,但是因为实验箱内单片机做了外部扩展,所以端口不够用,改成利用C51单片机外扩8255实现数字秒表。 思考 因为外部做了扩展,所以在做仿真的时候思考了很久,为了和实验箱布局一致,我在proteus上还原实验箱的布局。首先是从P0做的扩展,因此要对应8255的输入端口。 很多人对8255的使用不太了解,这里我就补充一下8255的知识。 8255引脚部分及原理
PB7~PB0:B口数据信号线,双向,三态引脚; PC7~PC0:C口数据信号线,双向,三态引脚;
D7~D0:它们是8255A的数据线,和系统总线相连,用来传送数据和控制字。 片选信号,低电平有效。即当端为低电平时,8255A被选中。只有当有效时,CPU才能对8255A进行读写操作。
GND:地线 控制字及工作方式 工作方式我们只讲方式0(基本的输入和输出),读者只需了解这一个即可。 方式0为基本的输入/输出方式,传送数据时不需要联络信号。A口、B口和C口(或C高4位口及C低4位口)均可独立设置成方式0输入口或方式0输出口。 实验设计要求:
#include #define uint unsigned int #define uchar unsigned char ***it k1=P1^0; ***it k2=P1^1; ***it k3=P1^2; uchar ms = 0;//毫秒 uchar s = 0;//秒 uchar min = 0;//分 unsigned char xdata *p=0xc000; unsigned char xdata *pa=0xc000;//段选 unsigned char xdata *pb=0xc002;//位选 uchar code led_data[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; uchar code dp[] = {0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7}; //延时函数 void delay(uint t) { uint i,j; for(i=0;i for(j=0;j<120;j++); } } void Timer0Init() { TMOD = 0x01; //选择T0定时/计数器,工作在方式1,16位计数器 TH0 = 0xEE; s TL0 = 0x00; ET0 = 1; //定时/计数器0中断允许位 EA = 1; //总中断 } void S3() { ms = 0; s = 0; min = 0; TR0 = 0; } void Key() { uchar K; K = P1&0x07; if(K!=0x07) { delay(10); //消抖10ms K = P1&0x07; if(K!=0x07) { switch(K) { case 0x05: TR0 = 1; break; case 0x06: //S2(P1^1)被按下 TR0 = 0; //定时器0运行控制位为0,关闭定时器0 break; case 0x03: S3(); break; } } while(K!=0x07) //松手检测 { K = P1&0x07; } } } void digital(uchar ms,uchar s,uchar min) { *pb = 0x7f; *pa = led_data[ms%10]; delay(1); *pb = 0xbf; *pa = led_data[ms/10]; delay(1); *pb = 0xdf; *pa = dp[s%10]; delay(1); *pb = 0xef; *pa = led_data[s/10]; delay(1); *pb = 0xff; *pa = dp[min%10]; delay(1); *pb = 0xf7; *pa = dp[min%10]; delay(1); *pb = 0xfb; *pa = led_data[min/10]; delay(1); *pa = 0x00; } void main(void) { p[3]=0x80; //普通IO (*pa) = 0x00; //读端口前写0 P1 = 0xFF; //读端口前写1 Timer0Init(); //定时器中断初始化函数 while(1) { digital(ms,s,min); //数码管显示函数 Key(); //按键扫描函数 } } void Timer0() interrupt 1 { static uint count_ms; static uint count_s; static uint count_min; TH0 = 0xEE; TL0 = 0x00; count_ms++; count_s++; count_min++; if(count_ms==2) { count_ms = 0; ms++; if(ms>59) { ms = 0; } } if(count_s==200) { count_s = 0; s++; if(s>59) { s = 0; } } if(count_min==12000) { count_min = 0; min++; if(min>59) { min = 0; } } } 展示 |
|
|
|
只有小组成员才能发言,加入小组>>
2512 浏览 0 评论
1082浏览 2评论
696浏览 1评论
452浏览 0评论
192浏览 0评论
326浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 20:41 , Processed in 1.053018 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号