利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个提示灯依次一个一个闪动,闪动频率为10次每秒(8个灯亮一遍为一个周期),循环

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int 
uchar tt,aa;
//sbit d1=P1^0;

void main()
{
	TMOD=0x10; 			//选择定时器  t0的工作方式为1
	EA=1;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	ET1=1;
	TR1=1;
	aa=0xfe;
	while(1)
	{
			
	 	 	if(tt==2)
			{
			tt=0;
			P1=aa;
			aa=_crol_(aa,1);
			}
		}
}			


	void exter() interrupt 3
	{
		TH0=(65536-50000)/256;
		TL0=(65536-50000)%256;
		tt++;
	}	 
这个程序快恶心死我了,一次写完之后竟然不能执行又找不出原因气的发狂啊。为了不让自己头疼我决定去上晚自习(班长催的紧啊)两个星期只去了三次,其余晚上时间都在学习郭天祥!走到楼下突然想起自己居然没有bug,只是在那干想,不甘心啊,回去继续修改!!!经过bug之后才发现程序不能进入到for语句中。我以为是外边错了。一直在外边找啊,结果可想而知。最后才发现原来是给aa赋值时弄成P1了,最终解决了问题!(中间曾将定时器1换成了0因为自己以前写的全是用定时器0写的结果还是不行,因此由进行下一种方式的找错,调试程序虽然是个耐力活,但是还需要准确的方法啊)
  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,以下是基于AT89C51型号共阴极的单片机代码,实现8个指示依次闪动的效果: ``` #include <reg52.h> #define FREQ 12000000UL // 晶振频率 sbit LED_1 = P1 ^ 0; // 指示1 sbit LED_2 = P1 ^ 1; // 指示2 sbit LED_3 = P1 ^ 2; // 指示3 sbit LED_4 = P1 ^ 3; // 指示4 sbit LED_5 = P1 ^ 4; // 指示5 sbit LED_6 = P1 ^ 5; // 指示6 sbit LED_7 = P1 ^ 6; // 指示7 sbit LED_8 = P1 ^ 7; // 指示8 void init_timer1() // 初始化定时/计数器 T1 { TMOD |= 0x10; // T1 工作在模式1:16位定时器 TH1 = 0x00; // 高字节初始为0 TL1 = 0x00; // 低字节初始为0 TR1 = 1; // 启动 T1 } void delay(uint16_t count) // 延时函 { uint16_t i, j; for (i = 0; i < count; i++) { for (j = 0; j < 1000; j++); } } void main() { uint8_t led_count = 0; // 记录当前亮的编号 uint16_t timer_count = 0; // 记录定时计数器 init_timer1(); // 初始化定时/计数器 T1 while (1) { if (TF1) // T1 溢出中断 { TF1 = 0; // 清除 T1 溢出中断标志 timer_count++; // 定时计数器加1 if (timer_count == FREQ / 10 / 8) // 闪动频率10/(8个依次一遍一个周期) { timer_count = 0; // 重置定时计数器 led_count++; // 亮编号加1 if (led_count == 1) // 依次 { LED_1 = 1; LED_2 = 0; LED_3 = 0; LED_4 = 0; LED_5 = 0; LED_6 = 0; LED_7 = 0; LED_8 = 0; } else if (led_count == 2) { LED_1 = 0; LED_2 = 1; LED_3 = 0; LED_4 = 0; LED_5 = 0; LED_6 = 0; LED_7 = 0; LED_8 = 0; } else if (led_count == 3) { LED_1 = 0; LED_2 = 0; LED_3 = 1; LED_4 = 0; LED_5 = 0; LED_6 = 0; LED_7 = 0; LED_8 = 0; } else if (led_count == 4) { LED_1 = 0; LED_2 = 0; LED_3 = 0; LED_4 = 1; LED_5 = 0; LED_6 = 0; LED_7 = 0; LED_8 = 0; } else if (led_count == 5) { LED_1 = 0; LED_2 = 0; LED_3 = 0; LED_4 = 0; LED_5 = 1; LED_6 = 0; LED_7 = 0; LED_8 = 0; } else if (led_count == 6) { LED_1 = 0; LED_2 = 0; LED_3 = 0; LED_4 = 0; LED_5 = 0; LED_6 = 1; LED_7 = 0; LED_8 = 0; } else if (led_count == 7) { LED_1 = 0; LED_2 = 0; LED_3 = 0; LED_4 = 0; LED_5 = 0; LED_6 = 0; LED_7 = 1; LED_8 = 0; } else if (led_count == 8) { LED_1 = 0; LED_2 = 0; LED_3 = 0; LED_4 = 0; LED_5 = 0; LED_6 = 0; LED_7 = 0; LED_8 = 1; led_count = 0; // 重置亮编号 } } } } } ``` 希望能够帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值