第一篇:简易分析报告[最终版]
1、***公司2012年1-10月收入实现25.46万元,其中物业管理收入20.13万元;垃圾清运收入1.92万元;车位出租收入(停车费)3.41万元。
2、下面通过与去年同期数据相比进行收入简易分析:
⑴物业管理收入比去年同比增长实现16.1124万元,同比增长率达400%;垃圾清运收入比去年同比增长实现1.0173万元,同比增长率达113%,主要原因:①去年因刘强荣个人问题使公司收入流失一部分,造成去年物业管理收入、垃圾清运收入偏低。②今年2栋业主陆续入住、公司管理水平提高,每月物业管理费能及时收取。
⑵车位出租收入是公司今年采取开源创收,增添新的收费(入)项目,2012年1月-10月车位出租收入有实现3.406万元。
⑶公司2012年总收入比去年同期增长实现20.5383万元,同比增长率417%。
二、*****公司2012年1月-10月费用情况:
1、****公司2012年1月-10月管理费用58.42万元,其中:物业员工工资19.2349万元;保洁费4.181万元;保安费25.5161万元;办公费2.7916万元;差旅费0.1043万元;低值易耗品摊销1.8114万元;招待费0.4855万元;维修费0.7364万元;电话费0.09万元;培训费0.459万元;物料消耗费0.9282万元;其它2.0825万元。
2、下面通过与去年同期数据相比对主要费用项目进行简易分析:
⑴低值易耗品摊销比去年同比增长实现1.4448万元,同比增长率达394%;物料消耗比去年同比增长实现0.563万元,同比增长率达154%,主要原因:①小区停电时,需耗用柴油发电;今年水管爆裂几次,物料消耗较多。
⑵公司员工工资比去年同比负增长实现0.7629万元,同比负增长率3.81%,主要原因:①去年员工工资含保洁员、保安工资,由于今年1-10月份不含保洁员、保安人员工资,虽然人数减少了,但公司提高其他在岗员工的工资基数,所以仅内部员工工资就已经达到19.2349万元,从另一个角度而言是“不减反增”。
⑶保洁工资比去年同比增长实现4.181万元,同比增长率418%;保安工资比去年同比增长实现25.5161万元,同比增长率2551%,主要原因:已对外包,无法控制人力成本。
三、*****公司财务费用情况:
1、****公司2012年1-10月财务费用为0.1191万元,其中银行手续费0.0895万元;存款利息-0.0633万元;账户管理费0.0404万元;其他0.525万元。
2、财务费用比去年有近40倍的增长,主要原因是有段时间汇邦永兴分公司账户被封,所有资金需通过物业账户进出造成财务费用成倍增长。
四、****物业收入、费用综合分析:
1、①***公司2012年1月-10月收入比去年同比增长21万元,同比增长率达417%;②费用比去年同比增长28万元,同比增长率达246%;③营业税金及附加比去年同比增长1万元,同比增长率达397%;④净利润比去年同比负增长9万元,同比负增长率达36.77%
2、综上分析,得出以下结论:
****公司2012年1-10月份处于亏损状态,亏损原因主要是虽然收入增长速度快、增长幅度大,可因费用开支过大,特别是保安、保洁这两项支出,需要压缩费用开支,减少亏损。
「标签: 公司财务分析报告」
第二篇:简易方程教材分析
五年级上册第四单元
简易方程知识树说明
(一)单元教材解读
本单元是在学生充分理解了四则运算的意义和会用字母表示数的基础上进行学习的。从用字母表示数到简易方程,是代数思维方式的进一步发展,这既是学生对所学的运算意义和数量关系的应用,又是学生进行第三学段代数知识学习的基础,具有重要地位。
本单元的主要教学内容是:方程的意义,等式的性质,解简易方程和用方程解决问题。其中解简易方程和用方程解决问题既是本单元的重点也是难点。
本单元教材编写的主要特点:
1、素材的选取能够唤起学生保护动物的意识。
动物是人类的朋友,但是由于环境的变化和人类的活动,白鳍豚、大熊猫、东北虎、金丝猴、黑鹳等很多动物濒临灭绝。本单元以这些珍稀动物数量变化情况为素材,注重了素材的现实性,同时突出了数据的真实性。使学生在学习数学知识的同时,体会数学与生活的密切联系,唤起学生保护珍稀动物的意识。
2、借助天平来学习知识是本单元一大特点。
本单元在编排时,无论是理解方程的意义、探索等式的性质,还是学习解方程都是借助于天平来帮助学生直观理解,教材将抽象的数学知识形象化,让学生在观察、实验、猜测、验证、推理和交流的活动中学习数学知识,体会数学学习的方法。
3、信息窗中的信息循环使用。信息窗中的信息循环使用是本单元教材编写的又一特点。如信息窗1中的信息在解决信息窗2中的“2004年白鳍豚大约有多少只?”问题时,进行了循环使用;信息窗1中的信息又在解决信息窗3中的“人工养殖的大熊猫有多少只呢?”、“2003年基地有多少只东北虎?”两个问题时进行循环使用。这样,既使学习资源得到了充分利用,同时也体现了前后知识间的内在联系。
4、根据解决问题的需要安排知识结构。
本单元知识结构的编排,是遵循解决问题的需要而设置的,体现了数学知识学习的必要性。如:学生在解决信息窗2中的问题时,先列出了方程,同时产生了解方程的需要,顺应这种需要,教材先安排了等式性质的知识,然后再解方程,呈现解决问题的真实过程,体现了学习方程知识的必要性。
(二)单元学与教建议
1、引导学生转变思维方式。
在此之前,学生解题一般列“算术式”,通常称之为“算术法”。本单元,首次学习用列方程的方法解题,这在思维方式上是一个大的转变。用“算术法”解逆向思维的题目,难度比较大。而“方程法”则是把“未知数”看作是“已知数”,让这个“已知数”也参与列式,将一道逆向思维的题目变成了顺向思维的题目,大大降低了思维难度。因此,初学方程时,教师要注意引导学生实现由“算术思维”向“方程思维”的转变。
2抓住列方程解题的关键。
列方程解决问题的关键是寻找等量关系,所以教学中教师要引导学生通过实例,进行有关找等量关系方面的练习,突破列方程解题的难点。
3、加强操作活动,让学生充分经历概念形成的过程。
要使学生真正理解方程的意义和等式的性质,绝不能单凭猜测和想象完成,应该按教材的编写意图,借助天平让学生亲自参与操作和实验,在经历天平由平衡→不平衡→平衡的动态过程中,加深对方程及等式意义的理解。
4、注意培养学生认真、仔细的学习习惯。
对计算结果进行检验,是一种良好的学习习惯,因此,在教学中,教师要注重引导学生掌握检验的方法,使学生逐步养成自觉检验的意识,并能够通过检验及时对结果进行矫正。
5、本单元建议课时数:9课时。
第三篇:verilog简易数字频率计报告
一、实验原理
根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,在数码管中显示出来。
二、方案论证
一、通过50M的时钟进行计数获得精密的1HZ——计数器用Verilog HDL语言实现在1HZ为底电平时计数——门控电路用或门开启——1HZ为高电平时进行数据锁存与显示——利用Verilog HDL语言使前面的0不显示。
计数器用Verilog HDL语言在写代码时可以用复制粘贴的方法可以简便的实现。通过50M的时钟进行计数获得精密的1HZ后只是经过很短的时间内进行计数器的清零及数据的琐存,并且得到的是1HZ的精密时钟。把锁存的数据进行清0的转换后利用分时扫描,后通过数码管译码显示。
说明:
Cnt9999:0000~9999计数器; Buffer:锁存器; Scan:扫描显示 共8个模块
三、实验步骤
一、计数器模块 计数器模块的仿真波形
二、锁存模块
利用32位的D触发器进行储存计数器送给它的数据。在时钟为上升沿的时候触发保存数据。锁存模块的源代码:
module buffer_32(clr,clear,in,out);input
clear,clr;input[31:0] in;output[31:0] out;reg[31:0]
out;always@(posedge clear or negedge clr)
if(!clr)out<=0;
//else if(clear)out=in;
else out<=in;
endmodule
三、转化清零模块 波形仿真波形
module cnt9999(clr,clk,q,c);
input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;
always @(posedge clk or negedge clr)begin
if(!clr)begin q[15:0]<=0;c<=1'b0;end
else if(q[15:0]==16'H9999)begin q[15:0]<=0;c<=1'b1;end
else if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;end
else if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;end
else if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;end
else begin q[15:0]<=q[15:0]+1'b1;c<=1'b0;end end endmodule
四、扫描显示模块
把存储的数据分别分给8个数码管,利用循环扫描即可显示出所要显示的数据。
扫描显示模块的仿真波形
module scan(clk,q);input clk;output [2:0]q;reg
[2:0]q;
always @(posedge clk)
begin
q=q+1;
end
endmodule
四、引脚分配
五、实验总结
频率就是信号在1s内发生相同变化的次数,简易频率计就是基于这个原理设计的。我们先产生一个低电平为1s,高电平为1/50M秒的周期信号clk,用该信号与待测信号相与作为计数器的输入时钟,并把clk的上升沿作为缓存器的开关,把clk的高电平作为计数器的清零信号,这样就能保证缓冲器中存放的始终是待测信号在一秒内的跳变次数,也即待测信号的频率。
实验的原理尽管很清楚,但真正看到实验现象还是经历了一番波折,在写8选1数据选择器的时候,定义模块端口时,由于疏忽,把四位位宽漏写成了1位,结果在数码管上显示的始终只有0和1两种数字。为了改正这个错误,我把程序的主要模块都检查了一遍,结果不管怎么改实验现象都没有出来,这让我郁闷了很长一段时间,原理明明是对的,为什么就没有效果呢?最后我把整个程序都打印出来,一行一行地检查,最后终于找到了症结所在,就是8选1数据选择器的位宽弄错了!经历了这次错误,让我明白了写程序还是不能大意,8选1数据选择器虽然简单,却因为位宽这个小小的错误让我浪费了很长的时间,检查错误时也因为其简单而没有认真对待。
第四篇:简易留言板课程设计报告
武汉软件工程职业学院
课程设计报告
2016-2017学第 二 学期
题目:
简易留言板设计
姓名:
肖志超
班级:
网络1502
系部:
计算机学院
指导教师:
梁晓雅
日期:2017年6月13日
[摘要]
在网络网络技术迅速发展以信息交流频繁的今天,网络应用已经渗透到人类社会的各个角落。作为网络世界的支撑点的网站,更是人们关注的热点:政府利用网站宣传自己的施政纲领,日益成为与百姓交流的直通车;企业利用网站宣传自己的形象,进而挖掘无限商机;个人利用网站展示个性风采,创建彼此沟通的桥梁。越来越多的网站建立了自己的www.xiexiebang.command cmd = new SqlCommand(yh, conn);
if((int)cmd.ExecuteScalar()> 0){ string yhx = “admin”;string yhxx = “select count(*)from userinfo where uname='” + TextBox1.Text.Trim()+ “'and upwd='” + FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text.Trim(), “MD5”)+ “'and ulevel='” + yhx + “'”;SqlCommand cmd1 = new SqlCommand(yhxx, conn);if((int)cmd1.ExecuteScalar()> 0){ Session[“sf”] = “admin”;Session[“s”] = TextBox1.Text.Trim();} else { Session[“sf”] = TextBox1.Text.Trim();;} Response.Redirect(“xgxx.aspx”);} else { Response.Write(“”);}
}
protected void LinkButton1_Click(object sender, EventArgs e){
string yh = “select count(*)from userinfo where uname='” + TextBox1.Text.Trim()+ “'and upwd='”
+FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text.Trim(),“MD5”)+ “' ”;conn.Open();SqlCommand cmd = new SqlCommand(yh, conn);
if((int)cmd.ExecuteScalar()> 0){ Session[“uname”] = TextBox1.Text;
Response.Redirect(“ly.aspx”);} else { Response.Write(“”);}
}
4.2.新用户注册
在登录页面点击注册即可进入新用户注册页面
核心代码如下
static string Coonstr = System.Configuration.ConfigurationManager.ConnectionStrings[“coonstring”].ToString();SqlConnection conn = new SqlConnection(Coonstr);static int i = 1;protected void Page_Load(object sender, EventArgs e){ }
protected void LinkButton2_Click(object sender, EventArgs e){ Response.Redirect(“Default.aspx”);}
protected void LinkButton3_Click(object sender, EventArgs e){ string xyh = “select count(*)from userinfo where uname='” + TextBox1.Text.Trim()+ “'”;conn.Open();SqlCommand cmd = new SqlCommand(xyh, conn);
if((int)cmd.ExecuteScalar()> 0){ Label1.Text = “用户名重复”;} else { Label1.Text = “可以使用的用户名”;int i = 0;} }
protected void LinkButton1_Click(object sender, EventArgs e){
conn.Open();if(i!= 0){ string ss = “user”;//string cyh = “insert into userinfo values('” + TextBox1.Text + “','” + TextBox2.Text + “','” + TextBox4.Text + “','” + ss + “''” + DropDownList1.SelectedValue.ToString()+ “','” + FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox5.Text, “MD5”)+ “')”;string cyh = “insert into userinfo(uname,upwd,uemail,ulevel,uquestion,uanswer)values('” + TextBox1.Text + “','” + FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text, “MD5”)+ “','” + TextBox4.Text + “','” + ss + “','” + DropDownList1.SelectedValue.ToString()+ “','” + FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox5.Text, “MD5”)+ “')”;SqlCommand cmd = new SqlCommand(cyh, conn);int num = cmd.ExecuteNonQuery();if(num > 0){ Response.Write(“”);} else { Response.Write(“”);} } else { Response.Write(“”);}
}
4.3找回遗忘的密码
在用户登录界面中输入用户名,单击“忘记密码”链接按钮打开如图所示的界面,程序根据用户输入的用户名,在页面中显示注册时填写的安全问题,若用户能正确回答安全问题答案,即可重置密码
核心代码如下
public partial class zhmm : System.Web.UI.Page { static string Coonstr = System.Configuration.ConfigurationManager.ConnectionStrings[“coonstring”].ToString();SqlConnection conn = new SqlConnection(Coonstr);protected void Page_Load(object sender, EventArgs e){ if(!IsPostBack){ Label1.Text = Convert.ToString(Session[“zhmm”]);if(Label1.Text==“"){ Response.Redirect(”Default.aspx“);}
DropDownList1.Items.Clear();conn.Open();this.DropDownList1.Items.Add(”“);string mm = ”select uquestion from userinfo where uname='“+Session[”zhmm“]+”'“;SqlCommand sql = new SqlCommand(mm, conn);SqlDataReader dr = sql.ExecuteReader();while(dr.Read()){ this.DropDownList1.Items.Add(dr[”uquestion“].ToString());}
}
}
protected void LinkButton1_Click(object sender, EventArgs e){ string m = ”select count(*)from userinfo where uname='“ + Session[”zhmm“] + ”'and uanswer='“ + FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox1.Text.Trim(), ”MD5“)+ ”'and uquestion='“ +DropDownList1.SelectedValue.ToString()+ ”'“;conn.Open();SqlCommand cmd = new SqlCommand(m, conn);
if((int)cmd.ExecuteScalar()> 0){ Response.Write(”“);} else { Response.Write(”“);} }
protected void LinkButton2_Click(object sender, EventArgs e){ Response.Redirect(”Default.aspx“);}
4.4.修改用户信息
在用户登录页面中输入用户名和密码,单击“修改用户信息”链接按钮讲打开用户管理页面。管理员用户可以使用页面中的所有功能,而普通用户只能修改自己的密码,电子邮箱等信息。
核心代码如下
public partial class xgxx : System.Web.UI.Page { static string Coonstr = System.Configuration.ConfigurationManager.ConnectionStrings[”coonstring“].ToString();SqlConnection conn = new SqlConnection(Coonstr);protected void Page_Load(object sender, EventArgs e){ if(!IsPostBack){ if((string)Session[”sf“] == ”admin“){ string dr = ”select uname ,uemail,ulevel from userinfo where ulevel='user'“;DropDownList1.Items.Clear();conn.Open();DropDownList1.Items.Add(Session[”sf“].ToString());DropDownList2.Items.Add(”admin“);SqlCommand sql = new SqlCommand(dr, conn);SqlDataReader dr1 = sql.ExecuteReader();while(dr1.Read()){ this.DropDownList1.Items.Add(dr1[”uname“].ToString());} conn.Close();
string drq = ”select uname ,uemail,ulevel from userinfo where ulevel='“ + Session[”s“] + ”'“;conn.Open();SqlCommand sq1l = new SqlCommand(drq, conn);SqlDataReader dr11 = sq1l.ExecuteReader();
while(dr11.Read()){ TextBox3.Text = dr11[”uemail“].ToString();
} } else { DropDownList1.Items.Add(Session[”sf“].ToString());DropDownList1.Enabled = false;DropDownList2.Items.Add(”user“);LinkButton2.Enabled = false;} } }
protected void LinkButton1_Click(object sender, EventArgs e){conn.Open();string cz = ”update userinfo set upwd='“
+FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text.Trim(),”MD5“)+ ”',uemail='“+TextBox3.Text.Trim()+”' where uname='“ + Session[”sf“] + ”'“;SqlCommand cmd = new SqlCommand(cz, conn);if((int)cmd.ExecuteNonQuery()> 0){ Response.Write(”“);} }
protected void LinkButton3_Click(object sender, EventArgs e){ Response.Redirect(”Default.aspx“);}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e){ TextBox3.Text = ”“;string yx = ”select uemail,ulevel from userinfo where uname='“+DropDownList1.SelectedValue.ToString()+”'“;conn.Open();DropDownList2.Items.Clear();SqlCommand sql = new SqlCommand(yx, conn);SqlDataReader dr1 = sql.ExecuteReader();while(dr1.Read()){ TextBox3.Text = dr1[”uemail“].ToString();DropDownList2.Items.Add(dr1[”ulevel"].ToString());}
}
五、总结
做课设让我对ASP.NET有了新的认识,首先我接触了很多上课见过见过但没有实际用过的类和方法,让我对编程有了许多新的思想。虽然系统的基本功能都已实现,但还是存在系统不稳定等多个问题尚待解决。这个系统主要是我自己开发的,但也得到了老师和同学的很大帮助。我正在做系统的过程中遇到了很多问题,有的是知识存储不足,有的是考虑不够周全,之所以能够顺利实现基本功功能,离不开老师和同学的大力相助。事实证明,只靠自己是不能顺利完成一套功能完整的系统的,必须充分利用团队的力量。开发一套系统,最重要的是细心,并不是一定要做到面面俱到,但也要充分考虑到客户的需求和现实意义,不管什么系统,只用运用到实际应用中,才具有先现实意义。所以在准备工作中要正确分析社会需求了解现实应用,画出流程图,把大体框架做好,然后再逐一细化。我们不可能做到面面俱到,但一定要做到步步扎实,作为一个程序编程人员,要保持清醒的头脑,以现实为依据,让自己的每一行代码都能实现自己的意义。通过这次课程设计,我收获的不仅仅是课程上的知识得到实际应用,还有编程的基本习惯和开发系统时应注意的流程。这次课程设计本人主要参与了系统实现以及系统测试,还有参与小组共同完成的编写代码、实现功能模块。历时两个星期终于在大家的一起努力下顺利完成了。虽然过程辛苦是不可避免,但收获还是令人感到尤其的欣慰。在这次的课程设计中不仅检验了我所学习的知识,也培养了我的实践能力,让我知道遇到一个问题,如何去寻找思路,如何去解决问题,最终完成整个事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了宽容,学会了理解,也学会了做人与处世。课程设计是我们专业课程知识综合应用的实践训练,是我们迈向社会,从事职业工作前一个必不少的过程。实验过程中,也十分感谢实验指导老师马骏老师的指点与教导。这次课程设计不仅是对这学期所学知识的一种综合检验,而且也是对自己动手能力的一种提高,增强了自己实践能力。通过这次课程设计使我明白了自己知识还比较欠缺,只是学习书本知识还是远远不够的,自己不会的东西还有太多,学习需要自己长期的积累,在以后的学习、工作中都应该不断的学习,将课本的理论知识与生活中的实践知识相结合,不断提高自己文化知识和实践能力.参考文献
常永英,ASP.NET程序设计教程(C#3)[M].北京:机械工业出版社,2007.常永英,ASP.NET程序设计教程(C#3)[M].上机指导与习题解答。北京:机械工业出版社,2007.崔淼.VisualC#2005程序设计教程[M]。北京:机械工业出版社,2007.张亚习.精通ASP.NET3.5网络开发技术[M].北京:电子工业出版社,2009.Stephen Walther.ASP.NET3.5揭秘(卷1)[M].北京:人民邮电出版社,2009.Stephen Walther.ASP.NET3.5揭秘(卷2)[M].北京:人民邮电出版社,2009.刘瑞新.Visual Basic。NET程序设计教程[M].北京:机械工业出版社,2005.
第五篇:简易示波器课程设计报告
课程设计报告
课程名称 综合电子设计 题 目 简易数字示波器 指导教师 起止日期 系 别 自 动 化 专 业 自动控制 学生姓名 班级/学号 成 绩
摘要
本系统由CPLD,单片机控制模块,键盘,LED,幅度控制模块,低通滤波模块组 成,采用当前主流DDS 技术完成,能产生从1HZ-260KHZ 正弦波,方波,三角波以及这三种同频率波的线性组合,失真度限制在6%之内。
一、功能介绍
1.具有产生正弦波、方波、三角波三种周期性波形的性能。
2.用键盘输入编辑生成上述三种波形(同周期)的线性组合波形。
3.输出波形频率范围为1Hz~200kHz(非正弦波频率按10 次谐波计算;重复频 率可调,频率步进间隔1Hz。)
4.输出波形幅度范围 0~5V(峰-峰值),可按步进为0.1V(峰-峰值)。5.具有显示输出波形种类、重复频率(周期)和幅度的功能。
6.增加稳幅输出功能,当负载变化时,输出电压幅度变化不大于±3%(负载变 化范围:100Ω~∞)。
二、方案论证与比较
常见信号源的制作方法有: 方案一:采用锁相式频率合成。将一个高稳定度和高精确度的标准频率经过加减 乘除的运算产生同样稳定度的大量离散频率技术,它在一定程度上既要频率稳定精确,又要频率在很大范围内可变的矛盾。但频率受VCO 可变频率范围的影响,高低频率比不可能做的很高,而且只能产生方波和正弦波。
方案二:采用模拟奋力元件或单片压控函数发生器MAX0832,可产生正弦波,方 波,三角波,通过调整外部元件可改变输出频率,但采用模拟器件由于元件分散性太大,即使使用单片函数发生器,参数也与外部元件有关,外接的电阻电容对参数影响很大,不能实现波形运算输出等智能化的功能。
方案三:采用DDFS,即直接数字频率合成技术,以Nyquist 时域采样原理为基础,在时域中进行频率合成,它可以快速转换频率,频率,相位,幅度都可以实现程控,便于单片机控制,所以,本系统采用此方案。
三、系统设计
系统总体设计方框图:
系统设计方案:
1、实现A/D芯片的模数转换功能,通过keil的watch窗口观察ADC0读取的数据的变化。
2、设置合适的采样频率和采样时间,对输入信号进行连续采样,对规定时间内的采样结果进行存储。
3、对已有数据进行D/A转换,实现数字量到模拟量的变化,并在示波器上显示结果。
4、添加单次按键触发等功能,实现在满足触发条件后,对一个采样周期内的输入进行存储和连续显示。
5、增加1通道输入,实现双踪示波。
6、综合上述情况实现完整的数字双踪示波器。
四、单元电路设计及其初始化
1.ADC0电路的设计
初始化程序为:
void ADC0_Init(void){ ADC0CN = 0x05;// ADC0 T3定时采样,左对齐 REF0CN = 0x03;// 启用内部基准源
AMX0CF=0x00;// 选择采样输入源 ADC0CF =((SYSCLK/2500000)-1)<< 3;// ADC conversion clock = 2.5MHz ADC0CF &= 0xf8;ADC0GTH=0Xff;ADC0GTL=0Xff;ADC0LTH=0X00;ADC0LTL=0X00;// PGA gain = 2 EIE2 |= 0x02;// 启用 ADC 中断 }
采用数据左对齐存储方式。由0端口输入。T3定时器启动,当T3溢出时启动ADC0。转换结束时产生15号中断。执行中断程序。2.DAC电路的设计
初始化程序:
void DAC0_Init(void){ DAC0CN = 0x82;} void DA0_Out(unsigned int con_volt){ con_volt=con_volt<<2;DAC0L=con_volt%256;DAC0H=con_volt/256;}
其中控制字DAC0CN说明如下:采用更新于写入DAC0H时,数据格式为高八位的低六位和低八为的高六位。
五、软件设计
1.软件流程图:
开始系统初始化扫描键盘循环扫描否定时器3是否溢出是启动ADC015号中断ADC数据采集DAC数据输出输出结束
3.相关程序及其功能
AD DA转换
#include
void SYSCLK_Init(void);void ADC0_Init(void);void Timer3_Init(int counts);void ADC0_ISR(void);void DA0_Out(unsigned int con_volt);void DAC0_Init();uchar int_dec=INT_DEC;uchar tt=0;void main(void){ WDTCN = 0xde;WDTCN = 0xad;SYSCLK_Init();Timer3_Init(SYSCLK/SAMPLE_RATE);ADC0_Init();AD0EN = 1;DAC0_Init();EA = 1;while(1){
} } void SYSCLK_Init(void)
// 配置系统时钟使用外部晶振22.1184MHz { int i;OSCXCN = 0x67;// 晶体振荡器未用,晶体振荡器方式 for(i=0;i < 256;i++);// XTLVLD blanking interval(>1ms)while(!(OSCXCN & 0x80));// Wait for crystal osc.to settle OSCICN = 0x88;// 选择外部振荡器作为系统时钟,内部振荡器禁止 } void ADC0_Init(void){ ADC0CN = 0x06;// ADC0 T3定时采样,左对齐 REF0CN = 0x03;// 启用内部基准源 AMX0SL = 0x00;// 选择采样输入源0 ADC0CF =(SYSCLK/2500000)<< 3;// ADC conversion clock = 2.5MHz ADC0CF|= 0x00;ADC0LTH= 0x00;ADC0LTL= 0x00;ADC0GTH= 0xFF;ADC0GTL= 0xFF;EIE2 |= 0x02;// 启用 ADC 中断 } void DAC0_Init(void){ DAC0CN = 0x80;} void DA0_Out(unsigned int con_volt){ unsigned char hbyte,lbyte;
hbyte=con_volt/256;lbyte=con_volt%256;DAC0L=lbyte;DAC0H=hbyte;} void Timer3_Init(int counts){ TMR3CN = 0x02;TMR3RL =-counts;TMR3 = 0xffff;EIE2 &= ~0x01;TMR3CN |= 0x04;} void ADC0_ISR(void)interrupt 15 { AD0INT = 0;int_dec--;if(int_dec == 0){ int_dec =INT_DEC;DA0_Out(ADC0);} }
六、设计结果
1.对原温度采集程序进行修改完成对信号的采集,以下分别为对于方波、三角波及正弦波的信号采集。
2.加入单次触发程序后,可进行按键触发:(以正弦波为例)
按下采样键K5前 按下采样键K5后
3.加入回放功能键K5,可实现在采样之后,进行波形回放(以正弦波为例)首先按下K5键得到正弦采样信号如图:
然后按下K2键得到回放波形如图:
(由于采样频度与周期等问题,回放波形有失真显现)经程序调整后得到:
更接近采样波形
4.完成双踪示波的采集,见图。
5将双踪示波与触发脉冲结合起来,完成对于双踪信号的采集、存储及回放,原始信号为三角波和方波。
按键k5对信号进行采样存储 按键k2对三角信号进行回放
按键k3恢复信号采集初始状态(等待采集信号)
七、心得体会
通过本次设计我进一步了解数字示波器的基本控制原理,掌握了怎样利用C8051F020开发板实现一个简易数字示波器的设计与制作以及处理器C8051F020芯片的应用,多通道ADC采集功能等应用技术。本次课程设计所设计的是基于C8051F020芯片,通过软硬件结合实现普通示波器显示被测波形的简易数字示波器。能完成对ADC0的0通道和1通道的信号的分时或同时采集(高电平约2V、低电平接近0V)并且对采集的信号通过DAC0和DAC1两个输出口同时输出实现双踪示波器功能。另增加单次触发存储显示方式,即每按动一次“单次触发”键,仪器在满足触发条件时,能对被测周期信号或单次非周期信号进行一次采集与存储,然后通过其他触发键触发信号的回放,观测波形无明显失真。
由于时间和硬件条件关系没有把做出LCD液晶显示示波器有点遗憾,不过我从网络上搜索了有关资料,对其也有了一定的了解。
八、参考文献
[1] 潘琢金【译】.《C8051F020/1/2/3混合信号ISP FLASH微控制器数据手册》
九、附录
1、元器件清单
(1)MCU 为美国Silabs 公司C8051F020,64KB FLASH、(4096+256)B RAM、最高25MIPS 执行速度;
(2)4 路12 位AD 输入,AIN1 到AIN4 输入信号量程0~+2.4V ;(3)2 路12 位DA 输出,输出信号量程0~+2.4V;(4)1 路标准RS232 通讯接口;(5)1 个16X2LCD 接口;(6)1 个128X64LCD 接口;(7)1 个复位键,4 个按键;(8)JTAG 调试接口;(9)外扩总线接口;
(10)C8051F020 上的资源对用户开放。
2、程序清单
/*************************************************************** 功能:实现ADC信号采样和DAC信号输出 用外部基准:
J7 NC 2 内部VREF 外部VREF 3 4 内部DAC工作基准输入
外部VREF 5---6 内部ADC0工作基准输入
外部VREF 7 8 内部ADC1工作基准输入 或用内部基准:
J7 NC 2-内部VREF 外部VREF 3 4 | 内部DAC工作基准输入
外部VREF 5 6-内部ADC0工作基准输入
外部VREF 7 8 内部ADC1工作基准输入
***************************************************************/ #include
#define BAUDRATE 115200 // Baud rate of UART in bps #define SYSCLK 22118400 // 系统晶振频率(Hz)#define SAMPLE_RATE 100000 // Sample frequency in Hz void SYSCLK_Init(void);void PORT_Init(void);void ADC0_Init(void);void Timer3_Init(int counts);void ADC0_ISR(void);void DAC0_Init(void);void DAC1_Init(void);void DA1_Out(unsigned int con_volt);void DA0_Out(unsigned int con_volt);long xdata NCDdata [510];int i=0,j=0,y =0,z=0,x=0,n,k=0,c=0,d,f,m;long a,b;
long result;void main(void){ WDTCN = 0xde;// 看门狗 WDTCN = 0xad;SYSCLK_Init();// initialize oscillator PORT_Init();// initialize crossbar and GPIO Timer3_Init(SYSCLK/SAMPLE_RATE);// initialize Timer3 to overflow at
// sample rate ADC0_Init();// init ADC DAC0_Init();DAC1_Init();AD0EN = 1;// enable ADC EA = 1;while(1){
if(P31==0)
//K5循环扫描
{ for(m=0;m<11;m++);if(P31==0){
f=1;DAC0CN = 0x02;x=0;} } if(P33==0)
//K3循环扫描
{ for(m=0;m<11;m++);if(P33==0){ y=1;DAC0CN = 0x82;} }
if(P34==0)
//K2循环扫描
{ for(m=0;m<11;m++);if(P34==0){ k=1;c=0;DAC0CN = 0x82;} } } }
//---------------// SYSCLK配置
//---------------// 配置系统时钟使用外部晶振22.1184MHz void SYSCLK_Init(void){ int i;// delay counter OSCXCN = 0x67;// start external oscillator with
// 22.1184MHz crystal for(i=0;i < 256;i++);// XTLVLD blanking interval(>1ms)while(!(OSCXCN & 0x80));// Wait for crystal osc.to settle OSCICN = 0x88;// select external oscillator as SYSCLK
// source and enable missing clock
// detector } //---------------// PORT配置
//---------------void PORT_Init(void){ XBR0 = 0x04;// Enable UART0 XBR1 = 0x00;XBR2 = 0x40;// Enable crossbar and weak pull-ups P0MDOUT |= 0x01;// enable TX0 as a push-pull output P2MDOUT = 0xff;// P2口设为推挽方式 P3MDOUT = 0xe0;// P3口设为推挽方式 } //---------------// ADC0配置,T3定时启动ADC //---------------void ADC0_Init(void){ ADC0CN = 0x05;// ADC0 T3定时采样,左对齐 REF0CN = 0x03;// 启用内部基准源 AMX0CF=0x00;// 选择采样输入源
ADC0CF =((SYSCLK/2500000)-1)<< 3;// ADC conversion clock = 2.5MHz ADC0CF &= 0xf8;ADC0GTH=0Xff;ADC0GTL=0Xff;ADC0LTH=0X00;ADC0LTL=0X00;// PGA gain = 2 EIE2 |= 0x02;// 启用 ADC 中断 } //---------------// Timer3配置,T3定时启动ADC //---------------void Timer3_Init(int counts){ TMR3CN = 0x02;TMR3RL =-counts;TMR3 = 0xffff;EIE2 &= ~0x01;//定时器3中断屏蔽。TMR3CN |= 0x04;} //---------------// ADC0采样中断
//---------------void ADC0_ISR(void)interrupt 15 { AD0INT = 0;// 清 ADC 中断标志位 result=ADC0;if(AMX0SL==0x00)a=result;else b=result;DA1_Out(b);//DAC1输出通道1采集的数据
if(f==0)DA0_Out(a);else { NCDdata[x]=a;if(x<500)x++;if(x==500){ if(k==1&&c<400){ DA0_Out(NCDdata[c]);if(c<400)c++;}
else DAC0CN = 0x02;} if(y==1){k=0;f=0;y=0;} } if(AMX0SL==0x00)AMX0SL=0x01;//改变采样输入源 else AMX0SL=0x00;} //---------------// DAC0配置
//---------------void DAC0_Init(void){ DAC0CN = 0x82;// Enable DAC0 in left-justified mode
// managed by Timer4 overflows } //---------------// DAC1配置
//---------------void DAC1_Init(void){ DAC1CN = 0x82;// Enable DAC0 in left-justified mode
// managed by Timer4 overflows } //---------------// DAC输出数据处理
//---------------void DA0_Out(unsigned int con_volt){ con_volt=con_volt<<2;DAC0L=con_volt%256;DAC0H=con_volt/256;}
void DA1_Out(unsigned int con_volt){
con_volt=con_volt<<2;DAC1L=con_volt%256;DAC1H=con_volt/256;}
3、系统功能说明:
当没有按键的时候系统为完整的双踪示波器,能对双通道的输入输出进行分别采样和输出。当K5按下的时候,DAC0屏蔽,系统开始将数据采集后存放于设定的数组当作,此时当K2键按下的时候系统使能DAC0,输出存储在数组中的采集好的数据,当数据输出完成的时候关闭DAC0。当按下K3时,系统还原到初始状态(双踪示波)。