热度 17
2015-12-9 23:52
2106 次阅读|
2 个评论
写在前面:转载请注明出处,如果对您有帮助,请您点个赞。 这是我13年上大学时候上单片机课写的一个题目,是: 按一次按,一个灯亮2秒(另外一个不亮),同时发送1到电脑端;同一个键按两次,刚才亮的现在暗,另外一颗亮4秒。同时发送2。 废话少说,程序如下: #include #define uint unsigned int #define uchar unsigned char sbit key1=P3^4; sbit ledb=P1^0; sbit ledg=P1^1; uint num,num1,num2; int i,j; uchar code table ={'1','2'}; //先把要发送的东西向定义。记住这个格式。 uchar code 。。。 void inti() { TMOD=0x21; //这里对TMOD赋值 用定时器计数器一的方式2,自动重装 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=0xfd;// TL1=0xfd;// 这两句诗程序的难点;这需要数据计算,在波特率为9600bit/s 的情况下,初值为0xfd,这需要记住。 ledb=1; ledg=1; EA=1; ET0=1; ET1=1;//在这个程序中,实际上中断不起作用。所以也不写中断函数。 SCON=0xd8;//记住就行 PCON=0x00;//同上 TR1=1;//同上 } void delay(uint x)//延迟函数 { uint a,b; 0;a--) 0;b--); } void keyscan() { if(key1==0) { delay(10); if(key1==0) { num=1;//标志位! while(!key1); 0;i--) 0;j--)//这两句的意思是在200ms的时间内,检测有没有键按下。 { if(key1==0) { delay(10); if(key1==0) { num=2;//标志位! while(!key1); } } } } } } void Time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num1++; if(num1==40&&num2==1)//当时间走了两秒且num2为1时 { ledb=1; num1=0; TR0=0; } if(num1==80&&num2==2)//当时间走了4秒且num2为2时 { ledg=1; num1=0; TR0=0; } } void main() { inti(); while(1) { keyscan(); if(num==1) { ledb=0; ledg=1; num2=1;//num2在中断函数中体现作用 TR0=1;//打开计数器 num=0; SBUF=table ;//一下的三句是特定结构 while(TI==0); TI=0; } if(num==2) { ledg=0; ledb=1; TR0=1; num2=2;//num2在中断函数中体现作用 num=0; SBUF=table ; while(!TI); TI=0; } } } 然后,我再重点讲一下 在stc烧写软件下打开窗口助手,然后在串口助手下打开串口(在窗口下方),打开之后会有不同的地方。其他的看图就可以。 ps: 这个刚才看到:定时和计数器的功能区别。 单片机的定时器是用内部时钟信号,计脉冲的个数, 计数器是计外面的脉冲个数, 定时器用的脉冲频率是晶振频率的1/12.当计数个数达到一定值后,产生溢出,产生一个中断信号. 而计数器用的脉冲外面的脉冲,从IO输入,当计数个数达到一定值后,产生溢出,产生一个中断信号. 两者工作原理差不多.都是计数 ,用的信号来源不同.