㈠ 如何用c语言编程51单片机程序,满足从0-4小时计时,有清零,开始,暂停功能
㈡ 求大佬帮写一个C语言程序,输入一个n,能对随便某一位清零的程序
#include<stdio.h>
intmain()
{inta,n;
scanf("%d%d",&n,&a);
a&=~(1<<n);
printf("%d
",a);
return0;
}
㈢ 如何实现用C语言编写一个对可用数据内存清零程序
只能用指针实现,例如,要将内存第25个单元开始到第49个内部RAM单元清零,可以这样写:
unsigned
char
*Ptr
=
(unsigned
char
data
*)25;
unsigned
char
i;
for(i
=
0;i<25;i++)
{
*(Ptr+i)
=
0;
}
如果是要将外部RAM第25个单元开始到第49个单元清零,可以这样写
unsigned
char
*Ptr
=
(unsigned
char
xata
*)25;
unsigned
char
i;
for(i
=
0;i<25;i++)
{
*(Ptr+i)
=
0;
}
㈣ 51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等
#include<reg52.h>
//P0是数码管。P1是LED.P2是按键
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;
#defineucharunsignedchar
#defineulintunsignedlong
#defineFrequency10//定时器中断时间=f*T
#defineTime1//一个周期1ms
#defineTubeNumber6//数码管个数
#defineKeyLine4//矩阵按键行数
#defineKeyColumn4//矩阵按键列数
//数码管真值表
ucharcodeLED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//ucharcodeLED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F(b、d为小写)HLPUyo*/
ucharLED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*数码管显示缓冲区,0xff确保初始时都不亮.
不可写成ucharcodeLED_Buff[]。code定义变量写入room,不可修改*/
//矩阵按键编号到标准盘码的映射表
ucharcodeKeyCodeMap[4][4]={
(0x31,0x32,0x33,0x26),//数字键1、数字键2、数字键3、向上键
(0x34,0x35,0x36,0x25),//数字键4、数字键5、数字键6、向左键
(0x37,0x38,0x39,0x28),//数字键7、数字键8、数字键9、向下键
(0x30,0x1B,0x0D,0x27)};//数字键0、ESC键、回车键、向右键
ucharStaFlag[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键是否稳定标志
voidStartTime0();
voidTubeDisplay(ulintsec);
ulintpow(x,y);
voidTubeScan();
voidKeyAction(ucharkeycode);
voidKeyDriver();
voidKeyScan();
voidmain()
{
P1=0x08;//使能U3,选择数码管。
StartTime0();
while(1)KeyDriver();
}
//定时器0启动函数
voidStartTime0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
PT0=1;
/*定时器0优先中断控制位。
IP这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复值都是0,当我们把某一位设置为1的时候,这一位优先级就比其它位的优先级高了。
比如我们设置了PT0位为1后,当单片机在主循环或其他中断程序执行时,一旦TO发生中断,作为更高优先级,程序马上执行T0.若在T0程序执行时,
其他中断程序发生中断,仍执行TO直到T0中断结束后再执行其他程序。
*/
}
//中断服务函数
voidTo_time0()interrupt1using0
{
staticucharcnt;//记录TO中断次数
// staticulintsec;//记录经过秒速
//判断是否溢出
if(TF0==1)
{
TF0=0;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
}
if(cnt>=Frequency)
{
cnt=0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//数码管显示函数
voidTubeDisplay(ulintnom)
{
ucharm=2;//小数部分位数
uchari;//传输索引
//秒速达到上限清零
if(nom>pow(10,TubeNumber-m))nom=0;
//分别传输小数部分和整数部分
for(i=0;i<m;i++)
LED_Buff[i]=LED_Number[nom/pow(10,i)%10];
for(i=0;i<(TubeNumber-m);i++)
LED_Buff[i+m]=LED_Number[nom/pow(10,i)%10];
//点亮小数点
LED_Buff[m]&=0x7f;
}
//平方运算函数
ulintpow(x,y)//x为底,为幂
{
ulintp,i=1;
//平方运算
for(i=1;i<=y;i++)
p*=x;
//输出结果
returnp;
}
//数码管动态函数
voidTubeScan()
{
staticuchari=0;//动态扫描索引
//关闭所有段选位,数码管消隐
P0=0xff;
//for(i=0;i<Tube_number;i++)
P1=(P1&0xf8)|i;//位选索引赋值到P1口低3位
P0=LED_Buff[i];//缓冲区中的索引位置数据传输到P0口
if(++i>=TubeNumber)i=0;//索引递增循环,遍历整个缓冲区
}
//矩阵按键动作函数
voidKeyAction(ucharkeycode)
{
staticulintresult;
ulintnom=0;
//输入数字0~9
if((keycode>=0x30)&&(keycode<=39))
{
nom=(nom*10)+(keycode-0x30);//十进制整体左移,新数进入各位
TubeDisplay(nom);
}
//输入方向键
if((keycode>=0x25)&&(keycode<=28))
switch(keycode)
{
case0x26:result+=nom;nom=0;TubeDisplay(result);
case0x28:result-=nom;nom=0;TubeDisplay(result);
case0x25:result=1;result*=nom;nom=0;TubeDisplay(result);
case0x27:result=1;result/=nom;nom=0;TubeDisplay(result);
}
elseif(keycode==0x0d)TubeDisplay(result);//输入回车键,输出最终结果
elseif(keycode==0x1b)//输入ESC键,清零
{
nom=result=0;
TubeDisplay(nom);
}
}
//矩阵按键驱动函数
voidKeyDriver()
{
ucharl,c;
staticucharbackup[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键值备份,保存前一次值
for(l=0;l<KeyLine;l++)
{
for(c=0;c<KeyColumn;c++)
{
if(backup[l][c]!=StaFlag[l][c])
{//检测按键动作
if(backup[l][c]==1)//按键按下时执行
KeyAction(KeyCodeMap[l][c]);//调用动作函数
backup[l][c]=StaFlag[l][c];//刷新前一次备份值
}
}
}
}
//矩阵按键扫描函数
voidKeyScan()
{
ucharl=0;//矩阵按键扫描输出索引
ucharc=0;//矩阵按键扫描列索引
ucharkeybuff[KeyLine][KeyColumn]={(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩阵按键扫描缓冲区
//将一行的四个按键移入缓冲区
for(l=0;l<KeyColumn;l++)
keybuff[l][c]=((0xfe|(P2>>(4+l))&0x01));
//按键消抖
for(l=0;l<KeyLine;l++)
{
if((keybuff[l][c]&0x0f)==0x00)//连续4次扫描都为0,判断4*4ms内都是按下状态,可认为按键已稳定按下
StaFlag[l][c]=0;
elseif((keybuff[l][c]&0x0f)==0x0f)//连续4次扫描都为1,判断4*4ms内都是弹起状态,可认为按键已稳定弹起
StaFlag[l][c]=1;
}
for(c=0;c<KeyColumn;c++)
{
switch(c)//根据索引,释放当前输出脚拉低下次的根据索引
{
case0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}
㈤ 用定时器实现10s秒表的计时功能,精确到小数点后一位,即能够有0.1s显示,有开始,暂停,清零的功能(C语
/* 名称:10s 的秒表
说明:首次按键计时开始,再次按键暂停,第三次按键清零。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^7;
uchar
i,Second_Counts,Key_Flag_Idx;
bit Key_State;
uchar
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//处理按键事件
void Key_Event_Handle()
{
if(Key_State==0)
{
Key_Flag_Idx=(Key_Flag_Idx+1)%3;
switch(Key_Flag_Idx)
{
case 1: EA=1;ET0=1;TR0=1;break;
case 2: EA=0;ET0=0;TR0=0;break;
case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
}
}
}
//主程序
void main()
{
P0=0x3f; //显示 00
P2=0x3f;
i=0;
Second_Counts=0;
Key_Flag_Idx=0; //按键次数(取值 0,1,2,3)
Key_State=1; //按键状态
TMOD=0x01; //定时器 0 方式 1
TH0=(65536-50000)/256; //定时器 0:15ms
TL0=(65536-50000)%256;
while(1)
{
if(Key_State!=K1)
{
DelayMS(10);
Key_State=K1;
Key_Event_Handle();
}
}
}
//T0 中断函数
void DSY_Refresh() interrupt 1
{
TH0=(65536-50000)/256; //恢复定时器 0 初值
TL0=(65536-50000)%256;
if(++i==2) //50ms*2=0.1s 转换状态
{
i=0;
Second_Counts++;
P0=DSY_CODE[Second_Counts/10];
P2=DSY_CODE[Second_Counts%10];
if(Second_Counts==100) Second_Counts=0; //满 100(10s)后显示 00
}
}
图片上传不了……
㈥ 求51单片机c语言编程,要求我每按一下按钮A显示器上的数就加1,按一下按钮B显示器清零。要求c语言程序!
if(A==0) //A 按下后让连接数码管的端口显示1
{
P0=XXXX;
}
if(B==0) //B按下后让数码管不显示
{
p0=XXXX;
}
㈦ 51单片机 独立按键 计算连续按下按键的次数和连续按动时间的单片机C语言程序应该怎么写多谢!
先根据你要显示数字的个数定义一个unsigned char型的字符数组,调用扫描键盘函数,扫描到哪个键被按下的同时将键值存进对应的数组元素中,再调用液晶显示程序显示,液晶显示程序中显示的位数可变,可以
㈧ 怎么用c语言编写一个秒表,这个秒表按1停止,按0清零,求大神教!!
用到time.h文件
里面有个clock();函数,返回一个clock_t类型的数字,表示从程序运行开始,CPU的"滴答"数
而在time.h里有个常量CLOCKS_PER_SEC表示每秒钟有多少个"滴答".
这样,(((float)clock())/CLOCKS_PER_SEC)*1000这样的表达式就能得到从程序运行开始到现在的经过的时间.
程序的大致思路是这样的,程序按下1的时候记下当时的程序运行时间.
从这时起,每时刻捡取程序运行时间,然后减去先前的值,就可以得到已经计时的时间了.
只要让用户按下0结束计时就好了
在conio.h文件里,有个函数kbhit()是个非阻塞函数,用来检查键盘缓冲里有没有按键按下,若有,则返回1,若没有,则返回0,以此来作为判断,若返回1,则捡取按键,测试它是不是0或者1,若返回0,则表示用户没有动作,继续原来的工作,即继续计时或等待命令.
㈨ 利用定时器 按下一个按键后 如何让一个数自动减一 用C语言写请教 啊
C语言中哪里来的按钮啊,看来你没搞清楚,C基本不设计界面的问题
如果非要用C来做,可以使用time函数,但效率会低一点。如下
#include "time.h"
#include "malloc.h"
int main(int argc, char* argv[])
{
time_t *clock=(time_t*)malloc(sizeof(time_t));
struct tm *mytime=(tm*)malloc(sizeof(tm));
int sec, curTime;
int num = 10; //需要减一的数,为0结束
while( num >=0 ){
time(clock);
mytime = localtime(clock);
sec = mytime->tm_sec;
num --;
printf("%d\n",num);
curTime = sec;
while(sec == curTime ){ // 隔1秒,减1,可以根据情况修改。效率在这里低下
//因为是单线程
time(clock);
mytime = localtime(clock);
curTime = mytime->tm_sec;
}
}
return 0;
}
程序运行是每隔1秒输出一个数。
原理是用time取得当前的时间,然后判断当前时间的秒有没有变化
㈩ 51单片机,2个按钮2个数码管,实现外部清零与计数,一个按钮按一下加1
另类计数器,仿真实例,可以参考一下,仿真试试。
功能,1个主机---3个从机,主机 按键 1#、2#、3#、分别控制 从机 1、2、3、
按钮按一下加1, 从机 x1# 控制主机按钮按一下加1,
主从机的 另一个 按键 为清零。