历史上的今天
今天是:2024年11月09日(星期六)
2019年11月09日 | 基于pic16f877a的电压输出并显示
2019-11-09 来源:51hei
程序源码如下
#include //引脚定义 #define din RC7 //显示串行数据输入端 #define load RC6 //显示数据锁存端 #define clk RC5 //显示时钟输入端 #define DecodeMode 0x09 //译码模式 #define Intensity 0x0a //亮度 #define ScanLimit 0x0b //扫描界限 #define ShutDown 0x0c //掉电模式 #define DisplayTest 0x0f //显示测试 #define ShutdownMode 0x00 //掉电方式 #define NormalOperation 0x01 //正常操作方式 #define DecodeDigit 0xff //译码位数设置 #define IntensityGrade 0x08 //显示亮度级别设置 #define ScanDigit 0x07 //扫描位数设置 #define TestMode 0x01 //显示测试方式 #define TextEnd 0x00 //显示测试结束,正常工作 unsigned char votAJU = 0x00; //是否使用CVRR位置,由RD7控制 unsigned char votCounter =0; //电压输出计数器 //4MHz下以ms为单位的延时 void delayMS(unsigned int ms) { int i,j; for(i=0;i for(j=0;j<70;j++); } } //向max7219写入一个字节 void Write_Max7219_byte(unsigned char DATA) //LED写数据函数 { unsigned char i,k; load=0; for(i=8;i>=1;i--) { clk=0; k=DATA&0x80; if(k==0x80)din=1; else din=0; DATA<<=1; clk=1; } } //向max7219写入指定位置的数据,address为位置,dat为数据 void Write_Max7219(unsigned char address,unsigned char dat) { load=0; Write_Max7219_byte(address); Write_Max7219_byte(dat); load=1; } //初始化max7219 void init_max7219(void) { Write_Max7219(DecodeMode,DecodeDigit); //设置译码模式 Write_Max7219(Intensity,IntensityGrade); //设置亮度 Write_Max7219(ScanLimit,ScanDigit); //设置扫描界限 Write_Max7219(ShutDown,NormalOperation); //设置电源工作模式 Write_Max7219(DisplayTest,TextEnd); //显示测试寄存器,写入00H,实现正常工作 } //显示函数 void displayVoltage(unsigned char temp[4]) { Write_Max7219(0x01,0x0E); Write_Max7219(0x02,0x0A); if(RD7 == 1) { Write_Max7219(0x03,1); } else if(RD7 == 0) { Write_Max7219(0x03,0); } else { } Write_Max7219(0x04,0x0F); Write_Max7219(0x05,(temp[0]|0x80)); Write_Max7219(0x06,temp[1]); Write_Max7219(0x07,temp[2]); Write_Max7219(0x08,temp[3]); } void initINT(void) { OPTION = 0x00; //设置端口B为弱上拉电阻,RB为下降沿触发中断 GIE = 1; INTE = 1; //允许RB0/INT中断 } void initPORT(void) //初始化端口D { TRISB0 = 1; //RB0为输入 TRISC = 0x00; //设置为输出 PORTC = 0x00; //输出都为0 TRISD7 = 0; //RD7为输入 } void interrupt INTISR(void) { if(INTF == 1) //如果是外部中断 { INTF = 0; //清除标志 votCounter++; if(votCounter > 0x0F) //只有16X2种可能 { votCounter = 0; } } } void initVotOut(void) { CVRR = 1; CVR3 = 0; CVR2 = 0; CVR1 = 0; CVR0 = 0; //输出1.25V CVROE = 1; //输出AN2引脚 CVREN = 1; //开启电压输出 } void main(void) { unsigned char vtemp[4]; initPORT(); //端口初始化 initINT(); initVotOut(); init_max7219(); //MAX7219初始化 vtemp[0] = 0; vtemp[1] = 0; vtemp[2] = 0; vtemp[3] = 0; //输出0V while (1) { delayMS(20); CVRR = RD7;; if(votCounter == 0x00) //1.25V或者0V { CVR3 = 0; CVR2 = 0; CVR1 = 0; CVR0 = 0; if(RD7 == 1) //CVRR = 1 { vtemp[0] = 0; vtemp[1] = 0; vtemp[2] = 0; vtemp[3] = 0; //输出0V } else if(RD7 == 0) { vtemp[0] = 1; vtemp[1] = 2; vtemp[2] = 5; vtemp[3] = 0; //输出1.25V } } else if(votCounter == 0x01) //0.21或1.41V { CVR3 = 0; CVR2 = 0; CVR1 = 0; CVR0 = 1;
史海拾趣
|
电阻种类及特点简介 电阻,英文名resistance,通常缩写为R,它是导体的一种基本性质,与导体的尺寸、材料、温度有关。欧姆定律说,I=U/R,那么R=U/I,电阻的基本单位是欧姆,用希腊字母“Ω”表示,有这样的定义:导体上加上一伏特电压时,产生一 ...… 查看全部问答> |
|
我刚刚开始接触FPGA,资料也才看了一点,Verilog HDL也只是大致了解. 我在想要不要买块开发板,一边看资料一边在开发板上试试 以前学C的时候上课也觉得很枯燥,但是会经常自己编些小算术题之类的~呵呵 望有经验的兄弟姐妹给些建议 不慎感谢… 查看全部问答> |
|
想实现 运行状态 掉电保持,以便重新上电时恢复, 需要保持的数据大约 20字节, 该状态每秒更新一次。 请问有什么比较好的方法?掉电检测如何实现? //目前使用的方法是:Dallas SDRAM, 当作RAM一部分。 掉电检测没有,上电时检查状 ...… 查看全部问答> |
|
做应用的需要一片固定的内存,我在Config.bib中划好,在驱动里增加了MmIOMapSpace和MmIOUnMapSpace以及对应的IOCTL,在驱动内部测试,这片内存可以正常访问,map以及unmap。 我用IOCTL为应用返回这片内存的物理及虚拟地址,为什么在应用中使用该虚 ...… 查看全部问答> |
|
[求助]DPF播放一個半小時的幻燈圖片後就不再播放了。爲什麽? 在板子上做测试,从服务器上读图片,在板子上以幻灯片的形式播放,几乎每次一个半小时后就停止播放。系统是winCE的,网上查了好久,知道是订阅时间的问题,但不知道该改哪部分的代码,请达人们指教,小弟刚接触嵌入式开发。… 查看全部问答> |
|
AT89S51单片机控制GSM模块(M22)发送短信程序!~!~!~! AT89S51单片机控制GSM模块(M22)发送短信程序!~!~!~! 自己改的AT89S51单片机控制GSM模块(M22)发送短信程序,在Keil上编译没错,但还未试过烧入片内运行。。 大家看看,这个程序可行否? 还有什么错误的地方? 希望搞过GSM的朋友多提点 ...… 查看全部问答> |
|
@8000 30 40 04 80 FF 3F 31 40 00 06 3C 40 0C 02 3E 40 F8 00 B0 12 EE A7 3C 40 00 02 3E 40 0C A8 30 12 0B 00 B0 12 00 A8 21 53 B0 12 44 A0 B0 12 12 A4 0A 12 0B 12 08 12 09 12 06 12 07 12 04 12 05 12 D2 93 E5 02 C5 20 C2 43 E5 ...… 查看全部问答> |




