基于aduc848的智能电压测试仪课程设计(含全部源程序)(编辑修改稿)内容摘要:
个脉冲 MCO=1。 //制造起始条件 iic_delay_4us()。 //等待稳定 MDO=1。 //上升 iic_delay_5us()。 //等待稳定 MDO=0。 //拉低数据线,产生起始信号 iic_delay_4us()。 //等待稳定 MCO=0。 //时钟拉低,开始 } void iic_stop() { MDE=1。 //允许输出 MCO=0。 MDO=0。 MCO=1。 iic_delay_4us()。 MDO=1。 iic_delay_5us()。 // MDO=0。 //中止后应该释放数据线 } //1307 读入位数据 void iic_write_bit(bit dat) { MDE=1。 MCO=0。 MDO=dat。 iic_delay_4us()。 MCO=1。 iic_delay_4us()。 MCO=0。 iic_delay_4us()。 } //1307 写出,输出 1307 发送出的位数据 bit iic_read_bit() { bit dat。 MDE=1。 MCO=0。 MDO=1。 //释放数据线 MDE=0。 iic_delay_4us()。 MCO=1。 iic_delay_4us()。 dat=MDI。 MCO=0。 iic_delay_4us()。 return dat。 } //判断 1307 写出是否有效,即从机是否接受,输出应答信号。 该信号为低,则表明有效 bit iic_write_char(uchar dat) { uchar i。 bit res。 for(i=0。 i8。 i++) { iic_write_bit((dat(7i))amp。 0x01)。 } res=iic_read_bit()。 return res。 } //读入 1307,输出写入的字符数据 uchar iic_read_char(bit nack) { uchar dat=0,i。 for(i=0。 i8。 i++) { dat=1。 if(iic_read_bit()==1)dat++。 } iic_write_bit(nack)。 return dat。 } //判断写地址是否有效 bit iic_write_address(uchar id,uchar address) { iic_start()。 if(iic_write_char(id)!=0)return 1。 if(iic_write_char(address)!=0)return 1。 return 0。 } 4) AD 模块 include include define v_count 9 define a_count 3 unsigned char InterruptCounter=0。 //定义中断计数变量并赋初值 0 unsigned int count=0。 //定义秒计数变量并赋初值 0 unsigned int count1=0。 unsigned int max,min。 //电压最大、最小值 unsigned int CurrentValue。 //电压当前值 unsigned int qual_rate,overup_rate,overlow_rate。 //电压上、下限值、合格率、超上限率、超下限率 unsigned int upper_limit=20xx。 unsigned int lower_limit=0。 bit bz_flag。 //设标志位,区分对象是电压值还是百分比,输出“ V”还是“ %” unsigned int Fir_bit,Sec_bit,Thi_bit,Fou_bit。 //电压位 unsigned int num=0,num1=0。 //num 为电压采样周期内总计数, num1 为平均值计算周期内总计数 unsigned int num_up=0,num_low=0。 //num_up 为超上限次数 ,num_low 为超下限次数 unsigned int sum=0。 //sum 为电压采样周期内电压总数和 unsigned int value[v_count]。 //取样电压值数组,存放一个平均值计算周期内的每秒电压值 unsigned int average[a_count]。 //平均值数组,存放平均值 void Init() { ADCMODE = 0X23。 //一直转换 /CHOP 使能 ADC0CON1 = 0x27。 //主 ADC 选用放大 1 倍 ,单端输入, ADC0CON2 = 0x0C。 //选用内部参考电源,模拟信号从 AIN5 AIN6 输入 /* TMOD=0x01。 TH0=(6553650000)/256。 TL0=(6553650000)%256。 EA=1。 ET0=1。 TR0=1。 */ TMOD=0x01。 //配置定时器 0 为 16 位模式,时钟是 core clock,默认为 IE=0x82。 //使能定时器 0 中断和全局中断 TH0=0X00。 TL0=0X00。 TR0=1。 //开启 定时器 0 } void Data_Process(unsigned char ad) { unsigned int w。 if(RDY0) { CurrentValue=((ADC0H*256)+ADC0M)*5/256。 // CurrentValue=1000。 value[num] = ((ADC0H*256)+ADC0M)*5/256。 max=value[0]。 min=value[0]。 //求最大、小值 for(w=1。 wnum。 w++) { if(value[w1]value[w]) { value[w]=value[w1]。 } else { max=value[w]。 } if(value[w1]value[w]) { value[w]=value[w1]。 } else { min=value[w]。 } } sum+=value[num]。 //求电压采样周期内电压总和 average[num1]=sum/v_count。 //取计算周期内所有采样电压值总和的平均值 //计算上、下限率 overup_rate=(num_up/num1)*100。 overlow_rate=num_low/num1*100。 qual_rate=99*(1overup_rate/100overlow_rate/100)。 //当超过上下限值时,蜂鸣器鸣响报警 if(CurrentValueupper_limit||CurrentValuelower_limit) { beep=0。 delay_beep(10)。 beep=1。 delay_beep(10)。 } //选择显示对应 AD 标号电压值或比率 switch(ad) { case 1: AD_display(CurrentValue)。 break。 case 2: AD_display(max)。 break。 case 3: AD_display(min)。 break。 case 4: AD_display(qual_rate)。 break。 case 5: AD_display(overup_rate)。 break。 case 6: AD_display(overlow_rate)。 break。 case 7: AD_display(upper_limit)。 break。 case 8: AD_display(lower_limit)。 break。 } RDY0 = 0。 } } void delay_beep(unsigned int z) { unsigned int x,y。 for(x=z。 x0。 x) { for(y=100。 y0。 y)。 } } //定时器中断 void timer0() interrupt 1 { unsigned int k。 InterruptCounter++。 if(InterruptCounter=24*8) { InterruptCounter=0。 count++。 num++。 //1 秒采样一个电压 if(count1) { count=0。 } //每一个采样周期获得一个平均值 if(num==v_count) { num1++。 num=0。 sum=0。 //一个采样周期后采样电压值清零,重新存储 for(k=0。 kv_count。 k++) { value[k]=0。 } } //判断电压是否超上下限 for(k=0。 knum1。 k++) { if(average[k]upper_limitamp。 amp。 num_upa_count) { num_up++。 } if(average[k]lower_limitamp。 amp。 num_lowa_count) { num_low++。 } } //一个计算周期后清零重置 if(num1==a_count) { num1=0。 num=0。 num_up=0。 num_low=0。 for(k=0。 ka_count。 k++) { average[k]=0。 } } } } //将电压数据或者比率显示在 lcd 上 void AD_display(unsigned int d) { if(RDY0) { if(bz_flag==0) { Fir_bit = d/1000。 Sec_bit = d/100%10。 Thi_bit = d/10%10。 Fou_bit = d%10。 lcd_pos(lcd_next)。 //向液晶写指令 lcd_wd(0x30+Fir_bit)。 lcd_wd(0x2e)。 //向液晶写 39。 .39。 lcd_wd(0x30+Sec_bit)。 lcd_wd(0x30+Thi_bit)。 lcd_wd(0x30+Fou_bit)。 lcd_wd(0x56)。 //向液晶写 39。 V39。 } else { d*=100。 Fir_bit = d/1000。 Sec_bit = d/100%1。基于aduc848的智能电压测试仪课程设计(含全部源程序)(编辑修改稿)
相关推荐
技术路线如图 11 所示: 企 业 信 息集 成 开 发 环 境环 境 污 染 事 故 应 急 系 统应 急 预 案 生 成地 理 影 像 数 据事 故 应 急 方 法基 础 信 息 采 集毒 气 源 库 毒 气 属 性 环 境 标 准结 果 分 析属 性 数 据 库 应 急 信 息 数 据 库 空 间 数 据 库事 故 案 例 库 组 件 式 G I S 环 境 数 学 模 型评 价 预 测
常必要的。 本系统 功能需求的分析 利用 UML( Unified Modeling Language) 统一建模语言进行了用例建模设计。 角色 划分 用例建模设计之前。 首先要对系统进行分析,确定系统 用户 , 按照系统用户划分 相应的角色, 为 不同的角色 赋予 不同的功能, 即各类 角色 在系统中所承担的职责。 本系统的 角色 包括了 三类: 学生、教师、管理员。
ulations ofengineering system)是法国 IMAGINE 公司自 1995 年推出的一种新型的高级建模仿真软件。 AMESIM 系统仿真平 台,提供了系统工程设计的完整环境和多学科领域系统的各类模型库,包括控制应用库、机械应用库、流体应用库、电磁应用库、热分析应用库以及内燃机应用库等。 所有的应用库都提供了将信号端转换成为结构化的多通口功能模块,方便工程师利用方块图灵活
JNZ IN。 不是全0说明有键按下 RET。 无键按下返回IN: ACALL DELAY1。 调延时,等待按合抖动过去 MOV R2,04H。 R2做计数器,存待扫描行数 MOV R4,7FH。 R4做指针,指示待扫描行数 MOV R7,00H。 R7用于决定键号,初值置以0SCAN: MOV A,R4 RL A MOV R4,A。 以上三条调整待扫描行 MOV P2,A。 逐行扫描
IN。 不是全0说明有键按下 RET。 无键按下返回IN: ACALL DELAY1。 调延时,等待按合抖动过去 MOV R2,04H。 R2做计数器,存待扫描行数 MOV R4,7FH。 R4做指针,指示待扫描行数 MOV R7,00H。 R7用于决定键号,初值置以0SCAN: MOV A,R4 RL A MOV R4,A。 以上三条调整待扫描行 MOV P2,A。 逐行扫描,被扫描行送低电平
第 5 页 共 40 页 ADuC845 具有串行下载和调度模式 [5],可通过 EA 引脚提供引脚竞争模式,同时支持Quick Start 开发系统和一些较低成本的软件以及硬件工具。 ADuC845 的内部主要通过两个多通道都可以达到 24 位分辨率的 A/D 转换器、 D/A 转换器和一个 8 位的可以编程的微控制器来组成。 在正常工作时, ADuC845 的电源最大为 mA/ V(core