- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机系统实验
班级 学号 姓名 实验项目: 单片机系统实验 一、实验目的:
(1)学会程序的编写与调试,掌握子程序的设计与使用,熟悉中断服务程序的设计及调用过程。
(2)综合运用所学知识,进行单片机系统的开发编程
二、实验内容:
编程实现如下功能的倒计时秒表。
⑴秒表可从59s~0s循环运行。即每隔1s,数码管显示的秒数减1,减到0s时,再过1s,又回到59,重新从59开始减。
⑵倒计时初值可通过键盘设置。按Key3(P3.4)键,数码管的十位加1,从0~5循环变化;按Key4(P3.5)键,数码管的个位加1,从0~9循环变化;
⑶运行控制。按下Key1(P3.2)键秒表开始运行;按下Key2(P3.3)键秒表停止运行;
三、实验说明及实验电路图
四、实验程序及分析
#includereg51.h
#define uchar unsigned char
#define uint unsigned int
#define swsmgdat P0 //数码管十位数据
#define gwsmgdat P2 //数码管各位数据
sbit key3 = P3^4 ; //按键调整各位 0~9
uchar code tem_CA[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //共阳数码管0~9
uchar sec5ms, sec1s,count,flag=1; //定义全局变量 flag为标志位 1开始 0 暂停
int second=59,cur_second ;
//--------------------------------
void Timer0_Init(void) //定时器0 外部中断0,1初始化
{
TMOD = 0X61 ; //0110 0001 计数器方式2(8位自动重装初值)
TH0=(65536-5000)/256 ;
TL0=(65536-5000)%256 ;
TH1=0xFF ;
TL1=0xFF ;
EA=1 ;
ET0=1 ;
TR0=1 ;
ET1=1 ;
TR1=1 ;
IT0=1;
EX0=1;
IT1=1;
EX1=1;
}
//--------------------------------------
void wbzd_0() interrupt 0 //key1 外部0中断
{
flag = 1 ;
}
//-------------------------------------
void Timer0(void) interrupt 1 //定时器0进中断
{
TH0 = (65536-5000)/256 ;
TL0 = (65536-5000)%256 ;
sec5ms = 1 ; //标记
count++ ;
if(count==200)
{
count=0; sec1s=1 ;
if(sec1s==1)
{
sec1s = 0 ; if(flag==1) {second--;}
if( second0 ) { second = 59 ; }
}
}
}
//---------------------------------
void wbzd_1() interrupt 2 //key2 外部1中断
{
if(flag==1) flag = 0 ;
}
//---------------------------------
void Timer_1() interrupt 3 //key4 计数器1 中断
{
if(flag==1) flag=0 ;
cur_second=second ;
cur_second = cur_second+10 ;
if(cur_second=60) cur_second = cur_second-60 ;
second = cur_second;
}
//----------------------------------
void smg_display() //定义两位数码管
{
if( second=10 )
{
swsmgdat = tem_CA[second/10] ;
gwsmgdat = tem_CA[second%10] ;
}
else
{
swsmgdat = 0xFF;
gwsmgdat = tem_CA[s
文档评论(0)