完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
下面是我写出来的程序,是想通过单片机导通计时,当外部一个中断信号进来的时候,停止计时并且通过数显管输出计时值,但是仿真的时候出错了。麻烦各位帮忙看看毕业设计来的
/************************************************************************************** * 毕业设计 * 实现现象:下载程序后按光电开关通可以用数码显像管显示计时 注意事项:无。 ***************************************************************************************/ #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; ***it K3=P3^2; //定义光电开关信号接P3^2 #define GPIO_DIG P0 //定义使用的I0口 u8 DisplayData[8]; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 unsigned char p; unsigned char i,j,f; /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,大约延时10ms *******************************************************************************/ void led_delay(void) { unsigned char j; for(j=0;j<200;j++) ; } /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,大约延时10ms *******************************************************************************/ void delay600(void) { unsigned char d; for(d=0;d<200;d++) ; } /******************************************************************************* * 函 数 名 : Int1Init() * 函数功能 : 设置外部中断1 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0Init() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } /*******************************************************************************/ void timer0Init() { TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 } void Timer0() interrupt 1 { unsigned char i,j; TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; while(j) i++ ; } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { for(f=0;f<1;f++) { K3=1; delay600(); K3=0; } Int0Init(); Timer0Init(); while(1) { if(j==0) //当计数器停下的时候,表明计数完毕 { p=i; //--求频率的个十百千万十万位--// DisplayData[0] = smgduan[p%1000000/100000]; DisplayData[1] = smgduan[p%100000/10000]; DisplayData[2] = smgduan[p%10000/1000]; DisplayData[3] = smgduan[p%1000/100]; DisplayData[4] = smgduan[p%100/10]; DisplayData[5] = smgduan[p%10]; } //--显示求得的数值--// DigDisplay(); } } /******************************************************************************* * 函 数 名 : Int0() interrupt 0 * 函数功能 : 外部中断0的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0() interrupt 0 //外部中断0的中断函数 { unsigned char p; p=i; j=0; } /******************************************************************************* * 函 数 名 : DigDisplay * 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示 *******************************************************************************/ void DigDisplay() { u8 r; for(r=0;r<8;r++) { switch(r) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//显示第7位 } GPIO_DIG=DisplayData[r];//发送段码 delay(10); //间隔一段时间扫描 } } |
|
相关推荐
11个回答
|
|
定时器中断里的i和j要定义成全局变量,j要有置1的情况,你这只有置0的情况。你这个程序编译会报错吧,main里的几个变量都没有定义。
|
|
|
|
420.C(116): warning C206: 'DigDisplay': missing function-prototype 420.C(141): error C231: 'DigDisplay': redefinition 报错是显示这个 |
|
|
|
DigDisplay在调用前没有说明,你需要查看一下C编译报错的说明,有说明报错原因,也需要看看C语言的编程格式要求和规则
|
|
|
|
亲可以了是定义错了,但是执行程序的时候没有达到要求 /************************************************************************************** * 毕业设计 * 实现现象:下载程序后按光电开关通可以用数码显像管显示计时 注意事项:无。 ***************************************************************************************/ #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; ***it K3=P3^2; //定义光电开关信号接P3^2 #define GPIO_DIG P0 //定义使用的I0口 void DigDisplay(); u8 DisplayData[8]; ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 unsigned char p; unsigned char i,j,f; /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,大约延时10ms *******************************************************************************/ /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,大约延时10ms *******************************************************************************/ void delay600(int d) { for(d=0;d<200;d++) ; } /******************************************************************************* * 函 数 名 : Int1Init() * 函数功能 : 设置外部中断1 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0Init() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } /*******************************************************************************/ void Timer0Init() { TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 } void Timer0() interrupt 1 { unsigned char i,j; TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; while(j) i++ ; } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { for(f=0;f<1;f++) { K3=1; delay(1000); K3=0; } Int0Init(); Timer0Init(); while(1) { if(j==0) //当计数器停下的时候,表明计数完毕 { p=i; //--求频率的个十百千万十万位--// DisplayData[0] = smgduan[p%1000000/100000]; DisplayData[1] = smgduan[p%100000/10000]; DisplayData[2] = smgduan[p%10000/1000]; DisplayData[3] = smgduan[p%1000/100]; DisplayData[4] = smgduan[p%100/10]; DisplayData[5] = smgduan[p%10]; } //--显示求得的数值--// DigDisplay(); } } /******************************************************************************* * 函 数 名 : Int0() interrupt 0 * 函数功能 : 外部中断0的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0() interrupt 0 //外部中断0的中断函数 { unsigned char p; p=i; j=0; } /******************************************************************************* * 函 数 名 : DigDisplay * 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示 *******************************************************************************/ void DigDisplay() { u8 i; for(i=0;i<8;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//显示第7位 } GPIO_DIG=DisplayData;//发送段码 delay(10); //间隔一段时间扫描 } } |
|
|
|
|
|
|
|
|
|
|
|
说说你的出错现象吧,或者单独调试显示部分,把各部分分开调试
|
|
|
|
|
|
|
|
void Timer0() interrupt 1
{ unsigned char i,j; TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; while(j) i++ ; } 这里面的i和j,是局部变量,退出中断后,应该就无效了,你应该先确定能正确显示中断里的i,比如在主程序里判断i等于某个值时就停下来,显示这个值。你要看看C语言的变量种类和如何定义 |
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
726 浏览 0 评论
777 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
680 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1149 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1120 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11798 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 21:49 , Processed in 0.670885 second(s), Total 63, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号