帮忙写个PIC单片机小程序,编译成功立即给分
发布网友
发布时间:2022-05-29 21:02
我来回答
共5个回答
热心网友
时间:2023-11-28 05:53
我这里有一个机器上的程序,和你的情况是一样的,希望对你有所帮助
#include<pic.h>
#define sda RC1
#define scl RC0
const char table[]={0xde,0x44,0x7a,0x76,0xe4, //0,1,2,3,4
0xb6,0xbe,0x54,0xfe,0xf6, //5,6,7,8,9
0xf8}; //p
__CONFIG(0x09);
void start();
void stop();
void respons();
void sendresponse();
void write_byte(char dat); //写动作
void read_byte(); //读动作
void delay1(char x);
void xianshi();
void zuo(int nn);
void you(int nn);
void deng(int mk);
void niu0();
void niu1();
void niu2();
void niu3();
void niu4();
void niu5();
void niu6();
void niu7();
void niu8();
void niu9();
void shumafenpei();
bank2 int dengshuju,ji,read_shu;
bank2 int uu,uy,y,kk;
bank1 int di,di1,tingshan,yu;
bank1 int yi,er,san,si;
void main()
{
char a,b;
TRISA=0;
TRISB=0;
PORTA=0;
PORTB=0;
di=0;
di1=1;
tingshan=1;
yu=0;
dengshuju=1;
while(1)
{
//***********************************************
TRISC =~(1<<0);
TRISC =~(1<<1); //置输出
sda=1; //数据预置高
ji=0; //--
scl=1; //时钟预置高
ji=0; //--
start();
write_byte(0xa0); //写入写的地址
respons();
write_byte(1); //写地址
respons();
start();
write_byte(0xa1); //写入读的地址和读动作
respons();
a=read_shu;
sendresponse();
b=read_shu;
stop();
PORTB=a;
//*************************************************
shumafenpei();
xianshi();
if(di1==1)
{
if(di<5){RB0=0;}
else
{
RB0=0;
di=0;
di1=0;
}
di++;
}
}
}
void delay1(char x) //长延迟
{
char a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void xianshi()
{
zuo(yi); //第一位数码
PORTA=0x00;
ji=0;//delay();
niu0();
ji=0;//delay();
PORTA=0x05;
ji=0;//delay();
niu5();
ji=0;//delay();
PORTA=0xff;
you(er); //第二位数码
PORTA=0x01;
ji=0;//delay();
niu1();
ji=0;//delay();
PORTA=0x06;
ji=0;//delay();
niu6();
ji=0;//delay();
zuo(san); //第三位数码
PORTA=0x02;
ji=0;//delay();
niu2();
ji=0;//delay();
PORTA=0x07;
ji=0;//delay();
niu7();
ji=0;//delay();
you(si); //第四位数码
PORTA=0x03;
ji=0;//delay();
niu3();
ji=0;//delay();
PORTA=0x08;
ji=0;//delay();
niu8();
ji=0;//delay();
deng(dengshuju); //指示灯
PORTA=0x04;
ji=0;//delay();
niu4();
ji=0;//delay();
PORTA=0xff;
PORTA=0x09;
ji=0;//delay();
niu9();
ji=0;//delay();
if(tingshan==1)
{
yu++;
if(yu<40)dengshuju=dengshuju|0x30; //0011 0000
if(yu>40&&yu<80)dengshuju=dengshuju&0xcf; //1100 1111
if(yu>80)yu=0;
}
if((dengshuju&0x10)&&(tingshan!=1))
{
dengshuju=dengshuju&0xf0;
dengshuju=dengshuju|0x01;
}
}
void zuo(int nn)
{
int mm=table[nn];
int i;
for(i=0;i<8;i++)
{
RB7=0; //时钟信号预先置零
RA0=(mm&0x01); //取最边沿数值
RB7=1;
mm=mm>>1;
}
}
void you(int nn)
{
int nu,nzuo,nyou,i;
nu=table[nn]; //取数
nzuo=(nu&0xaa); //抽1、3、5、7位
nyou=(nu&0x55); //抽2、4、6、8位
nzuo=nzuo>>1; //1、3、5、7变2、4、6、8
nyou=nyou<<1; //2、4、6、8变1、3、5、7
nu=(nzuo|nyou); //合数,赋值给nu
for(i=0;i<8;i++)
{
RB7=0; //时钟信号预先置零
RA0=(nu&0x01); //取最边沿数值
RB7=1;
nu=nu>>1;
}
}
void deng(int mk)
{
int i;
for(i=0;i<8;i++)
{
RB7=0; //时钟信号预先置零
RA0=(mk&0x01); //取最边沿数值
RB7=1;
mk=mk>>1;
}
}
void niu0()
{
int y0;
kk=dengshuju&0x0f;
if(RC2!=0)
{
uu=uu&0xfe; //1111 1110按钮标志位置零
}
y0=uu&0x01; //抽取按钮标志位的真假
if(RC2==0)
{
if((y0==0)&&((dengshuju&0x20)||tingshan==1))
{
di1=1;
switch(kk)
{
case 0x01:kk=0x08;break;
case 0x02:kk=0x01;break;
case 0x04:kk=0x02;break;
case 0x08:kk=0x04;break;
}
dengshuju=dengshuju&0xf0; //清除旧记录
dengshuju=dengshuju|kk; //注入新记录
}
uu=uu|0x01;
}
}
void niu1()
{
if(RC2!=0)
{
uy=uy&0xfd; //1111 1101按钮标志位置零
}
y=uy&0x02; //0000 0010抽取按钮标志位的真假
if(RC2==0)
{
if(y==0){di1=1;}
uy=uy|0x02;
}
}
void niu2()
{
if(RC2!=0)
{
uy=uy&0xfe; //1011 1111按钮标志位置零
}
y=uy&0x01; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0){di1=1;}
uy=uy|0x01;
}
}
void niu3()
{
if(RC2!=0)
{
uu=uu&0xf7; //1011 1111按钮标志位置零
}
y=uu&0x08; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0){di1=1;}
uu=uu|0x08;
}
}
void niu4()
{
kk=dengshuju&0x30; //0x00 0000取灯(单循/自动)状态
if(RC2!=0)
{
uu=uu&0xfd; //1111 1101按钮标志位置零
}
y=uu&0x02; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0)
{
di1=1;
tingshan=0;
switch(kk)
{
case 0x00:kk=0x20;break;
case 0x20:kk=0x10;break;
case 0x10:kk=0x20;break;
case 0x30:kk=0x20;break;
}
dengshuju=dengshuju&0xcf; //1011 1111清除旧记录
dengshuju=dengshuju|kk; //注入新记录
}
uu=uu|0x02;
}
}
void niu5()
{
kk=dengshuju&0x40; //0x00 0000取灯(单循/自动)状态
if(RC2!=0)
{
uu=uu&0xfb; //1111 1011按钮标志位置零
}
y=uu&0x04; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0)
{
di1=1;
if(kk==0)kk=0x40;
else kk=0;
dengshuju=dengshuju&0xbf; //1011 1111清除旧记录
dengshuju=dengshuju|kk; //注入新记录
}
uu=uu|0x04;
}
}
void niu6()
{
kk=dengshuju&0x80; //x000 0000取灯(圆面/平面)状态
if(RC2!=0)
{
uu=uu&0xdf; //1101 1111按钮标志位置零
}
y=uu&0x20; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0)
{
di1=1;
if(kk==0)kk=0x80;
else kk=0;
dengshuju=dengshuju&0x7f; //0111 1111清除旧记录
dengshuju=dengshuju|kk; //注入新记录
}
uu=uu|0x20;
}
}
void niu7()
{
if(RC2!=0)
{
uu=uu&0xbf; //1011 1111按钮标志位置零
}
y=uu&0x40; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0){di1=1;}
uu=uu|0x40;
}
}
void niu8()
{
if(RC2!=0)
{
uu=uu&0xef; //1011 1111按钮标志位置零
}
y=uu&0x10; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0){di1=1;}
uu=uu|0x10;
}
}
void niu9()
{
if(RC2!=0)
{
uu=uu&0x7f; //1011 1111按钮标志位置零
}
y=uu&0x80; //抽取按钮标志位的真假
if(RC2==0)
{
if(y==0){di1=1;}
uu=uu|0x80;
}
}
void shumafenpei()
{
int jishu,juan,yayin,tingliu,kk,yu;
jishu=read_shu;
juan=3344;
yayin=5566;
tingliu=7788;
kk=dengshuju&0x0f;
switch(kk)
{
case 0x01:yu=jishu; break;
case 0x02:yu=tingliu; break;
case 0x04:yu=yayin; break;
case 0x08:yu=juan; break;
}
yi=yu/1000;
yu=yu%1000;
er=yu/100;
yu=yu%100;
san=yu/10;
yu=yu%10;
si=yu;
}
//********************************************************
//IIC通讯程序
void start() //开始信号(时钟高,数据由高变低)
{ //*****************************
TRISC=~(1<<1); //????
sda=1; //数据高,准备启动下沿信号
ji=0; //--
scl=1; //时钟高
ji=0; //--
sda=0; //数据拉低,开始信号到位
ji=0; //--
}
void stop() //停止信号(时钟高,数据由低变高)
{ //*****************************
TRISC =~(1<<1); //置输出??
sda=0; //数据低,准备停止上沿信号
ji=0; //--
scl=1; //时钟高,
ji=0; //
sda=1; //数据拉高,停止信号到位
ji=0; //--
}
void respons() //应答检测
{
char i;
TRISC=(1<<1); //设置为输入
scl=1; //时钟高
ji=0; //--
while((sda==1)&&(i<250)) //如果数据高并且没循环完毕,i自增
i++;
scl=0; //时钟高
ji=0; //--
}
void sendresponse() //发送应答
{
TRISC=~(1<<1); //置输出
sda=0; //数据低
ji=0; //--
scl=1; //时钟高
ji=0; //--
scl=0; //时钟低,
ji=0; //--
sda=1; //数据高
}
void write_byte(char dat) //写动作
{
char i,temp,d;
TRISC =~(1<<1); //置输出
temp=dat; //函数被赋值转交temp
for(i=0;i<8;i++) //开始传输八位数据
{
if((temp&0x80)==0x80)//如果最左一位是1
d=1;
else
d=0;
scl=0; //时钟低
ji=0; //--
sda=d; //数据被赋值
ji=0; //--
scl=1; //接收完,时钟回复高
ji=0; //--
temp=temp<<1; //最左传输完,再左移一位
}
scl=0; //结束,时钟低
ji=0; //--
sda=1; //数据高
ji=0; //--
}
void read_byte() //读动作
{
char i,k;
TRISC =(1<<1); //设置为输入
scl=0; //时钟低
ji=0; //--
sda=1; //释放数据总线
ji=0; //--
for(i=0;i<8;i++)
{
scl=1; //时钟高
ji=0; //--
k=(k<<1)|sda; //k先腾出位,再灌数据,再刷新k
scl=0; //时钟低
ji=0; //--
}
read_shu=k; //函数给出读出数据
}
热心网友
时间:2023-11-28 05:54
24LC256模拟IIC通信
//24LC256IIC通信程序
# include<pic.h>
# define unchar unsigned char
# define unint unsigned int
# define SDA RC4
# define SCL RC3
unchar ACK;
void delay(void) //延时
{
unint m;
for(m=0;m<0xffff;m++)
continue;
}
void start (void) // IIC开始
{
TRISC3=0; //置输出
TRISC4=0;
SDA=1;
asm("nop");
SCL=1; //在至少4u秒期间SDA从高电平到低电平
asm("nop");
asm("nop");
asm("nop");
SDA=0;
asm("nop");
asm("nop");
asm("nop");
SCL=0;
asm("nop");
asm("nop");
}
void stop(void) // IIC结束
{ TRISC3=0;
TRISC4=0; //置输出
SDA=0;
asm("nop");
SCL=1; //在至少4u秒期间SDA从低电平到高电平
asm("nop");
asm("nop");
asm("nop");
SDA=1;
asm("nop");
asm("nop");
asm("nop");
SCL=0;
asm("nop");
asm("nop");
}
unchar check(void) // 检查应答信号
{
TRISC4=1;
SCL=0;
SCL=1;
if (SDA == 1)
{
ACK = 1;
}
else
{
ACK = 0;
}
SCL=0;
return(ACK);
}
void send(unchar data) // 发送一个字节
{
unchar bitcount=8; //发送8位
do
{
TRISC3=0; //置输出
TRISC4=0;
if((data&0x80)==0x80)
{
SDA=1; //发送 1
}
else
{
SDA=0; //发送 0
}
SCL=0; // 在时钟大于4u秒期间写数据
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
data=data<<1;
bitcount--;
} while(bitcount);
TRISC4=1 ; //释放总线等待应答
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
unchar recive(void) //接受一个字节
{
unchar temp1=0;
unchar bitcount1=8;
TRISC4=1; //置输入
TRISC3=0;
do
{ SCL=0; //在时钟大于4u秒期间读数据
SCL=1;
asm("nop");
asm("nop");
if(SDA) //读 1
{
temp1=temp1|0x01;
}
else //读 0
{
temp1=temp1&0xfe;
}
SCL=0;
if(bitcount1-1)
{
temp1=temp1<<1;
}
bitcount1--;
}while(bitcount1);
return(temp1);
}
void ack(void) //发送继续读信号
{
SDA=0;
SCL=0;
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
}
void nack(void) //停止继续读
{
SDA=1;
SCL=0;
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
}
void wrtoROM(unchar *data,unint address,unchar num) //给24LC256写数据
{ unint i;
unint adrl=address%256; //低8位地址
unint adrh=address/256; //高8位地址
start(); //起始信号
send(0xa2); //写主控器识别地址,本人是a2
do{;
}while(check()); //等待应答
send(adrh); //送数据高8位地址
do{;
}while(check()); //等待应答
send(adrl); //送数据低8位地址
do
{
;
}while(check()); //等待应答
for(i=0;i<num;i++,data++)
{
send(*data); //发送数据
do{;
}while(check()); //等待应答
}
stop(); //停止
delay(); //延时,下次发数据
}
void rdfromROM(unchar *pdata,unint address,unchar num2) //从24LC256中读数据
{ unint adrl;
unint adrh;
unchar j;
for(j=0;j<num2;j++,pdata++)
{
adrl=address%256; //地址低位
adrh=address/256; //地址高位
start(); //开始
send(0xa2); //写主控器识别地址(写),本人是a2
do{
;
}while(check()); //等待应答
send(adrh); //送高位
do
{
;
}while(check()); //等待应答
send(adrl); //送低位
do
{
;
}while(check()); //等待应答
start(); //开始读数据
send(0xa3); //写主控器识别地址(读)
do
{
;
}while(check()); //等待应答
*pdata=recive();
nack();
stop();
address=address+1; //指向下一个地址
}
}
main()
{ unint h,n;
unchar m;
unchar str[64]={0x5d,0x5d,0x32,0x18,0x6c,0x88,0xa0,0x1d,0x20,0x08};
SCL=1;
SDA=1;
PORTD=0XFF;
TRISD=0;
for(n=0;n<256;)
{
wrtoROM(str,n,64); //写一页的数据,根据24LC256一页是64个字节
n=n+64; //写下一页数据
}
for(h=0;h<64;h++) //数组清0
{
str[h]=0x21;
}
delay();
rdfromROM(str,0x02,64); //读从地址0开始的一页数据
while(1)
{
for(m=0;m<64;m++)
{
PORTD=str[m];
delay();
PORTD=0XFF;
delay();
}
}
}
热心网友
时间:2023-11-28 05:54
呵呵 对不住 才发现57没有IIC模块
所以只能软件模拟了
你看看 行不行 因为我没有硬件
软件是编译通过了没有问题
这只是一个测试程序 没有实际什么用处
# include<pic.h>
# define uchar unsigned char
# define uint unsigned int
# define sda RC1
# define scl RC0
void delay()
{ ;; }
void start() //开始信号
{
TRISC =~(1<<1);
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止信号
{
TRISC =~(1<<1); //置输出
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //应答检测
{
uchar i;
TRISC =(1<<1);//设置为输入
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void sendresponse()//发送应答
{
TRISC =~(1<<1); //置输出
sda=0;
delay();
scl=1;
delay();
scl=0;
delay();
sda=1;
}
void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void write_byte(uchar dat)
{
uchar i,temp,d;
TRISC =~(1<<1); //置输出
temp=dat;
for(i=0;i<8;i++)
{
if((dat&0x80)==0x80)
d=1;
else
d=0;
scl=0;
delay();
sda=d;
delay();
scl=1;
delay();
temp=temp<<1;
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte()
{
uchar i,k;
TRISC =(1<<1);//设置为输入
scl=0;
delay();
sda=1;//释放数据总线
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
void main(void)
{
char a,b;
TRISC =~(1<<0);
TRISC =~(1<<1); //置输出
sda=1;
delay();
scl=1;
delay();
start();
write_byte(0xa0);
respons();
write_byte(1);//写入地址值0x01
respons();
write_byte(0x0f);//在器件0x01处写入0x0f
respons();
write_byte(0x33);//在器件0x02处写入0x33
respons();
stop();
delay1(100);
start();
write_byte(0xa0);//写
respons();
write_byte(1);//写地址
respons();
start();
write_byte(0xa1);//读
respons();
a=read_byte();
sendresponse();
b=read_byte();
stop();
PORTB=a;
while(1);
}
热心网友
时间:2023-11-28 05:55
试一下这个,灯接在p1.2,按键接在p3.3
ORG 00H;
MOV P3,#0FFH ;
SETB P1.2 ;
START:JNB P3.3,TT0;
AJMP START ;
TT0:LCALL D1MS ;
JNB P3.3,TT0;
CPL P1.2;
AJMP START;
D1MS: MOV R7, #10 ;
D1:MOV R6, #250;
DJNZ R6,$;
DJNZ R7,D1 ;
RET ;
END
热心网友
时间:2023-11-28 05:55
楼上不要误导别人
PIC单片机编程的问题 刚学 不太懂
ERRORLEVEL -302 ; 编译输出结果中不要显示message cblock 0x20 ; 通用变量定义从该地址开始 W_TEMP ; 中断服务程序用来临时保存W和STATUS STATUS_TEMP FLAGS ; 程序要使用的状态标志寄存器 PWM_HIGH:2 ; 新的PWM高电平时间,保留两个字节 PWM_LOW:2 ; 新的PWM低电平时间,保留两个字节 PWM_HIGH_CURRENT:2...
pic单片机的eeprom问题
其原型是EEPROM_WRITE(addr, value),EEPROM_READ(addr)你要知道PICC包含什么头文件最好打开头文件的文件夹 路径是HI-TECH Software\PICC\lite\9.60\include 打开pic.h可以看到里面的内容 PICC包含pic1687x.h,这个看编译器而定,MPLAB本身没有这个头文件 ...
一般单片机的小程序如何收费
如果关系好,就收几百就可以了 关系一般的就上千吧 尽管对坐技术的人来说,这个项目不难 但想想卖一个热风枪的利润就有好几百,卖几个就可以支付软件开发了 所以你要按市场来定价,不要按技术的难易程度来定
PIC12C508 PIC10F200 系列单片机可以烧写几次程序??
PIC12C508A,DataSheet说,1,000,000次。PIC10F200, DataSheet说, 100,000次。调试程序绰绰有余啊。您在没有下载该芯片资料之前,就敢下刀子划拉了啊?厉害!
怀疑PIC单片机丝印被改了型号,如何签别真伪。
microchip官方的烧写器具有读器件ID功能,如果ID是一样的,应该是同一款器件.可用官方的烧写器(如ICD2/ICD3/PICKIT2/PICKIT3)读器件来识别是否正常。
拿到单片机开发板后,该如何开始学习?
看别人的程序。不过郭天祥《十天学会单片机》教程到时可以学习学习。建议入门的时候用C语言来编程,或者16位的AVR,然后学PIC,真正要学的:电脑一台。对于初学者,如学号51单片机,而且不占用多少内存空间,看资料,DSP,非常好用、如果愿意下功夫、软件,就去学汇编,还可以装一个 mutism仿真软件。此外。 Keil C51 3版本...
跪求!18F4520单片机 通过PICkit 2连接 然后用mplab烧入 没反应!_百度...
RB6和RB7是程序下载口,程序下载时会有变化的,IO输出最好用LATB,PIC单片机复位后复用口默认为模拟量的,必须设置为数字口,才可以,我看了你的配置是正确的,看一下看门狗是否关闭和晶振配置位选择是否正确
【求助】本人想往单片机研发方面发展
现在要学习的是暂时抛开内部结构原理不谈,如何能用单片机写一些简单的小程序,是从实用性的角度出发,网上有一种说法称之为先实践后理论的学习方法。因此我的观点如下,单片机的硬件结构首先要有一个基本的了解,最起码要知道各引脚的功能、区别,能自己动手搭一个单片机的最小系统,然后就可以直接从程序...
单片机工作总结
然后可以参考已经成功的程序,抄过来,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX,刷进单片机中、运行。 我的英文得到了提高,自己也爱上了单片机,...
单片机8位和16位是怎么区分的
是总线宽度决定的,8位单片机也可以寻址16位的地址,但是每次只能处理8位字长的数据,原来16位的应用用现在8位的来代替是完全可以的,因为现在8位的处理能力已经比以前要强好几倍了,程序上面如果是C编写的,移植起来比较容易。如果是汇编的,需要很大改动,还不如只继承算法,重新写程序。