写在前面:转载请注明出处,如果对您有帮助,请您点个赞。
这是我13年上大学时候上单片机课写的一个题目,是:
按一次按,一个灯亮2秒(另外一个不亮),同时发送1到电脑端;同一个键按两次,刚才亮的现在暗,另外一颗亮4秒。同时发送2。
废话少说,程序如下:
#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[2]={'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;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void keyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
num=1;//标志位!
while(!key1);
for(i=200;i>0;i--)
for(j=110;j>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时
{
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[0];//一下的三句是特定结构
while(TI==0);
TI=0;
}
if(num==2)
{
ledg=0;
ledb=1;
TR0=1;
num2=2;//num2在中断函数中体现作用
num=0;
SBUF=table[1];
while(!TI);
TI=0;
}
}
}
然后,我再重点讲一下
在stc烧写软件下打开窗口助手,然后在串口助手下打开串口(在窗口下方),打开之后会有不同的地方。其他的看图就可以。
ps:
这个刚才看到:定时和计数器的功能区别。
单片机的定时器是用内部时钟信号,计脉冲的个数,
计数器是计外面的脉冲个数,
定时器用的脉冲频率是晶振频率的1/12.当计数个数达到一定值后,产生溢出,产生一个中断信号.
而计数器用的脉冲外面的脉冲,从IO输入,当计数个数达到一定值后,产生溢出,产生一个中断信号.
两者工作原理差不多.都是计数 ,用的信号来源不同.
作者: Bruce-Woo, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-1850657.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
用户832726 2015-12-10 08:39
用户1849145 2015-12-9 15:20