要多练,多练C语言程序,练习C语言程序编程思路,可以把别人的程序改改,找些电路焊接调试
AD985可以产生方波,三角波,正弦波
低通滤波器是通过低频阻止高频,作用是滤除杂波
液晶显示单片机状态
运算放大器放大波形
积分器将方波积分成三角波
AD985里面有比较器可以将正弦波变成方波
AD985是5伏的,单片机是3伏的,两者之间要有个电压转换器
数码管不仅可以用锁存器来驱动,也可以用三极管来驱动
一个函数用来刷新秒,分,时
键盘调节用三个键:功能键(秒的光标在闪烁,此时可以调节时间,分和小时同理),功能键第一次按键调节秒,第二次调节分,第三次调节小时,第四次恢复(程序中可以用一个变量计数,这个变量是几就执行相应的程序);TX-1C型单片机实验板原理图中因为LCDEN和RS用了,就不用它们做键盘了,可以用S9,S13,S17,使用时将RD置0,只需检测P3.0,P3.1和CSDA,键盘上最右列的三个,检测这三个键哪个键为低电平,就能知道哪个键被按下,这里把矩阵键盘(P3.0,P3.1和CSDA)当独立键盘使用
编程时,先让液晶显示,再利用定时器定时显示时间,先显示秒,再显示分和十,再做键盘调节,先做一个键调节,然后做其它键调节
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;//键盘的三个功能键
sbit s2=P3^1;
sbit s3=P3^2;//对应于CSDA
sbit rd=P3^7;//将RD置0,检测P3.0,P3.1和CSDA的状态是否为低电平
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2007-7-30 MON";//加上空格为向右移动再显示
uchar code table1[]=" 00:00:00";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
dula=0;//开始要关断数码管
wela=0;
lcden=0;
// fen=59;
// miao=53;
// shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar add,uchar date)//写时或分或秒(2位数),add 是位置,date是数值
{
uchar shi,ge;
shi=date/10;//因为数码管一位一位显示,时,分,秒都是两位数,要分开
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);//见字符手册的PDF的P11,例如6是30+6
write_date(0x30+ge);
}
void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);//消抖
if(s1==0)//第一个功能键的作用,让秒钟停止闪烁
{
s1num++;
while(!s1);//键盘松手才开始执行功能键的下列程序
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);//光标的地址,因为写一下光标就跳到后一位,为了让光标在秒那要重写下光标的地址
write_com(0x0f);//光标闪烁
}
}
if(s1num==2)//第一个功能键的第二次按下,改变分
{
write_com(0x80+0x40+7);
}
if(s1num==3)//第一个功能键的第三次按下,改变小时
{
write_com(0x80+0x40+4);
}
if(s1num==4)//光标不再闪烁,计数器继续工作
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
if(s1num!=0)//第一个键按下之后,第二个和第三个键才好使,如果把对第二个和第三个键进行控制的程序放在第一个if(s1==0)语句里面,只有当第一个键按下的瞬间第二个或第三个键也被按下,才能执行第二个或第三个键的程序,所以应该在第一个if(s1==0)语句并列的位置写程序对第二个和第三个键进行控制
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);//等待松手,如果不等待松手单片机就会在键盘按下的时
间里程序执行很多次
if(s1num==1)//当s1num==1,表示第一个键秒钟闪烁,即另两个键的按下可以用s1num的值来判断
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);//改变秒的数值后显示,第一个参数不能写成0x10,写成0x10就会出错
write_com(0x80+0x40+10);//光标指到秒的位置,从左往右数,数到秒的十位处
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
/* if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}*/
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
// while(1);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)//因为是12MHZ,所以不是count=20(对应11.0592MHZ)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);//到一秒只要秒不到60秒进位就改变显示,因为 table1[]=" 00:00:00";
//对于秒的位置是十,即前面空了十个空格,所以第一个参数是10,该句和第一个if是并列的关系
}
}
星期可以用switch case语句
我的程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit rd=P3^7;
sbit s1=P3^1;
sbit s2=P3^2;
sbit s3=P3^3;
uchar code table[]=" 2012-12-31 MON";
uchar code table1[]=" 23:59:50";
uchar code table2[]="MONTUEWEDTHRFRISATSUN";
uchar count,s1num,flag;
char shi,fen,miao,xq,day,month;
int year;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
shi=23;
fen=59;
miao=50;
xq=0;
day=31;
month=12;
year=2012;
dula=0;
wela=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void displayxq(uchar num)
{
uchar kk;
write_com(0x80+12);//星期的位置是从左数第十二位
for(kk=0;kk<3;kk++)
{
write_date(table2[num+kk]);
}
}
void write_xq(char date)//date是0到6,0到6对应星期一到星期日
{
uchar num;
date++;
if(date==7)
date=0;
switch(date)
{
case 0:num=0;
break;
case 1:num=3;
break;
case 2:num=6;
break;
case 3:num=9;
break;
case 4:num=12;
break;
case 5:num=15;
break;
case 6:num=18;
break;
}
displayxq(num);
}
void write_y(uchar add,int date)//这里date是2012,要用合适的类型定义
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_md(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_rq(char date)
{
date++;
if((year%4==0 && year%100!=0) || year%400==0)
flag=1;
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10)
{
if(date==32)
{
date=1;
}
month++;
}
if(month==2)
{
if(flag==1)
{
if(date==30)
{
date=1;
}
}
if(flag==0)
{
if(date==29)
{
date=1;
}
}
flag=0;
month++;
}
if(month==4 || month==6 || month==9 || month==11 )
{
if(date==31)
{
date=1;
}
month++;
}
if(month==12)
{
if(date==32)
{
date=1;
month=1;
}
year++;
if(year==10000)
year=0;
}
write_md(9,date);
write_md(6,month);
write_y(1,year);
}
void keyscan()
{
uchar num;
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
write_com(0x80+12);
}
if(s1num==5)
{
write_com(0x80+9);
}
if(s1num==6)
{
write_com(0x80+6);
}
if(s1num==7)
{
write_com(0x80+1);
}
if(s1num==8)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
xq++;
if(xq==7)
xq=0;
switch(xq)
{
case 0:num=0;
break;
case 1:num=3;
break;
case 2:num=6;
break;
case 3:num=9;
break;
case 4:num=12;
break;
case 5:num=15;
break;
case 6:num=18;
break;
}
displayxq(num);
write_com(0x80+12);
}
if(s1num==5)
{
day++;
if((year%4==0 && year%100!=0) || year%400==0)
flag=1;
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10)
{
if(day==32)
{
day=1;
}
}
if(month==2)
{
if(flag==1)
{
if(day==30)
{
day=1;
}
}
if(flag==0)
{
if(day==29)
{
day=1;
}
}
flag=0;
}
if(month==4 || month==6 || month==9 || month==11 )
{
if(day==31)
{
day=1;
}
}
if(month==12)
{
if(day==32)
{
day=1;
}
}
write_md(9,day);
write_com(0x80+9);
}
if(s1num==6)
{
month++;
if(month==13)
month=1;
write_md(6,month);
write_com(0x80+6);
}
if(s1num==7)
{
year++;
if(year==10000)
year=0;
write_y(1,year);
write_com(0x80+1);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
xq--;
if(xq==-1)
xq=6;
switch(xq)
{
case 0:num=0;
break;
case 1:num=3;
break;
case 2:num=6;
break;
case 3:num=9;
break;
case 4:num=12;
break;
case 5:num=15;
break;
case 6:num=18;
break;
}
displayxq(num);
write_com(0x80+12);
}
if(s1num==5)
{
day--;
if((year%4==0 && year%100!=0) || year%400==0)
flag=1;
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10)
{
if(day==0)
{
day=31;
}
}
if(month==2)
{
if(flag==1)
{
if(day==0)
{
day=29;
}
}
if(flag==0)
{
if(day==0)
{
day=28;
}
}
flag=0;
}
if(month==4 || month==6 || month==9 || month==11 )
{
if(day==0)
{
day=30;
}
}
if(month==12)
{
if(day==0)
{
day=31;
}
}
write_md(9,day);
write_com(0x80+9);
}
if(s1num==6)
{
month--;
if(month==0)
month=12;
write_md(6,month);
write_com(0x80+6);
}
if(s1num==7)
{
year--;
if(year==0)
year=9999;
write_y(1,year);
write_com(0x80+1);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
write_xq(xq);//星期++的判断和显示都放到子函数里,和放到此中断函数
里效果相同
write_rq(day);//日期++的判断和显示都放到子函数里,和放到此中断函数里效果相同
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
文章浏览阅读200次。在该jar包所在目录,清空目录,输入cmd。_cmd导入jar包
文章浏览阅读1w次。vi有自带的教程,我用的是windows下的vim这里是引用他人的教程参考0.0 - 引言 -- 我怎样用这个FAQ这个文档分为了几个部分.首先,第0节和第1节介绍了什么是vi;第2节则收录了很多新学者的问题,一些对vi没有很多经验的人也经常问这些问题.这里面包括诸如“命令模式和插入模式之间的区别”,以及“我怎样拷贝和粘贴”之类的问题.第3节是面向vi的中级用户的,它从问题“我如..._一_-hcj#&hhvi&/nbjkkkki-b%5u
文章浏览阅读1k次。在cocos2d-x中一切可视化的元素都集成自Node,zhe's_cococs cocos2d::node 使用
文章浏览阅读74次。20180806 考试记录 T1 【NOIP2013模拟联考8】最短路(path)Solution设s为第0个标记点,t为k+1个跑k+1次最短路然后全排列暴力求解qwq注意最大值要设为long long范围最大值CodePS:各种修改qwq//By Menteur_Hxy#include<queue>#include..._i <= 3000000000u
文章浏览阅读190次。点击关注公众号,实用技术文章及时了解作者:LanceToBigDatacnblogs.com/zhangyinhua/p/7620964.html说起MySQL的查询优化,相信大家积累...
文章浏览阅读921次。云函数/云函数本地调试云函数是云开发其中一项基础能力,在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码。云函数个数免费版云函数数量上限为 50写完自己的原函数后,可以通过云函数的本地调试来进行调试,调试没有问题了就可以上传云端,对于解决bug查找bug是很好用的使用像调试自己的哪一个云函数就直接右键开启本地调试即可。就是这样一个页面此时运行自己的云函数就是在本地运行不是再云端给运行了。可以调试没问题后再传到云端,有时候会弹出一个错误解决方法:右键点击你_本地云函数调试并发数量限制
文章浏览阅读922次。为什么需要cache在思考为什么需要cache之前,我们首先先来思考另一个问题:我们的程序是如何运行起来的?我们应该知道程序是运行在 RAM之中,RAM 就是我们常说的DDR(例如: DDR3、DDR4等)。我们称之为main memory(主存)。当我们需要运行一个进程的时候,首先会从磁盘设备(例如,eMMC、UFS、SSD等)中将可执行程序load到主存中,然后开始执行。在CPU内部存在一堆的通用寄存器(register)。如果CPU需要将一个变量(假设地址是A)加1,一般分为以下3个步骤:_ddr3面试的问题
文章浏览阅读3.1k次。public static void main(String[] args){ List<String> list = new ArrayList<>(); list.add("abc"); list.add("df"); System.out.println(String.join(",",lis..._java8list转string list
文章浏览阅读1.1k次,点赞2次,收藏3次。满二叉树一棵深度为k,且有2^k-1个节点的树是满二叉树。另一种定义:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。这两种定义是等价的。从树的外形来看,满二叉树是严格三角形的,大家记住下面的图,它就是满二叉树的标准形态:所有内部节点都有两个子节点,最底一层是叶子节点。性质:1)如果一颗树深度为h,最大层数为k,且深度与最大层数相同..._证明若一棵树中的每一棵子树都包含2^k-1个节点
文章浏览阅读741次。启动Redis服务创建数据库创建或者连接已经存在的数据库jeecg-boot启动JeecgBoot框架后端启动JeecgBoot框架后端jeecg-boot-zc-dv启动JeecgBoot框架前端启动JeecgBoot框架前端ant-design-vue-jeecg-zc-dv登录系统安装DataV组件库打开JeecgBoot框架前端ant-design-vue-jeecg-zc-dv:cd ant-design-vue-jeecg-z._jeecg怎么添加组件库
文章浏览阅读3.3w次,点赞8次,收藏2次。最近安装VMware Workstation 12的时候,遇到了下面的问题:在网上搜了一堆答案,有人说要右键“我的电脑” -> “管理” -> “服务”里面去设置,有人说要安装 vs/vc运行库,还有到 BIOS 中去设置 Intel Virtualization Enable。照这么做完,还是照样出错。后来搜到一个靠谱的:这时不要点确定。开始菜单运行输入‘%temp%’,_microsoft net runtime 6.0.16安装程序无效。
文章浏览阅读72次。1、将数据库和监听程序关闭2、首先检查OPatch版本是否符合要求:$ORACLE_HOME/OPatch/opatch lsinventory3、若不符合要求,需先更新opatch:mv 掉原有的OPatch目录mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatchbakcp p6880880_112000_SOLARIS64-opatch11.2.0.3.12.z..._oracle9i 打补丁时ouihome设置