原创 C51入门程序 串口通信 和多次按键

2015-12-9 23:52 2104 15 17 分类: MCU/ 嵌入式
写在前面:转载请注明出处,如果对您有帮助,请您点个赞。

这是我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[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时
{
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[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输入,当计数个数达到一定值后,产生溢出,产生一个中断信号.
两者工作原理差不多.都是计数 ,用的信号来源不同.
20151209235155943.jpg
 
20151209235235977.jpg


 
 
 

作者: Bruce-Woo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1850657.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论2条评论)

登录后参与讨论

用户832726 2015-12-10 08:39

谢谢

用户1849145 2015-12-9 15:20

谢谢分享
相关推荐阅读
Bruce-Woo 2023-03-07 15:14
嵌入式面试之系统
最近一段时间在开始找工作,自己以前也面试过其他人,想从实际工作的角度,来提出一些有意义的问题并做一些浅薄的解答,期望帮助到找工作或者刚开始当面试官的朋友。我把面试要准备的地方列成一下几个注意点,大家...
Bruce-Woo 2023-02-25 21:59
芯片选型的思路
近来在面试,不知为何很多人问起我刚毕业的时候的项目中的一个芯片选型的事情,回过头来整理下,希望可以帮助到后面的朋友1. 开发难度 开发难度,要考虑本身的程序员的开发能力,擅长的领域和工具等。综合下你...
Bruce-Woo 2021-03-17 14:19
记一次调用动态库报错的处理过程( undefined symbol)
最近工作在调用其他同事的一个动态库的时候发现有 未识别的错误 特此记录一下         首先我们用ldd查一下动态库连接是否有问题   ...
Bruce-Woo 2021-03-11 15:03
ubuntu16.04下安装svn
SVN和GIT相信是大家使用最多的代码协同工具,不过可能在win下用的比较多,那今天在ubuntu上运行一遍,操作都差不多。某种程度上讲,我也更喜欢指令操作。1. 远程登录虚拟机,也可以页面操作,看个...
Bruce-Woo 2021-02-09 01:08
2020,我想和你谈谈
这篇文字无关技术,也没有代码。 这是最好的时代,也是最坏的时代!写在回家前夜。 不到10个小时后就要开始坐车回家,手头的工作也没有做完。正经的事儿没完成,乱七八糟的事情倒是想了不少,说话是一种表达方...
Bruce-Woo 2021-01-19 12:34
cmake的安装过程
今天在编译opencv的时候突然发现cmake失败,显示版本不同遂决定修复之方法如下下载更高版本cmake,可在cmake官网下载 解压 tar -zxvf cmake-3.19....
我要评论
2
15
关闭 站长推荐上一条 /2 下一条