
#include <reg51h>
#include <INTRINSH>
#include <STDIOH>
// define P10 to check STATUS
sbit STATUS = P1^0;//用P10来检测状态
unsigned char xdata CTRL _at_ 0x2FFF;
unsigned char xdata ADSEL _at_ 0x4FFF;
unsigned char hByte;//存放ADC转换结果的高8位
unsigned char lByte;//存放ADC转换结果的低8位
void adc_Convert (void)//ADC函数,进行模数转换
{ // Start a conversion with A0 and A/$C$ low
// The convesion takes place on rising CE edge
CTRL = 0x00;
ADSEL = 0x00;
// Wait until we have completed a conversion
while(STATUS==1);//检测状态,一直等到转换完成,才往下走
// Set R/$C$ with A0 low and read the low byte
//读出ADC转换结果的高8位
CTRL = 0x02;
hByte = ADSEL;
// Set R/$C$ with A0 high and read the high
//读出ADC转换结果的低8位
CTRL = 0x03;
lByte = ADSEL;
}
void main(void)
{ unsigned int delay, MSB , LSB, adc_Res;
// Initialize serial interface
//初始化串口,波特率1200bps
SCON = 0xDA; // SCON: mode 1, 8-bit UART, enable rcvr /
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload /
TH1 = 0xFD; // TH1: reload value for 1200 baud @ 12MHz /
TR1 = 1; // TR1: timer 1 run /
TI = 1; // TI: set TI to send first char of UART /
while(1)
{ adc_Convert();//进行AD转换
MSB=(unsigned int)(hByte << 4);
LSB=(unsigned int)(lByte >> 4);
// adc_Res now has the converted data with 12-bit resolution
//将ADC结果组合成12位数据,存放于adc_Res
adc_Res = MSB + LSB;
// Send adc results to the serial interface
//通过串口将ADC结果发送出去
printf("ADC READINGS: %03Xh\n", adc_Res);
// simple delay - it is mcu clock dependent !
//简单延时一下,由单片机时钟决定
for (delay=0; delay<10000; delay++)
;
}
}
整个程序的功能就是:单片机控制ADC芯片进行转换,并读取ADC结果,从串行口发送。
//(1)静态显示
#include <reg51h>
//共阴极数码管段码
unsigned char code TAB1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71,0x73,0x3E,0x31,0x6E,0x76,0x38,0x00};
//共阳极数码管段码
unsigned char code TAB2[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,
0x83,0x0C6,0x0A1,0x86,0x8E,0x8C,0x0C1,0x0CE,0x91,0x89,0x0C7,0x0FF};
void delay(void)
{
unsigned char r2,r3,r4;
for(r3=10;r3!=0;r2--)
{
for(r3=200;r3!=0;r3--)
{
for(r4=250;r4!=0;r4--);
}
}
}
void main(void)
{
unsigned char r0=0;
while(1)
{
P2 = TAB1[r0];
P3 = TAB2[r0];
r0++;
delay();
if(r0==0x10)
{
r0=0;
}
}
}
//-------------------------------------------
//(2)动态显示
#include <reg51h>
#include <intrinsh> //包含有左右循环移位子函数的库
//共阳极数码管段码
unsigned char code TAB[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,
0x83,0x0C6,0x0A1,0x86,0x8E,0x8C,0x0C1,0x0CE,0x91,0x89,0x0C7,0x0FF};
void delay(void)
{
unsigned char r2,r3,r4;
for(r3=1;r3!=0;r2--)
{
for(r3=10;r3!=0;r3--)
{
for(r4=250;r4!=0;r4--);
}
}
}
void main(void)
{
unsigned char dispbuf[8],r0=0;
dispbuf[0]=0xF9;
dispbuf[1]=0x92;
dispbuf[2]=0b10111111;
dispbuf[3]=0x0B0;
dispbuf[4]=0x92;
dispbuf[5]=0b10111111;
dispbuf[6]=0x0C0;
dispbuf[7]=0x0C0;
P1 = 0b01111111;
while(1)
{
P2 = 0x0ff;
P1 = _crol_(P1,1)//循环左移1
P2 = dispbuf[r0];
delay();
r0++;
if(r0>=8)
{
r0 = 0 ;
P1 = 0b01111111;
}
}
}
使用proteus仿真时,是不能执行外部程序存储器中的程序的。C程序编译出HEX代码文件直接加载到单片机上即可,这不是实物,可以执行外部存储器ROM的程序。所以,把c程序写进ROM中是没有用的。仿真时,ROM中可以放数据,执行程序时读取数据。所以,2732不必代替,可以用的。
<p>先在keil中把程序编好,在PROTEUS中双击单片机,之后出现这个页面</p>
<p></p>
<p>在对话框中找到你keil编写的程序的文件即可。</p>
以上就是关于Proteus 7 Professional初学者关于c程序的问题全部的内容,包括:Proteus 7 Professional初学者关于c程序的问题、单片机proteus仿真,有接线图和汇编语言,求把这个汇编语言改成c语言!、在使用proteus仿真时,2732 程序存储器可以使用什么代替还有怎么把c程序写进ROM中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)